GASからBigQuery の結果をObjectで受け取るラッパー書いてみた

2022/03/31に公開

GASからBigQuery受け取って使う際に、{column:"hogehoge"} 的な形の
Objectで受け取れるラッパー関数作ってみました。

こんな感じで使えます。

var rows = getQueryResultRows("BqのprojectId","select id from hoge ");
 rows.forEach(function (r) {
	var id =  r.id;
 });


/**
 * BQからデータ取得
 * @param {string} projectId - BqのプロジェクトID
 * @param {string} query - 実行するクエリ
 * @return {Array|Object} rows - クエリの結果
 */
function getQueryResultRows(projectId, query) {

  var request = {
    query: query,
    useLegacySql: false
  };
  var queryResults = BigQuery.Jobs.query(request, projectId);
  var jobId = queryResults.jobReference.jobId;

  // Check on status of the Query Job.
  var sleepTimeMs = 500;
  while (!queryResults.jobComplete) {
    Utilities.sleep(sleepTimeMs);
    sleepTimeMs *= 2;
    queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId);
  }

  // Get all the rows of results.
  var rows = queryResults.rows;
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {
      pageToken: queryResults.pageToken
    });
    rows = rows.concat(queryResults.rows);
  }
  var headers = [];
  var res = [];
  if (rows) {
       headers = queryResults.schema.fields.map(function(field) {
        return field.name;
        });
      for (var i = 0; i < rows.length; i++) {
        var cols = rows[i].f;
        var data = {};
        for (var j = 0; j < cols.length; j++) {
            let header = headers[j];
            data[header] = cols[j].v;
            res.push(data);
        }
      }
  }
  
  return res;


}

Discussion