

# Google Sheets への接続
<a name="connecting-to-googlesheets"></a>

 Google Sheets は、大量のデータの整理、カスタムレポートの作成、計算の自動化、他のユーザーとのコラボレーションを可能にするオンラインスプレッドシートソフトウェアです。Google Sheets ユーザーの場合は、AWS Glue を Google Sheets アカウントに接続できます。その後、Google Sheets を ETL ジョブのデータソースとして使用できます。これらのジョブを実行して、Google Sheets と AWS サービス、またはその他のサポートされているアプリケーション間でデータを転送します。

**Topics**
+ [Google Sheets 用 AWS Glue サポート](googlesheets-support.md)
+ [接続を作成および使用するための API オペレーションを含むポリシー](googlesheets-configuring-iam-permissions.md)
+ [Google Sheets の設定](googlesheets-configuring.md)
+ [Google Sheet 接続の設定](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)

# Google Sheets 用 AWS Glue サポート
<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 Sheet 接続の設定
<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 Sheet 環境を指定します。

      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 のグラントタイプ** 

 このグラントタイプは、ユーザーを認証するためにサードパーティーの認証サーバーにユーザーをリダイレクトすることから、「three-legged」の OAuth と見なされます。AWS Glue コンソール経由で接続を作成するときに使用されます。AWS Glue コンソールでは、ユーザーが Google Sheets にリダイレクトされます。ここではユーザーがログインし、Google Sheets インスタンスにアクセスするためのリクエストされた権限を AWS Glue に許可する必要があります。

 ユーザーは、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 エンティティとフィールドの詳細** 


| エンティティ | データタイプ | サポートされている演算子 | 
| --- | --- | --- | 
| スプレッドシート | 文字列 | 該当なし (フィルタリングはサポートされていません) | 

 **例** 

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

 **パーティショニングクエリ** 

 レコードベースのパーティション分割の場合のみ、Spark で同時実行を使用する場合は、追加の Spark オプションとして `NUM_PARTITIONS` を指定できます。これらのパラメータを使用すると、元のクエリは spark タスクで同時に実行できるサブクエリの `NUM_PARTITIONS` の数に分割されます。

 **`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 の `sheetTabName` および `SpreadSheet ID`。例えば、`{SpreadSheetID}#{SheetTabName}` などです。
+  `API_VERSION`(文字列) – (必須) 読み取りに使用されます。使用する Google Sheets Rest の API バージョン。
+  `SELECTED_FIELDS`(List<String>) – Default: 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 プロジェクト。詳細については、「[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 コンソールヘルプの「[Enable and disable APIs](https://support.google.com/googleapi/answer/6158841)」を参照してください。

1.  次に、外部ユーザー用に OAuth 同意画面を設定します。OAuth 同意画面の詳細については、Google Cloud Platform コンソールヘルプの「[OAuth 同意画面の設定](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 ドキュメントの「[Google API の OAuth 2.0 スコープ](https://developers.google.com/identity/protocols/oauth2/scopes)」を参照してください。

1.  OAuth 2.0 クライアント ID およびシークレットを生成します。このクライアント ID を作成する手順については、Google Cloud Platform コンソールヘルプの「[Setting up OAuth 2.0](https://support.google.com/cloud/answer/6158849?hl=en#zippy=)」を参照してください。

    OAuth 2.0 クライアント ID には、1 つ以上の許可されたリダイレクト 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
  + /