

# 连接到 Google Sheets
<a name="connecting-to-googlesheets"></a>

 Google Sheets 是一款在线电子表格软件，可让您整理大量数据、创建自定义报告、自动执行计算以及与其他人协作。如果您是 Google Sheets 用户，则可以将 AWS Glue 连接到自己的 Google Sheets 账户。然后，可以将 Google Sheets 作为 ETL 作业中的数据来源。通过运行这些作业，可在 Google Sheets 与 AWS 服务或其他受支持的应用程序之间传输数据。

**Topics**
+ [AWS Glue 对 Google Sheets 的支持](googlesheets-support.md)
+ [包含创建和使用连接的 API 操作的策略](googlesheets-configuring-iam-permissions.md)
+ [配置 Google Sheets](googlesheets-configuring.md)
+ [配置 Google Sheets 连接](googlesheets-configuring-connections.md)
+ [从 Google Sheets 实体读取内容](googlesheets-reading-from-entities.md)
+ [Google Sheets 连接选项](googlesheets-connection-options.md)
+ [为 Google Sheets 设置授权码 OAuth 流](googlesheets-oauth-authorization.md)
+ [Google Sheets 连接器的限制](googlesheets-connector-limitations.md)

# AWS Glue 对 Google Sheets 的支持
<a name="googlesheets-support"></a>

AWS Glue 对 Google Sheets 的支持如下：

**是否支持作为来源？**  
是。您可以使用 AWS Glue ETL 作业查询 Google Sheets 中的数据。

**是否支持作为目标？**  
否。

**支持的 Google Sheets API 版本**  
 Google Sheets API v4 和 Google Drive API v3 

# 包含创建和使用连接的 API 操作的策略
<a name="googlesheets-configuring-iam-permissions"></a>

 以下示例策略描述了创建和使用连接所需的 AWS 权限。如果您要创建新角色，请创建包含以下内容的策略：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:ListConnectionTypes",
        "glue:DescribeConnectionType",
        "glue:RefreshOAuth2Tokens",
        "glue:ListEntities",
        "glue:DescribeEntity"
      ],
      "Resource": "*"
    }
  ]
}
```

------

您还可以使用以下托管 IAM 策略允许访问权限：
+  [AWSGlueServiceRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole)：授予对各种 AWS Glue 进程代表您运行所需的资源的访问权限。这些资源包括 AWS Glue、Amazon S3、IAM、CloudWatch Logs 和 Amazon EC2。如果您遵循此策略中指定的资源的命名约定，则 AWS Glue 进程具有所需的权限。此策略通常附加到在定义爬网程序、作业和开发终端节点时指定的角色。
+  [AWSGlueConsoleFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess)：当策略所附加到的身份使用 AWS 管理控制台时，授予对 AWS Glue 资源的完全访问权限。如果遵循此策略中指定的资源的命名约定，则用户具有完全控制台功能。此策略通常附加到 AWS Glue 控制台的用户。

# 配置 Google Sheets
<a name="googlesheets-configuring"></a>

您必须满足以下要求，才能使用 AWS Glue 从 Google Sheets 传出数据：

## 最低要求
<a name="googlesheets-configuring-min-requirements"></a>
+ 您拥有一个 Google Sheets 账户，以及电子邮件地址和密码。
+  您的 Google Sheets 账户已启用 API 访问权限。对 Google Sheets API 的所有使用均无需额外付费。
+  您的 Google Sheets 账户允许您安装连接的应用程序。如果您无法使用此功能，请联系您的 Google Sheets 管理员。

 如果满足这些要求，就可以将 AWS Glue 连接到 Google Sheets 账户。

# 配置 Google Sheets 连接
<a name="googlesheets-configuring-connections"></a>

要配置 Google Sheet 连接，请执行以下操作：

1. 在 AWS Secrets Manager 中，创建一个包含以下详细信息的密钥：

   1.  对于 AuthorizationCode 授权类型：
      +  对于客户托管的关联应用程序：密钥应包含关联应用程序的消费者密钥，并将 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET` 作为键。

1. 在 AWS Glue Glue Studio 中，按照以下步骤在**数据连接**下创建连接：

   1. 选择**数据来源**时，请选择 Google Sheets。

   1. 提供 Google Sheets 环境。

      1.  在 AWS Glue 中选择您要用于此连接的 `secretName`，然后放置令牌。

      1.  如果要使用网络，请选择网络选项。

1.  向与您的 AWS Glue 作业关联的 IAM 角色授予读取 `secretName` 的权限。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "secretsmanager:DescribeSecret",
           "secretsmanager:GetSecretValue",
           "secretsmanager:PutSecretValue",
           "ec2:CreateNetworkInterface",
           "ec2:DescribeNetworkInterfaces",
           "ec2:DeleteNetworkInterface"
         ],
         "Resource": "*"
       }
     ]
   }
   ```

------

 **AUTHORIZATION\$1CODE 授权类型** 

 此授权类型被视为“三足型”OAuth，因为它依赖于将用户重定向到第三方授权服务器来对用户进行身份验证。它用于通过 AWS Glue 控制台创建连接。AWS Glue 控制台会将用户重定向到 Google Sheets，用户必须登录并向 AWS Glue 授予所请求的权限，以便访问其 Google Sheets 实例。

 用户可以选择在 Google Sheets 中创建自己的关联应用程序，并在通过 AWS Glue 控制台创建连接时，提供自己的客户端 ID 和客户端密钥。在这种情况下，他们仍会重定向到 Google Sheets，以便登录并授权 AWS Glue 访问其资源。

 此授权类型会生成刷新令牌和访问令牌。访问令牌的有效期很短，可以通过刷新令牌在不需要用户干预的情况下自动刷新。

 有关为授权码 OAuth 流创建关联应用程序的公共 Google Sheets 文档，请参阅[创建访问凭据](https://developers.google.com/workspace/guides/create-credentials)。

# 从 Google Sheets 实体读取内容
<a name="googlesheets-reading-from-entities"></a>

 **先决条件** 
+  要从中读取内容的 Google 电子表格。需要电子表格的 SpreadSheet ID 和 tabName。

 **Google Sheets 实体和字段详细信息：**


| 实体 | 数据类型 | 支持的运算符 | 
| --- | --- | --- | 
| 电子表格 | 字符串 | N/A（不支持筛选） | 

 **示例** 

```
googleSheets_read = glueContext.create_dynamic_frame.from_options(
    connection_type="googlesheets",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "{SpreadSheetID}#{SheetTabName}",
        "API_VERSION": "v4"
    }
```

 **对查询进行分区** 

 仅对于基于记录的分区，如果想在 Spark 中利用并发性，可以将 `NUM_PARTITIONS` 作为附加 Spark 选项。使用此参数，原始查询将被拆分为 `NUM_PARTITIONS` 个子查询，这些子查询可以由 Spark 任务同时执行。

 **使用 `NUM_PARTITIONS` 的示例** 

```
googlesheets_read = glueContext.create_dynamic_frame.from_options(
    connection_type="googlesheets",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "{SpreadSheetID}#{SheetTabName}",
        "API_VERSION": "v4",
        "NUM_PARTITIONS": "10"
    }
```

# Google Sheets 连接选项
<a name="googlesheets-connection-options"></a>

Google Sheets 的连接选项如下：
+  `ENTITY_NAME`（字符串）：（必填）用于读取。Google Sheets 中的 `SpreadSheet ID` 和 `sheetTabName`。示例：`{SpreadSheetID}#{SheetTabName}`。
+  `API_VERSION`（字符串）：（必填）用于读取。要使用的 Google Sheets Rest API 版本。
+  `SELECTED_FIELDS`（列表<字符串>）–默认：empty(SELECT \$1)。用于读取。您想要为对象选择的列。
+  `FILTER_PREDICATE`（字符串）– 默认：空。用于读取。应采用 Spark SQL 格式。
+  `QUERY`（字符串）– 默认：空。用于读取。完整的 Spark SQL 查询。
+  `NUM_PARTITIONS`（整数）– 默认：1。用于读取。要读取的分区数。

# 为 Google Sheets 设置授权码 OAuth 流
<a name="googlesheets-oauth-authorization"></a>

 **先决条件** 
+  您可以在登录后使用 Google Sheets 应用程序的 Google 账户。在您的 Google 账户中，Google Sheets 已包含要传输的数据。
+  一个 Google Cloud Platform 账户和 Google Cloud 项目。有关更多详细信息，请参阅 [Create Google Cloud Project](https://developers.google.com/workspace/guides/create-project)。

**要设置 Google 账户并获取 OAuth 2.0 凭证，请按以下步骤操作：**

1.  设置好 Google Cloud 项目后，在该项目中启用 Google Sheets API 和 Google Drive API。有关启用步骤，请参阅 Google Cloud Platform 的 API Console 帮助中的 [Enable and disable APIs](https://support.google.com/googleapi/answer/6158841)。

1.  然后为外部用户配置 OAuth 同意屏幕。有关 OAuth 同意屏幕的更多信息，请参阅 Google Cloud Platform Console 帮助中心中的 [Setting up your OAuth consent screen](https://support.google.com/cloud/answer/10311615#)。

1.  在 OAuth 同意屏幕中，添加以下范围：
   +  [Google Sheets API 只读范围](https://www.googleapis.com/auth/spreadsheets.readonly) 
   +  [Google Drive API 只读范围](ttps://www.googleapis.com/auth/drive.readonly) 

    有关这些范围的更多信息，请参阅 Google Identity 文档中的 [OAuth 2.0 Scopes for Google APIs](https://developers.google.com/identity/protocols/oauth2/scopes)。

1.  生成 OAuth 2.0 客户端 ID 和密钥。有关创建此客户端 ID 的步骤，请参阅 Google Cloud Platform Console 帮助中的 [Setting up OAuth 2.0](https://support.google.com/cloud/answer/6158849?hl=en#zippy=)。

    OAuth 2.0 客户端 ID 必须有一个或多个经过授权的重定向 URL。

    重定向 URL 采用以下格式：
   + https://<aws-region>.console.aws.amazon.com/gluestudio/oauth 

1.  记下 OAuth 2.0 客户端 ID 设置中的客户端 ID 和客户端密钥。

# Google Sheets 连接器的限制
<a name="googlesheets-connector-limitations"></a>

以下是 Google Sheets 连接器的限制：
+  Google Sheets 连接器不支持筛选条件。因此，不支持基于筛选条件的分区。
+  在基于记录的分区中，未要求按 SAAS 返回确切的记录数。因此，在某些情况下，可能会创建记录为空的文件。
+  由于 Google Sheets 连接器不支持基于筛选条件的分区，`partitionField`、`lowerbound` 和 `upperbound` 不是有效的连接选项。如果提供了这些选项，预计 AWS Glue 作业会失败。
+  必须将工作表的第一行指定为标题行，以避免出现数据处理问题。
  +  如果未提供，则工作表包含第一行为空的数据时将标题行替换为 `Unnamed:1`、`Unnamed:2`、`Unnamed:3`...。
  +  如果提供了标题行，则空列名将替换为 `Unnamed:<number of column>`。例如，如果标题行为 `['ColumnName1', 'ColumnName2', '', '', 'ColumnName5', 'ColumnName6']`，它将变为 `['ColumnName1', 'ColumnName2', 'Unnamed:3', 'Unnamed:4', 'ColumnName5', 'ColumnName6'].` 
+  Google Sheets 连接器不支持增量传输。
+  Google Sheets 连接器仅支持字符串数据类型。
+  工作表中的重复标题将使用数字后缀迭代重命名。重命名重复的标题时，用户提供的标题名称将优先。例如，如果标题行是 ["Name", "", "Name", null, "Unnamed:6", ""]，它将更改为：["Name", "Unnamed:2", "Name1", "Unnamed:4", "Unnamed:6", "Unnamed:61"]。
+  Google Sheets 连接器不支持 tabName 中的空格。
+  文件夹名称不能包含下面的特殊字符：
  + \$1
  + /