从工作流写入 Google 表格

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

以下示例演示了如何从工作流写入 Google 表格。该工作流会查询 BigQuery 数据集,并将结果写入 Google 表格电子表格。它使用 Workflows 连接器来简化 API 的调用 Google Cloud 。

准备工作

在试用本文档中的示例之前,请确保您已完成以下操作。

  1. 启用 Compute Engine、Google 云端硬盘、Google 表格和 Workflows API。

    控制台

    启用 API

    gcloud

    gcloud services enable \
        compute.googleapis.com \
        drive.googleapis.com \
        sheets.googleapis.com \
        workflows.googleapis.com
  2. 记下 Compute Engine 默认服务账号 服务帐号,因为您将把它与示例工作流相关联以进行测试 。已启用 Compute Engine API 的新项目会创建此服务帐号,该账号具有 IAM 基本 Editor 角色,并且采用以下电子邮件格式:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    您可以在 控制台 的 Google Cloud 欢迎页面上找到项目编号,也可以检索项目编号:

    gcloud projects describe PROJECT_ID

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

  3. 在 Google 云端硬盘中创建一个新文件夹。此文件夹用于存储您的电子表格。通过为共享文件夹设置权限,您的工作流可以写入电子表格。

    1. 转到 drive.google.com
    2. 依次点击新建 > 新建文件夹
    3. 输入文件夹名称。
    4. 点击创建
    5. 右键点击新文件夹,然后选择共享
    6. 添加 Compute Engine 默认服务账号的电子邮件地址。

      这会授予服务帐号对该文件夹的访问权限。将服务帐号与工作流相关联后,工作流将拥有对该文件夹中任何文件的修改权限。 详细了解如何共享文件、文件夹和云端硬盘

    7. 选择编辑者 角色。

    8. 清除通知用户 复选框。

    9. 点击共享

创建电子表格

您可以通过以下任一方式创建电子表格:

无法使用 Google Sheets API 在指定文件夹中直接创建电子表格。 不过,您可以采用其他方法,包括在创建电子表格后将其移至特定文件夹,如以下示例所示。如需了解详情,请参阅 使用 Google 云端硬盘文件夹

使用 Google 表格创建电子表格

通过 Google 表格创建电子表格时,系统会将其保存在 Google 云端硬盘中。默认情况下,电子表格会保存到云端硬盘的根文件夹中。

  1. 转到 sheets.google.com

  2. 点击新建 Plus

    此操作会创建并打开您的新电子表格。每个电子表格都有一个唯一的 spreadsheetId值, 其中包含字母、数字、连字符或下划线。您可以在 Google 表格网址中找到电子表格 ID:

    https://docs.google.com/spreadsheets/d/spreadsheetId/edit#gid=0

  3. 记下此 ID,因为在创建工作流时需要用到它。

  4. 将电子表格移至您之前创建的 Google 云端硬盘文件夹:

    1. 在电子表格中,依次选择文件 > 移动
    2. 找到您创建的文件夹。
    3. 点击移动

使用 Google Sheets API 连接器创建电子表格

您可以使用 Google Sheets API 连接器 创建电子表格。由于 Workflows 使用服务帐号作为触发器身份,因此电子表格是在服务帐号的 Google 云端硬盘根文件夹中创建的。然后,您可以将电子表格移至其他文件夹。

在以下工作流中,spreadsheetId 是从 resp 结果中检索的:

YAML

main:
  steps:
    - init:
        assign:
          - folder_id: 'FOLDER_ID'
          - drive_url: 'https://www.googleapis.com/drive/v3/files/'
          - drive_auth_scope: 'https://www.googleapis.com/auth/drive'
    - create_sheet:
        call: googleapis.sheets.v4.spreadsheets.create
        args:
          body: null
          connector_params:
            scopes: 'https://www.googleapis.com/auth/drive'
        result: resp
    - get_sheet_info:
        call: http.get
        args:
          url: '${drive_url + resp.spreadsheetId}'
          query:
            fields: parents
          auth:
            type: OAuth2
            scopes: '${drive_auth_scope}'
        result: sheet_info
    - move_sheet:
        call: http.patch
        args:
          url: '${drive_url + resp.spreadsheetId}'
          query:
            addParents: