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


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

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

目標

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

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

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

本教學課程也會使用 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. 按一下「連結至 Google 試算表」
  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. 按一下「編輯器」圖示
    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」(為 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. 按一下「編輯器」圖示
    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. 點選「下一步」

  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 指令,請參閱參考頁面

清除所用資源

如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有專案,並想保留專案,但不要在本教學課程中新增的變更,請刪除為本教學課程建立的資源

刪除專案

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

如要刪除專案:

  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. 刪除工作流程

後續步驟