10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

BigQueryのデータを定期的にスプレッドシートにエクスポートするくん

Last updated at Posted at 2019-12-02

これはなに

BigQueryを使っている方なら、定期的に決められたクエリを流してデータを取得したいみたいな運用を経験したことある人は多いと思います。
かくゆう私もそのひとりなわけですが、Google様のお力を使ってこの作業をなんとか自動化してみることにしたのでまとめる。

やり方

①スプレッドシートをBigQueryに接続
②スプレッドシートからBigQueryのクエリを実行してデータを取得
③マクロとGASで自動化の設定

①スプレッドシートをBigQueryに接続

1. スプレッドシートを起動 -> データコネクタ -> BigQueryに接続

スクリーンショット 2019-12-02 9.06.21.png

②スプレッドシートからBigQueryのクエリを実行してデータを取得

  1. データを取得するprojectを選択する
  2. BigQueryで使っているクエリを書く
スクリーンショット 2019-12-02 9.08.22.png

3. データシートというシートができあがる

スクリーンショット 2019-12-02 9.27.09.png

③マクロとGASで自動化の設定

  1. ツール -> マクロ -> マクロを記録
スクリーンショット 2019-12-02 9.15.37.png

※マクロとはGASで書いたプログラムをスクリプトエディタ側でなく、スプレッドシート画面から実行できるようにすること
参考:https://tanuhack.com/macro/

  1. マクロを保存
スクリーンショット 2019-12-02 9.16.36.png
  1. GASをいじる
    ツール -> スクリプトエディタ -> GAS(GoogleAppScript)をいじる
スクリーンショット 2019-12-02 9.18.10.png
  1. GASからトリガーを設定
    時計のマークのところから遷移
スクリーンショット 2019-12-02 9.20.27.png この画面で設定 スクリーンショット 2019-12-02 9.28.16.png

GASについて

私の場合は、決められたクエリを毎月指定した日に実行して、新しいシートとしてアウトプットしてほしかった。
GASで下記のコードを書いて、トリガーの getqueryresultcreatesheet の実行時間をずらして設定した。

// BigQueryを叩く
function getqueryresult() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('A1').activate(); 
  //クエリをセットしているシート名を指定
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('sheetname'), true); 
  SpreadsheetApp.enableAllDataSourcesExecution();
  spreadsheet.getCurrentCell().getDataSourceTables()[0].refreshData();
}

// シートの名前を前の月にする(yyyy年m月分)
function sheetmonth() {
  //今日の日付を取得
  var today = new Date();
  //1ヶ月後の日付にする
  var thismonth = today.setMonth(today.getMonth() - 1);
  //表示用に整形
  var formatDate = Utilities.formatDate(today, 'JST', 'yyyy年M月分');
  return formatDate;
}

// シートを自動生成する
function createsheet() {
  var source = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = source.getSheets()[0];
  // スプレッドシートのidを入力
  var destination = SpreadsheetApp.openById('xxxxxxxxx');
  // 上記で取得したシートを、そのスプレッドシートにコピー
  var month = sheetmonth()
  var copysheet = sheet.copyTo(destination).setName(month);
};


slack通知もしたかったら

上記自動化によって新しいシートが作成されたことをトリガーとして、zapierとか使ってslackに通知したらいいとおもう!
またはGASでslackのAPI叩きに行くのもよし!

補足

最初BigQuery->スプレッドシートへのエクスポートを自動化はできないの??って思った。
BigQueryってクエリの結果をcsvやスプレッドシートに落とす機能がある。
この機能を使って自動化できればとてもええやんって思ったけど、それはできないっぽかった。

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?