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

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

本教學課程會示範如何從 Google 試算表觸發 Workflows。

建立要求 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 欄中新增「核准?」標題。

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

    試算表應類似以下內容:

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

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

使用 Apps Script 擴充 Google 試算表功能

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

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

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

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

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

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

    1. 開啟 Apps Script 專案。
    2. 按一下「Editor」(編輯器) 圖示
    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. 按一下「Save」(儲存) 圖示

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

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

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

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

    1. 開啟 Apps Script 專案。
    2. 按一下「專案設定」
    3. 勾選「在編輯器中顯示『appsscript.json』資訊清單檔案」核取方塊。
    4. 按一下「Editor」(編輯器) 圖示
    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. 按一下「Save」(儲存) 圖示

部署會建立 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. 點選「下一步」

  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. 按一下「在 Google 試算表中查看」

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

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

  7. 開啟 Apps Script 專案。

  8. 按一下「執行」

    觸發條件應會執行並列出,狀態為 Completed

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

    主控台

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

      前往「Workflows」頁面

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

    3. 在「Workflow details」(工作流程詳細資料) 頁面中,如要擷取特定執行的詳細資料,請按一下適當的執行 ID。

      「執行狀態」應為「成功」,且「輸入」窗格中應會顯示您要求的 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 指令,請參閱參考頁面