BigQuery + GoogleSpreadSheetでできること

早いもので入社してから8ヶ月が経過し、2017年が終わりに近づいています。
LIFULL新卒エンジニアの@poyonexです。
まだまだ未熟者ながら日々開発しています。

#はじめに
本記事は[LIFULL Advent Calenderその2](https://qiita.com/advent-calendar/2017/lifull2)の14日目の記事となります。
「BigQueryを使ってみたいけどどうやって試せば...」という人の助けになれば幸いです。
なお、同カレンダー13日目の記事の裏方を担っているのはBigQueryとGASの連携によるものだったりします。

#BigQueryとは
そもそもBigQueryとは何なのか、について触れたいと思います。
Google公式によると、以下のように書かれています。
>Google BigQuery は、こうした問題を解決するために Google のインフラストラクチャの処理力を使用して SQL クエリを超高速で実行する、エンタープライズ データ ウェアハウスです。
>https://cloud.google.com/bigquery/what-is-bigquery?hl=ja

エンタープライズデータウェアハウス。ナンノコッチャ。

つまるところ、Google製のデータベースストレージです。
公式ページにおいて「すぐに開始できるフルマネージド サービス」をうたっているように、簡単にクエリを実行しその結果を受け取ることができます。
ログやビックデータの集積、活用に役立ち、すでに企業への[導入事例](https://cloud.google.com/customers/?hl=ja)も多く存在します。
またWeb上の管理画面やAPI等、様々なアプローチで扱うことができます。

##料金体系
なお注意するべき点の一つとして、従量課金制となっています。
保存しているデータサイズと実行するクエリのサイズに応じて課金が行われます。

[料金体系\(Google\)](https://cloud.google.com/bigquery/pricing?hl=ja)

クエリの料金は$5/TBと安価に大量のデータを扱うことができますが、使い方によっては多大な料金がかかる可能性があります。
大きなデータを扱う際は以下の記事を参考にすることをオススメします。
[BigQueryで150万円溶かした人の顔](https://qiita.com/itkr/items/745d54c781badc148bb9)

しかし、使い方を間違えなければ安価で利用できるサービスです。
本記事は試しに使って見たい方々向けですので、そこまで大きなクエリを伴うことはないでしょう。

##利用方法
[公式ドキュメント](https://cloud.google.com/bigquery/docs/?hl=ja)にもあるように、通常の管理画面以外にもAPIから実行することもできます。
サーバーからBigQueryAPIを利用するためにはGoogleCloudPlatformから設定を行う必要があります。
golangでBigQueryAPIを活用している記事を参考として貼らせていただきます。
[HerokuからgolangでBigQueryにつなぐ方](https://qiita.com/pyo_hei/items/63824a8461ac6794091d)

#BigQuery + GoogleSpreadSheet（本題）
ここで本題のGoogleSpreadSheetの活用の話題に入ります。
GoogleSpreadSheetとGoogleAppsScript（gas）によって、BigQueryAPIを簡単に利用することができます。
連携の方法はすでにまとめてくださっている方がいますので、そちらを参考として貼らせていただきます。
[BigQueryとスプレッドシートとGASと。](https://qiita.com/satoru_mag/items/114703d7d95b60b11c6f)
本記事ではSpreadSheetと連携すると何が素敵なのかを宣伝したいと思います。

連携に必要な作業としては、
1. SpreadSheetに紐づいたGASを作成する
2. BigQueryAPIを有効にする
3. GoogleDeveloperConsoleでもBigQueryAPIを有効にする
の3ステップ。
あとは上記の記事のサンプルコードを参考にしてソースを書くだけです。
（記事の参照ばかりで申し訳ない・・・）
Googleの公式ドキュメントも充実しているので、jsが少し書ける人であれば問題なく遊べると思います。

以上の手順を踏めば、「BigQueryとSpreadSheetをGASを使い連携させる」ことができるようになります。

##SpreadSheetとGASを利用することのメリット
###1, 簡単
AWS lambdaやGoogleComputeEngineを利用する必要がありません。
SpreadSheet上のGASはその場で実行することができるので、試しにデータを取得してみることに長けています。
サーバーサイドプログラムを記述する必要もなく、jsが少し書ければ問題なくクエリの実行、データの出力までできることでしょう。

###2, アウトプット、連携がしやすい
SpreadSheetに紐づいているので、結果の出力が簡単です。
結果閲覧用のWebページを作成する必要もなく、出力したcsvファイルをExcelで開く必要もありません。
ただ出力されたSpreadSheetのリンクを渡せばそれで完了します。

この記事がのっているアドベントカレンダーの前日の記事は本記事の手法で取得したデータを活用しています。
BigQueryAPIを活用しデータを取得する処理を構築するのはエンジニアだがそのデータを扱う人がノンエンジニア、ということは往々にして存在します。
他業種の方々との連携がしやすい、というのは利点だと感じています。

###3, できることは結構多い
私もGAS初心者ですのでそのポテンシャルの一部しか把握していませんが、それでもできることは数多くあります。
各種Googleサービスとの連携はもちろん、他APIの活用やGAS特有の関数の利用等々の利点があります。
一度の処理に6分の制限があるため重い処理はできませんが、「まず使って見たい」というケースではとても有用だと感じます。
####Trigger関数
その機能の一つとして、GASにはTriggerという機能があります。
正直、「BigQueryからデータを取得する」という目的だけならBigQuery管理画面でクエリを実行すれば達成できます。
Exportしたデータを整形する必要はありますが、一度だけ取得するのであればGASのコードを書く必要はありません。
しかし同じ処理を毎日する、ということであれば話は別です。
その日のデータを取得してExport,整形というフローを毎日踏むのであれば、GASによって自動化することが望ましいでしょう。

Triggerは「関数の実行を予約する」機能です。
以下のように実行する関数にタイマーを設定することができます。
日ごと、週ごと、月ごとのような指定に加えて、SpreadSheet側のイベントを取得することもできます。
SpreadSheetやExcelで毎日やらなければならない作業がある場合、よほど重くない限りこれにより自動化することができるはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211856/e9bfee7c-c9a4-c3d6-49e9-720d1bdf2c0c.png)

#まとめ
本記事では具体的なコードや手法を書かず、BigQueryとGoogleSpreadSheetの連携でできることをまとめました。
少しのセットアップと少しのGASコードによってその連携を実現することができます。
興味がある方、導入を決定してはいないが考えている方などは一度試して見てはいかがでしょうか。