透過 Google 試算表觸發工作流程


Google 試算表是雲端試算表解決方案,支援即時協作,並提供可視化、處理及傳達資料的工具。

本教學課程將示範如何透過試算表觸發工作流程。

目標

在這個教學課程中,您將執行下列操作:

  1. 使用 Google 表單 (雲端問卷和問卷調查解決方案) 建立表單,以便提交建立虛擬機器 (VM) 執行個體的要求。
  2. 將 Google 試算表試算表連結至表單,即可收集及儲存所有回覆。
  3. 使用 Google Apps Script,這個雲端式 JavaScript 平台可讓您以程式輔助方式建立、讀取及編輯 Google Workspace 產品,並在透過試算表更新核准要求時觸發工作流程。
  4. 部署會呼叫 Compute Engine API 連接器的工作流程,並根據透過表單收集到的規格建立 Compute Engine VM 執行個體。連接器可簡化對其他 API 的呼叫。 Google Cloud進一步瞭解 Workflows 連接器
  5. 測試整個程序,確認 VM 執行個體是否如預期建立。

費用

In this document, you use the following billable components of Google Cloud:

To generate a cost estimate based on your projected usage, use the pricing calculator. New Google Cloud users might be eligible for a free trial.

本教學課程也使用 Google Workspace。企業級服務不在 Google 免費版消費者應用程式中提供,因此需要付費。

事前準備

您可以在 Google Cloud 控制台中執行下列部分指令,也可以在終端機或 Cloud Shell 中使用 Google Cloud CLI。

貴機構定義的安全性限制,可能會導致您無法完成下列步驟。如需疑難排解資訊,請參閱「在受限的 Google Cloud 環境中開發應用程式」。

主控台

  1. 在 Google Cloud 主控台的專案選擇器頁面中,選取或建立 Google Cloud 專案

    前往專案選取器

  2. 請確認您已為 Google Cloud 專案啟用計費功能。瞭解如何檢查專案是否已啟用計費功能

  3. 啟用 Compute Engine 和 Workflows API。

    啟用 API

  4. 請記下 Compute Engine 預設服務帳戶,因為您會將其與本教學課程中的工作流程建立關聯,以便進行測試。啟用 Compute Engine API 的新專案會透過 IAM 基本編輯者角色建立這個服務帳戶,電子郵件格式如下:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    您可以在 Google Cloud 控制台的「歡迎」頁面中找到專案編號。

    對於實際環境,我們強烈建議建立新的服務帳戶,並授予一或多個包含必要最低權限的 IAM 角色,並遵循最低權限原則。

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 請確認您已為 Google Cloud 專案啟用計費功能。瞭解如何檢查專案是否已啟用計費功能

  3. 啟用 Compute Engine 和 Workflows API。

    gcloud services enable \
        compute.googleapis.com \
        workflows.googleapis.com
  4. 請記下 Compute Engine 預設服務帳戶,因為您會將其與本教學課程中的工作流程建立關聯,以便進行測試。啟用 Compute Engine API 的新專案會透過 IAM 基本編輯者角色建立這個服務帳戶,電子郵件格式如下:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    您可以透過下列方式取得專案編號:

    gcloud projects describe PROJECT_ID

    對於實際環境,我們強烈建議建立新的服務帳戶,並授予一或多個包含必要最低權限的 IAM 角色,並遵循最低權限原則。

建立表單以要求 VM 執行個體

建立可用來提交建立 Compute Engine 虛擬機器 (VM) 執行個體要求的表單。根據預設,透過 Google 表單建立的表單會儲存在 Google 雲端硬碟中。

  1. 前往 forms.google.com
  2. 按一下「空白」圖示 Plus

    系統隨即會開啟新表單。

  3. 建立包含五個必填欄位的表單。表單應如下所示:

    查看範例表單

    要求建立 Google Cloud 虛擬機器的表單範例
    機器名稱

    簡答文字

    可用區

    下拉式選單:

    1. us-central1-a
    2. us-central1-b
    3. us-central1-c
    4. us-central1-f
    類型

    下拉式選單:

    1. e2-micro
    2. e2-small
    3. e2-medium
    4. e2-standard-2
    5. e2-standard-4
    磁碟大小 (GB)

    簡答文字

    作業系統

    下拉式選單:

    1. debian-10
    2. centos-stream-9
    3. cos-93-lts
    4. cos-97-lts
  4. 啟用電子郵件收集功能,記錄表單填寫者的電子郵件地址:
    1. 按一下「設定」
    2. 展開「Responses」部分。
    3. 按一下「收集電子郵件地址」切換鈕。

建立表單後,請將試算表連結至表單,以便將表單回覆儲存在該試算表中。系統會將產生的試算表儲存在 雲端硬碟

  1. Google 表單中開啟表單。
  2. 按一下 [回覆]。
  3. 按一下「連結至試算表」
  4. 在「選取回應目標位置」對話方塊中,選取「建立新試算表」
  5. 按一下 [建立]。

    連結的試算表隨即開啟。

  6. H 欄中新增「Approved?」標題。

  7. 將游標放在 H 欄的第一列,然後選取「插入」>「核取方塊」

    試算表應類似下圖:

    收集要求的連結試算表範例

    每次在試算表中更新回覆時,該回覆的資料列也會顯示核取方塊。

使用 Apps Script 擴充 Google 試算表

您可以透過程式輔助方式,使用 Apps Script 建立、讀取及編輯試算表。大部分的試算表指令碼都會操控陣列,以便與試算表中的儲存格、列和欄互動。如要瞭解如何搭配試算表使用 Apps Script,請參閱自訂函式快速入門

  1. 透過 Google 試算表建立 Apps Script 專案:

    1. 開啟 Google 試算表試算表。
    2. 依序選取「擴充功能」>「Apps Script」
    3. 在指令碼編輯器中,按一下「未命名專案」
    4. 為專案命名,然後按一下「重新命名」

    指令碼現在已繫結至試算表,因此可變更使用者介面,或在試算表開啟時回應。

    指令碼專案代表 Apps Script 檔案和資源的集合。指令碼專案中的程式碼檔案會使用 .gs 副檔名。

  2. 你可以使用 Apps Script 編寫自訂函式,並在 Google 試算表中使用這些函式,就像內建函式一樣。自訂函式是使用標準 JavaScript 建立。建立函式:

    1. 開啟 Apps Script 專案。
    2. 按一下「編輯器」圖示
    3. 指令碼檔案會顯示為名為 Code.gs 的專案檔案。如要編輯檔案,請選取該檔案。
    4. 將指令碼編輯器中的任何程式碼替換為下列程式碼,這段程式碼會讀取試算表中的資料,並將資料傳遞為工作流程執行作業的輸入內容:

      const PROJECT_ID = "your-project-id";
      const REGION = "us-central1";
      const WORKFLOW = "create-vm-from-form";
      
      function handleEdit(e) {
        var range = e.range.getA1Notation();
        var sheet = e.source;
      
        if (range.length > 1 && range[0] === 'H') {
          if (e.value == "TRUE") {
            Logger.log("Approved checkbox: true");
      
            var row = range.slice(1)
            var email = sheet.getRange('B' + row).getCell(1, 1).getValue()
            var vmName = sheet.getRange('c' + row).getCell(1, 1).getValue()
            var zone = sheet.getRange('D' + row).getCell(1, 1).getValue()
            var machineType = sheet.getRange('E' + row).getCell(1, 1).getValue()
            var diskSize = sheet.getRange('F' + row).getCell(1, 1).getValue()
            var imageFamily = sheet.getRange('G' + row).getCell(1, 1).getValue()
            var imageProject = imageFamily.substring(0, imageFamily.indexOf('-')) + "-cloud"
      
            const executionPayload = {
              "argument": "{\"diskSize\": \"" + diskSize + "\", \"email\": \"" + email + "\", \"imageFamily\": \"" + imageFamily + "\", \"imageProject\": \"" + imageProject + "\", \"machineType\": \"" + machineType + "\", \"vmName\": \"" + vmName + "\", \"zone\": \"" + zone +  "\"}"
            };
      
            approve(executionPayload);
          }
          else {
            Logger.log("Approved checkbox: false");
          }
        }
      }
      
      function approve(executionPayload) {
        const headers = {
          "Authorization": "Bearer " + ScriptApp.getOAuthToken()
        };
      
        const params = {
          "method": 'post',
          "contentType": 'application/json',
          "headers": headers,
          "payload": JSON.stringify(executionPayload)
        };
      
        const url = "https://workflowexecutions.googleapis.com/v1/projects/" + PROJECT_ID + "/locations/" + REGION + "/workflows/" + WORKFLOW + "/executions";
      
        Logger.log("Workflow execution request to " + url);
        var response = UrlFetchApp.fetch(url, params);
        Logger.log(response);
      }
    5. your-project-id 替換為您的 Google Cloud 專案 ID。

      您可以在 Google Cloud 控制台的「歡迎」頁面中找到專案 ID。

    6. 按一下「儲存」圖示

  3. Apps Script 可安裝的觸發事件可讓指令碼專案在符合特定條件 (例如開啟或編輯試算表) 時執行指定函式。建立觸發條件:

    1. 開啟 Apps Script 專案。
    2. 按一下「觸發條件」圖示
    3. 按一下「新增觸發條件」
    4. 在「Add Trigger for YOUR_PROJECT_NAME」對話方塊中,設定觸發條件:
      1. 在「Choose which function to run」(選擇要執行的函式) 清單中,選取「handleEdit」
      2. 在「Choose which deployment should run」(選擇要執行的部署作業) 清單中,選取「Head」
      3. 在「Select event source」清單中,選取「From spreadsheet」
      4. 在「Select event type」(選取事件類型) 清單中,選取「On edit」(編輯時)。
      5. 在「失敗通知設定」清單中,選取「通知我每天一次」
    5. 按一下 [儲存]
    6. 如果系統提示您選擇 Google 帳戶,請選取適當的帳戶,然後按一下「允許」

      這樣一來,您的 Apps 指令碼專案就能查看、編輯、建立及刪除 Google 試算表試算表,以及連線至外部服務。

  4. Apps Script 專案資訊清單檔案是指指定 Apps Script 執行指令碼時所需的基本專案資訊的 JSON 檔案。請注意,Apps Script 編輯器預設會隱藏資訊清單檔案,以保護您的 Apps Script 專案設定。編輯資訊清單檔案:

    1. 開啟 Apps Script 專案。
    2. 按一下「Project Settings」圖示
    3. 勾選「在編輯器中顯示『appsscript.json』資訊清單檔案」核取方塊。
    4. 按一下「編輯器」圖示
    5. 資訊清單檔案會顯示為名為 appsscript.json 的專案檔案。選取檔案即可編輯。
    6. oauthScopes 欄位會指定字串陣列。如要設定專案使用的授權範圍,請新增要支援的範圍陣列。例如:

      {
        "timeZone": "America/Toronto",
        "dependencies": {
        },
        "exceptionLogging": "STACKDRIVER",
        "runtimeVersion": "V8",
        "oauthScopes": [
          "https://www.googleapis.com/auth/script.external_request",
          "https://www.googleapis.com/auth/cloud-platform",
          "https://www.googleapis.com/auth/spreadsheets"
        ]
      }

      這會將明確的範圍設為:

      • 連線至外部服務
      • 查看、編輯、設定及刪除您的 Google Cloud 資料,以及查看您 Google 帳戶的電子郵件地址
      • 查看、編輯、建立及刪除您的所有 Google 試算表檔案
    7. 按一下「儲存」圖示

部署可建立 VM 執行個體的工作流程

部署工作流程,在建立 VM 執行個體的要求獲得核准時觸發。工作流程會呼叫 Compute Engine API 連接器,根據透過表單收集到的規格建立 Compute Engine VM 執行個體。

控制台

  1. 前往 Google Cloud 控制台的「Workflows」頁面:

    前往「Workflows」頁面

  2. 按一下「建立」

  3. 輸入新工作流程的名稱:create-vm-from-form

  4. 在「Region」(區域) 清單中,選取「us-central1 (Iowa)」(us-central1 (愛荷華州))

  5. 在「服務帳戶」中,選取 Compute Engine 預設服務帳戶 (PROJECT_NUMBER-compute@developer.gserviceaccount.com)。

  6. 點按「Next」

  7. 在工作流程編輯器中,輸入工作流程的定義:

    main:
       params: [input]
       steps:
       - init:
           assign:
                - projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                - zone: ${input.zone}
                - machineType: ${input.machineType}
                - diskSize: ${input.diskSize}
                - imageProject: ${input.imageProject}
                - imageFamily: ${input.imageFamily}
                - vmName: ${input.vmName}
                - email: ${input.email}
       - createResource:
           call: googleapis.compute.v1.instances.insert
           args:
               project: ${projectId}
               zone: ${zone}
               body:
                   name: ${vmName}
                   machineType: ${"projects/" + projectId + "/zones/" + zone + "/machineTypes/" + machineType}
                   disks:
                    - initializeParams:
                        diskSizeGb: ${diskSize}
                        sourceImage: ${"projects/" + imageProject + "/global/images/family/" + imageFamily}
                      type: PERSISTENT
                      boot: true
                      autoDelete: true
                   networkInterfaces:
                    - network: "global/networks/default"
           result: insertResult
       - retStep:
           return: ${insertResult}
  8. 按一下 [Deploy] (部署)

gcloud

  1. 建立工作流程的原始碼檔案:

    touch create-vm-from-form.yaml
  2. 在文字編輯器中,將下列工作流程複製到原始碼檔案:

    main:
       params: [input]
       steps:
       - init:
           assign:
                - projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                - zone: ${input.zone}
                - machineType: ${input.machineType}
                - diskSize: ${input.diskSize}
                - imageProject: ${input.imageProject}
                - imageFamily: ${input.imageFamily}
                - vmName: ${input.vmName}
                - email: ${input.email}
       - createResource:
           call: googleapis.compute.v1.instances.insert
           args:
               project: ${projectId}
               zone: ${zone}
               body:
                   name: ${vmName}
                   machineType: ${"projects/" + projectId + "/zones/" + zone + "/machineTypes/" + machineType}
                   disks:
                    - initializeParams:
                        diskSizeGb: ${diskSize}
                        sourceImage: ${"projects/" + imageProject + "/global/images/family/" + imageFamily}
                      type: PERSISTENT
                      boot: true
                      autoDelete: true
                   networkInterfaces:
                    - network: "global/networks/default"
           result: insertResult
       - retStep:
           return: ${insertResult}
  3. 輸入下列指令來部署工作流程:

    gcloud workflows deploy create-vm-from-form \
        --source=create-vm-from-form.yaml \
        --location=us-central1 \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com

    PROJECT_NUMBER 替換為您的 Google Cloud專案編號。您可以透過下列方式取得專案編號:

    gcloud projects describe PROJECT_ID

測試端對端流程

如要確認一切運作正常,請嘗試執行整個程序。

  1. 將表單傳送給自己,並回答相關問題。

    請確認用來建立 VM 執行個體的規格是否有效,否則工作流程執行作業會失敗。詳情請參閱 Compute Engine 通用機器系列

  2. 如要提交回覆,請按一下「提交」

  3. Google 表單中開啟表單。

  4. 按一下 [回覆]。

  5. 按一下「在試算表中查看」

    系統會開啟已連結的試算表。

  6. 在回覆的資料列中,勾選「已核准?」核取方塊。

  7. 開啟 Apps Script 專案。

  8. 按一下「執行」圖示

    觸發事件應已執行,並列出狀態為 Completed

  9. 確認 create-vm-from-form 工作流程已順利完成:

    主控台

    1. 前往 Google Cloud 控制台的「Workflows」頁面。

      前往「Workflows」頁面

    2. 在「Workflows」頁面中,按一下「create-vm-from-form」工作流程,前往該工作流程的詳細資料頁面。

    3. 在「工作流程詳細資料」頁面中,按一下適當的執行 ID,即可擷取特定執行作業的詳細資料。

      「Execution state」應為「Succeeded」,且在「Input」窗格中,您應該會看到所要求的 VM 規格。

    gcloud

    擷取工作流程執行嘗試清單:

    gcloud workflows executions list create-vm-from-form

    結果應類似於以下內容:

    NAME: projects/918619793306/locations/us-central1/workflows/create-vm-from-form/executions/d8947ecb-9ccb-4ea1-ba10-e5c10414e3be
    STATE: SUCCEEDED
    START_TIME: 2023-01-24T15:07:40.404741791Z
    END_TIME: 2023-01-24T15:07:55.649373625Z
  10. 確認新 VM 已如預期建立:

    主控台

    前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

    前往 VM 執行個體

    VM 執行個體應會列於清單中,並顯示執行中的狀態。

    gcloud

    擷取專案中所有區域的所有 VM 匯總清單:

    gcloud compute instances list

    VM 執行個體應會列於清單中,並顯示執行中的狀態。

    如要進一步瞭解 gcloud compute instances list 指令,請參閱其參考頁面

清除所用資源

如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有的專案,且希望保留該專案而不採用本教學課程中新增的變更,請刪除為教學課程建立的資源

刪除專案

如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。

如要刪除專案:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

刪除本教學課程中建立的資源

  1. 刪除雲端硬碟中的檔案
  2. 刪除 Compute Engine VM 執行個體
  3. 刪除工作流程

後續步驟