Redash と Google Spreadsheet を連携する (2019年9月版)

以下の情報は、今日現在（2019/09/30）の情報になります。

Redash では Google Spreadsheet と連携することが可能です。
公式ドキュメントにも手順は記載されていますが ( https://redash.io/help/data-sources/querying/google-spreadsheet ) 、そちらの内容 +α をここでは書きます。

# 事前作業

- Google アカウントの用意
- Redash の用意
- Redash で読み込みたい Google Spreadsheet の用意
  - Team Drive 配下に置いた場合、 `v8.0.0-beta` 以降でないと読み込めない（後述） 

この辺は割愛。

# Google Compute Engine の Service Key を払い出し

Redash と Google Spreadsheet の連携には、 GCP から払い出した **Service Key** が必要です。

## API とサービス - 認証情報
https://console.cloud.google.com/apis/credentials

Google にログインした状態で上記ページにアクセスすると、Service Key の作成画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44364/496a811f-eed0-8b61-28e0-1583363f9a52.png)

事前に GCP の Project を作成していない場合は、上記画面から作成をし、Project を選択状態にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44364/98837225-c804-c795-712f-5fb9410fc1aa.png)

## 認証情報を作成

Service Key を作成する場合は、上記の画面上の**「認証情報を作成」**をクリックして、**「サービスアカウントキー」**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44364/5908e2aa-609f-4e61-6171-53bdff7ff51c.png)

## サービスアカウントキーの作成
作成画面でサービスアカウントを発行するプロジェクトを選択します。
キーのタイプは**「JSON」**を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44364/065cad13-b6aa-f965-6acc-ba3e8fa05a91.png)

この画面で作成ボタンを押下すると、Service Key 情報が含まれた JSON ファイルがダウンロードされます。こちらのファイルはとても大事で、セキュリティ的にも重要なので、他人が閲覧できないような場所に保存をしておきます。

# Google Spreadsheet の共有設定
上記で払い出した Service Key 経由で Google Spreadsheet がアクセスできるよう、共有設定を行います。

Google Spreadsheet 右上の**「共有」**ボタンを押下し、先程発行した Service Key の JSON ファイルに記載されている**「client_email」**を共有ユーザーとして登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44364/6920e161-e1b8-1282-996a-2066b76bdb4c.png)

これで、Service Key 経由で Google Spreadsheet にアクセスできるようになりました。

# Redash のデータソースの設定
引き続き、上記で払い出した Service Key の情報を、Redash の Data Source に設定します。

Redash には**「Google Spreadsheet」**データソースが存在するため、こちらを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44364/209455be-504c-de0c-7445-aed3fa8b2d0b.png)

設定項目は以下の２つです。

- Name 
  - 任意の名前を設定します。 
- JSON Key File
  - 上記で払い出した JSON ファイルをアップロードします。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44364/4d99060a-5541-47e0-bfad-5d1bf58a119c.png)

情報を入力して Save ボタンを押下すると、設定は完了です。「Test Connection」ボタンで正しく GCP と接続が行えるか、疎通確認も行えます。


# Redash からクエリー実行
Redash の Query 画面を開いて、Google Spreadsheet への連携を試みます。

Google Spreadsheet と連携する際は、クエリーは SQL ではなく、以下のような書式で記述します。

```
(Google Spreadsheet ID)|(Sheet Number)
```

**Google Spreadsheet ID** は、Spreadsheet の URL で記載されている英数字文字列です。
例として、公式ドキュメントに記載されている例を引用します。

> What is the Spreadsheet ID?
> You can find your Spreadsheet ID in its URL. So for example, if the spreadsheet URL is:
> https://docs.google.com/spreadsheets/d/b94d27b9934d3e08a52e52d7da7dabfac484efe37
> 
> Then the ID will be:
> b94d27b9934d3e08a52e52d7da7dabfac484efe37

Sheet Number は、一番左のシートが**「０」**、追って右に行くごとに **「１」**、**「２」** ... となります。

以下のようなテスト用の Google Spreadsheet を用意した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44364/f5d4ba0d-5a7f-4e36-8292-095d64aa6186.png)


```
(Google Spreadsheet ID)|0
```

として Redash でクエリーした結果は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44364/29a73cd4-fa76-aa02-01f5-60783003c4af.png)

# Redash から条件を指定してクエリー実行
上記の手順で Redash から Google Spreadsheet の情報は取得できるようになりますが、こちらの方法だとシート上のデータをまとめて全部読み込む事しかできません。
何かしらの条件でフィルタリングしたい場合は、公式ドキュメントに記載されているとおり **Query Results** （すでにクエリー実行済みで Redash にキャッシュされたデータ）から検索をすることになります。

https://redash.io/help/user-guide/querying/query-results-data-source

## Query Results を Data Source に設定
Query Results からデータを読み込む場合は、Query Results を Data Source として登録する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44364/717d479e-c490-07e6-23a9-2f66a2b0b70e.png)

Query Results の設定項目は一つだけ（Name）で、任意の名前を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44364/f3b3ec49-f981-77de-72d7-1bfcc9d5735e.png)

## Query Results からデータの読み込み
Query 画面で、上記で作成した Query Results をデータソースとして選択します。

Query Results からキャッシュ済みのデータを呼び出す場合は、以下のような命名規則でテーブル名を指定することで SQL を用いて呼び出すことができます。

```
query_(query ID)
```

たとえば、Query の URL が `/queries/101/` となっている場合、 Query ID は `101` となり、Redash 上で指定するテーブル名は `query_101` となります。

任意の Query Results テーブルからは通常の SQL で自由にデータを取得できるため、たとえば WHERE 句の指定をして以下のようにデータの絞り込みを行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44364/a3d32af7-0b09-ee50-0d12-1218265016a8.png)

このように、 **Google Spreadsheet + Query Results** を組み合わせることで、自由自在にデータの加工を行うことができます。

この例以外にも **Query Results** は他にも応用範囲が広く、端的に言うと複数の Data Source から取得したデータを容易に JOIN することができるため、大変便利な機能です。

# Issue: Team Drive 配下の Google Spreadsheet は beta 版の Redash でないと読み込めない
Redash と Google Spreadsheet の連携ですが、タイトルで書いたとおり Team Drive 配下の Spreadsheet ファイルは現時点では beta 版の Redash からしか読み込むことができないようです。

この辺については Discussion がなされており( https://discuss.redash.io/t/google-spreadsheet-not-found/3620/8 )、 Change Log を見る限りだと `v8.0.0-beta` よりサポートがされているようです。

https://github.com/getredash/redash/blob/master/CHANGELOG.md#v800-beta---2019-08-18

> Google Sheets:
> 　　Support for Team Drive.

ということで、ご注意ください。