BigQueryとスプレッドシートの連携でよくtimeoutするのでGASでどうにかしてみた


目的

  • スプレッドシートとBigQueryの連携は便利だが、期間が長いなど重いQueryはタイムアウトしてしまうことがある
  • そこでBigQueryでは最新1日分のみのデータを取得し、取得したデータをスプレッドシートに蓄積する形で実現する

大まかな流れ

1.BigQueryで前日分のみデータを取得
2.取得したデータをコピー
3.コピーしたデータを別シートの既存数値の下に貼り付ける
4.上記の流れをトリガーで毎日更新するように設定

GAS詳細

function copy(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet_copyFrom = ss.getSheetByName('シート1'); //コピー元のシートを指定

 // コピー範囲取得
  var lr = sheet_copyFrom.getLastRow();
  var lc = sheet_copyFrom.getLastColumn();
  var copyRange = sheet_copyFrom.getRange(1,1,lr,lc); //取得開始位置を指定(1.1)=A1,(2,1)=A2となる。開始位置のみ指定したら、それ以降を全て自動で取得する。

  var sheet_copyTo = ss.getSheetByName('シート2'); //コピー先のシートを指定
  var lastRow = sheet_copyTo.getLastRow();
  var lastRow1 = lastRow + 1;

 // コピー範囲の値を取得し、対象範囲へ転記
 var copyValues = copyRange.getValues();
  sheet_copyTo.getRange(lastRow1,1,lr,lc).setValues(copyValues);

}

流れ

1.BigQueryと連携して前日分のみのデータを取得

2.GASを記載する

以下3点を変更する
- コピー元のシート名
- コピー開始位置
- ペーストするシート名

// コピー開始位置は取得開始位置を指定。(1.1)=A1,(2,1)=A2となる。開始位置のみ指定しそれ以降を全て取得する。
var copyRange = sheet_copyFrom.getRange(1,1,lr,lc);

3.この値がシート2の一番下にコピペされていることを確認する

4.トリガー設定をする

  • 割愛

おわりに

  • GASが使えるとコスト削減にもなりますね