GAS: BigQuery へ SELECT クエリを実行する

GAS: BigQuery へ SELECT クエリを実行する

February 27, 2021
Google Apps Script(GAS)
Google Apps Script(GAS), BigQuery

やりたいこと #

  • Google Apps Script から BigQuery へクエリを発行する
  • 発行したクエリの結果を取得する

事前に知っておくべきこと #

  • 基本的にはリファレンスにある BigQuery Service のサンプルコード通りに書けばよい
  • 標準 SQL とレガシー SQL というものがあり、BigQuery コンソールのデフォルトが標準 SQL、GAS の BigQuery ライブラリのデフォルトがレガシー SQL のため単純にコピペするとその差異で動かなかったりする
  • クエリを渡す request オブジェクトに useLegacySql: false を渡してやると標準SQLで動く

サンプルコード #

function runQuery() {
  const projectId = '<YOUR PROJECT NAME HERE>';
  let queryResults = BigQuery.Jobs.query({
    useLegacySql: false,
    query: `
      SELECT 1 AS num, 'aaa' AS str UNION ALL
      SELECT 2 AS num, 'bbb' AS str UNION ALL
      SELECT 3 AS num, 'ccc' AS str
    `
  }, projectId);
  const jobId = queryResults.jobReference.jobId;
  let sleepTimeMs = 500;
  while (!queryResults.jobComplete) {
    Utilities.sleep(sleepTimeMs);
    sleepTimeMs *= 2;
    queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId);
  }
  let rows = queryResults.rows;
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {
      pageToken: queryResults.pageToken
    });
    rows = rows.concat(queryResults.rows);
  }
  if (rows) {
    const headers = queryResults.schema.fields.map(({name}) => name);
    const data = rows.map(({f}) => f.map(({v}) => v));
    data.unshift(headers);
    console.log(data);
  }
}

結果 #

[ [ 'num', 'str' ],
  [ '1', 'aaa' ],
  [ '2', 'bbb' ],
  [ '3', 'ccc' ] ]

num カラムは INT64 型のはずだが文字列。型情報は欠落するっぽい。