在 Google 表格中触发工作流


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

本教程演示如何从 表格。

目标

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

  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 API 和 Workflows API。

    启用 API

  4. 记下 Compute Engine 默认服务账号 因为您要将其与本教程中测试的工作流相关联 目的。已启用 Compute Engine API 的新项目 创建此服务账号 编辑者角色,并使用以下电子邮件地址格式:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    您可以在以下位置找到项目编号: 欢迎 页面

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

gcloud

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 确保您的 Google Cloud 项目已启用结算功能。 了解如何检查项目是否已启用结算功能

  3. 启用 Compute Engine API 和 Workflows API。

    gcloud services enable \
        compute.googleapis.com \
        workflows.googleapis.com
    
  4. 记下 Compute Engine 默认服务账号 因为您要将其与本教程中测试的工作流相关联 目的。已启用 Compute Engine API 的新项目 创建此服务账号 编辑者角色,并使用以下电子邮件地址格式:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    您可以检索项目编号:

    gcloud projects describe PROJECT_ID
    

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

创建表单以请求虚拟机实例

创建可用于提交创建请求的表单 Compute Engine 虚拟机 (VM) 实例。默认情况下,当您 通过 Google 表单创建表单后 Google 云端硬盘

  1. 前往 forms.google.com
  2. 点击空白 Plus.

    系统会打开一个新的表单。

  3. 创建一个包含五个必填部分的表单。表单应显示如下: 更改为以下代码: <ph type="x-smartling-placeholder"></ph>

    查看示例表单

    用于请求创建 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. 启用电子邮件收集功能即可记录 格式如下: <ph type="x-smartling-placeholder">
      </ph>
    1. 点击设置
    2. 展开响应部分。
    3. 点击收集电子邮件地址切换开关。

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

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

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

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

  7. 将光标置于 H 列的第一行,然后选择 插入 &gt; 复选框

    电子表格应如下所示:

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

    每次在工作表中更新回复时,系统还会显示复选框 。

使用 Apps 脚本扩展 Google 表格的功能

利用 Apps 脚本,您可以通过编程方式创建、读取和修改 表格。专为表格操作的大多数脚本 数组,与电子表格中的单元格、行和列进行交互。对于 有关在 Google 表格中使用 Apps 脚本的说明,请参阅 参阅自定义函数快速入门

  1. 在 Google 表格中创建 Apps 脚本项目:

    1. 打开您的 Google 表格电子表格。
    2. 依次选择扩展程序 &gt; Apps 脚本
    3. 在脚本编辑器中,点击未命名项目
    4. 为项目命名,然后点击重命名

    您的脚本现已绑定到电子表格, 使脚本能够更改用户界面或 并在打开电子表格后回复。

    一个脚本项目代表一组 Apps 脚本 文件和资源。脚本项目中的代码文件包含 .gs

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

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

  3. Apps 脚本 可安装的触发器 当出现特定条件时,允许脚本项目执行指定的函数 例如当电子表格被打开或编辑时。创建触发器:

    1. 打开您的 Apps 脚本项目。
    2. 点击触发器
    3. 点击添加触发器
    4. 为 YOUR_PROJECT_NAME 添加触发器对话框中,配置 触发器: <ph type="x-smartling-placeholder">
        </ph>
      1. 选择要运行的函数列表中,选择 handleEdit
      2. 选择应运行哪个部署列表中,选择 Head
      3. 选择事件来源列表中,选择来自电子表格
      4. 选择事件类型列表中,选择修改时
      5. 失败通知设置列表中,选择每天通知我
    5. 点击保存
    6. 如果系统提示您选择 Google 账号,请选择 账号,然后点击允许

      这样一来,您的 Apps 脚本项目就能够查看、修改、 创建和删除 Google 表格电子表格;并连接到 外部服务

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

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

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

部署一个工作流,创建虚拟机实例的请求 已批准。工作流会调用 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. 工作流程页面上,点击 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. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除在本教程中创建的资源

  1. 删除云端硬盘中的文件
  2. 删除 Compute Engine 虚拟机实例
  3. 删除工作流

后续步骤