从 Google 表格触发工作流


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

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

目标

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

  1. 使用基于云端的问卷调查解决方案 Google 表单创建表单,以便提交创建虚拟机 (VM) 实例的请求。
  2. 将 Google 表格电子表格与表单相关联,以收集并保存所有回答。
  3. 使用 Google Apps 脚本(一种基于云端的 JavaScript 平台,可让您以编程方式创建、读取和修改 Google Workspace 产品),在电子表格更新时触发工作流,以便在请求获得批准时触发工作流。
  4. 部署一个工作流,该工作流会调用 Compute Engine API 连接器,并根据通过表单收集的规范创建 Compute Engine 虚拟机实例。连接器可简化其他 Google CloudAPI 的调用。详细了解 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. 创建一个包含 5 个必填部分的表单。该表单应类似于以下内容:

    查看表单示例

    用于请求创建 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. 点击收集电子邮件地址切换开关。

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

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

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

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

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

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

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

    每次在工作表中添加回答时,相应回答的行中也会显示复选框。

使用 Apps 脚本扩展 Google 表格

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

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

    1. 打开您的 Google 表格电子表格。
    2. 依次选择扩展程序 > Apps 脚本
    3. 在脚本编辑器中,点击无标题项目
    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. 为 YOUR_PROJECT_NAME 添加触发器对话框中,配置触发器:
      1. 选择要运行的函数列表中,选择 handleEdit
      2. 选择要运行的部署列表中,选择 Head
      3. 选择活动来源列表中,选择来自电子表格
      4. 选择事件类型列表中,选择 On edit
      5. 失败通知设置列表中,选择每天通知我
    5. 点击保存
    6. 如果您收到选择 Google 账号的提示,请选择相应的账号,然后点击允许

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

  4. Apps 脚本项目的清单文件是一个 JSON 文件,用于指定 Apps 脚本成功运行脚本所需的基本项目信息。请注意,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. 表单中打开相应表单。

  4. 点击回复

  5. 点击在 Google 表格中查看

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

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

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

  8. 点击执行

    触发器应已执行,并列出,状态为 Completed

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

    控制台

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

      进入 Workflows

    2. 工作流页面上,点击 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. 删除工作流

后续步骤