⛽
GASからBigQuery の結果をObjectで受け取るラッパー書いてみた
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