从 Google 表格触发工作流


Google 表格是一款基于云的电子表格解决方案,支持实时协作,并提供用于可视化、处理和传达数据的工具。

本教程演示了如何从 Google 表格触发 Workflows。

目标

在此教程中,您将学习以下操作:

  1. 使用Google 表单(一种基于云的调查问卷和调查解决方案)创建一个表单,以便用户提交创建虚拟机 (VM) 实例的请求。
  2. 将 Google 表格电子表格与表单相关联,以收集和保存所有回复。
  3. 使用 Google Apps 脚本(这是一个基于云的 JavaScript 平台,可让您以编程方式创建、读取和修改 Google Workspace 产品),以便在通过更新电子表格批准请求时触发工作流。
  4. 部署一个工作流,用于调用 Compute Engine API 连接器,并根据通过表单收集的规范创建 Compute Engine 虚拟机实例。连接器可简化对其他 Google Cloud API 的调用。详细了解 Workflows 连接器
  5. 测试整个过程,并确认虚拟机实例是否按预期创建。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 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 基本 Editor 角色创建此服务账号,并且电子邮件地址格式如下:

    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 基本 Editor 角色创建此服务账号,并且电子邮件地址格式如下:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    您可以通过以下方式检索项目编号:

    gcloud projects describe PROJECT_ID

    对于生产环境,我们强烈建议创建新的服务账号,并为其授予一个或多个 IAM 角色,这些角色包含所需的最小权限并遵循最小权限原则。

创建用于请求虚拟机实例的表单

创建一个表单,用于提交创建 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. 展开响应部分。
    3. 点击收集电子邮件地址切换开关。

创建表单后,请将电子表格与其相关联,以便将表单回复保存在该电子表格中。电子表格会保存在云端硬盘中。

  1. Google 表单中打开相应表单。
  2. 点击回复
  3. 点击关联到 Google 表格
  4. 选择回复的目标位置对话框中,选择创建新的电子表格
  5. 点击创建

    系统会打开关联的电子表格。

  6. H 列中,添加已批准?标题。

  7. 将光标放在 H 列的第一行,然后依次选择插入 > 复选框

    电子表格应类似如下所示:

    用于收集请求的已关联电子表格示例

    每当电子表格通过回答进行更新时,该回答对应的行中也会显示复选框。

使用 Apps 脚本扩展 Google 表格

借助 Apps Script,您可以以程序化方式创建、读取和修改 Google 表格。大多数专为 Google 表格设计的脚本都会操控数组,以便与电子表格中的单元格、行和列进行交互。如需了解如何将 Apps 脚本与 Google 表格搭配使用,请参阅自定义函数快速入门

  1. 通过 Google 表格创建 Apps 脚本项目:

    1. 打开您的 Google 表格电子表格。
    2. 依次选择扩展程序 > Apps 脚本
    3. 在脚本编辑器中,点击 Untitled project(无标题项目)。
    4. 为项目命名,然后点击重命名

    您的脚本现在已绑定到电子表格,这样一来,脚本便可以更改界面或在电子表格打开时做出响应。

    脚本项目表示一组 Apps 脚本文件和资源。脚本项目中的代码文件扩展名为 .gs

  2. 您可以使用 Apps 脚本编写自定义函数,并在 Google 表格中使用这些函数,就像使用内置函数一样。自定义函数是使用标准 JavaScript 创建的。创建函数:

    1. 打开您的 Apps 脚本项目。
    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 脚本可安装的触发器,脚本项目可以在满足特定条件(例如打开或修改电子表格)时执行指定函数。创建触发器:

    1. 打开您的 Apps 脚本项目。
    2. 点击触发器
    3. 点击添加触发器
    4. Add Trigger for YOUR_PROJECT_NAME 对话框中,配置触发器:
      1. 选择要运行的函数列表中,选择 handleEdit
      2. 选择要执行的部署列表中,选择主分支
      3. 选择事件来源列表中,选择从电子表格
      4. 选择事件类型列表中,选择修改时
      5. 失败通知设置列表中,选择每天通知我
    5. 点击保存
    6. 如果系统提示您选择 Google 账号,请选择相应的账号,然后点击允许

      这样,您的 Apps Script 项目便可以查看、修改、创建和删除您的 Google 表格电子表格,以及连接到外部服务。

  4. Apps Script 项目清单文件是一个 JSON 文件,用于指定 Apps Script 成功运行脚本所需的基本项目信息。请注意,Apps 脚本编辑器默认会隐藏清单文件,以保护您的 Apps 脚本项目设置。修改清单文件:

    1. 打开您的 Apps 脚本项目。
    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. 点击“保存”图标

部署用于创建虚拟机实例的工作流

部署一个工作流,在创建虚拟机实例的请求获得批准时触发该工作流。该工作流会调用 Compute Engine API 连接器,以根据通过表单收集的规范创建 Compute Engine 虚拟机实例。

控制台

  1. 在 Google Cloud 控制台中,前往 Workflows 页面:

    进入 Workflows

  2. 点击 创建

  3. 输入新工作流的名称:create-vm-from-form

  4. 区域列表中,选择 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. 点击部署

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. 将表单发送给自己,并妥善回答相关问题。

    确保您用于创建虚拟机实例的规范有效;否则,您的工作流执行将会失败。如需了解详情,请参阅 Compute Engine 通用机器系列

  2. 如需提交回复,请点击提交

  3. Google 表单中打开相应表单。

  4. 点击回复

  5. 点击在 Google 表格中查看

    系统会打开关联的电子表格。

  6. 在您的回复对应的行中,选中已批准?复选框。

  7. 打开您的 Apps 脚本项目。

  8. 点击执行

    您的触发器应会执行,并列出状态为 Completed

  9. 确认 create-vm-from-form 工作流已成功完成:

    控制台

    1. 在 Google Cloud 控制台中,前往工作流页面。

      进入 Workflows

    2. Workflows 页面上,点击 create-vm-from-form 工作流以转到其详情页面。

    3. 工作流详情页面上,如需检索特定执行的详细信息,请点击相应的执行 ID。

      执行状态应为已成功,并且您应在“输入”窗格中看到您请求的虚拟机规格。

    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. 确认新虚拟机已按预期创建:

    控制台

    在 Google Cloud 控制台中,前往虚拟机实例页面。

    进入“虚拟机实例”

    您的虚拟机实例应显示在列表中,并且状态显示为“正在运行”。

    gcloud

    检索项目的所有可用区中所有虚拟机的汇总列表:

    gcloud compute instances list

    您的虚拟机实例应显示在列表中,并且状态显示为“正在运行”。

    如需详细了解 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 虚拟机实例
  3. 删除工作流

后续步骤