スプレッドシートを外部テーブルとして連携したBigQueryに、スプレッドシート+GASからアクセスする

January 24, 2019

社内の諸々のデータを可視化する目的で、BigQueryにデータを蓄積し、Google SpreadSheetで直接可視化できるようにする営みを進めている。

このプロジェクトの中で、Google SpreadSheetに蓄積されたデータをBigQueryのソースデータとして利用したいという課題がでてきた。 つまり

SpreadSheet(外部データテーブル) <----> BigQuery <----> SpreadSheet/GAS(閲覧) 

という接続構成。

SpreadSheetを外部データテーブルとして接続するのはとても簡単で(こことか)、 SpreadSheet/GASからBigQueryへのアクセスも、すごく使い勝手の良いコードがあり、それぞれの接続は簡単にできたのだが、 SpreadSheet <-> BigQuery <-> SpreadSheet の接続構成を取ると、

Access Denied: BigQuery BigQuery: No OAuth token with Google Drive scope was found.

というエラーが生じてしまい、ハマった。

問題は、GoogleAppScriptのデフォルトのScope

https://github.com/googleapis/google-cloud-python/issues/3067

BigQueryクライアントのデフォルトスコープにGoogleDriveが含まれていないというISSUEがあった。 このリポジトリ自体はPythonのライブラリのもので、後述するGASで個別にスコープ設定する書き方がわからなかったのもあり、 はじめにこのISSUE見たときはスルーしていたのだけど、最終的にはこれが参考になった。

解決方法

  1. GASのメニューで [表示] > [マニュフェストファイルを表示] で、appscript.jsonを表示する

img1

  1. マニュフェストに、以下のoauthScopes設定を追加
{
 ...
  "oauthScopes": [
    "https://www.googleapis.com/auth/bigquery",
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/spreadsheets"
  ]
}

img2

所感

BigQuery側の設定や、SpreadSheetの共有設定など、色々疑ってだいぶハマってしまったけど、 最終的に解決できて一安心。

authored by kazukimuta