GCP SQL

【GAS】BigQueryに対してクエリを実行してデータを読み書きする

この記事は約4分で読めます。

 

  • Google Apps Script( GAS ) から BigQuery を操作するにはどうすればいいのか知りたい
  • GAS で BigQuery のテーブル定義書をスプレッドシートに出力したい
  • GAS をスケジュール実行して、定期的にテーブル定義書を更新したい

 

Step1:BigQuery テーブルデータをスプレッドシートに出力

 

とりあえず、Google Apps Script を動かして、BigQuery のテーブルデータをスプレッドシートに出力してみたいと思います。

新しいスプレッドシートを開いたら、「ツール」タブから「スクリプトエディタ」をクリックします。

 

 

Apps Script 画面が開くので、「サービス」から「BigQuery API」を追加します。

 

エディタに以下のスクリプトを入力しました。

 

GASからBigQueryに対してクエリを実行する

 

GASからBigQueryに対してクエリを実行するサンプルコードは以下になります

 

function runQuery() {
  // Replace this value with the project ID listed in the Google
  // Cloud Platform project.
  var projectId = '<プロジェクトID>';

  var request = {
    query: "SELECT * FROM <テーブル名> limit 10;",
    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);
  }

  if (rows) {
    var spreadsheet = SpreadsheetApp.create('BiqQuery Table Data');
    var sheet = spreadsheet.getActiveSheet();
    sheet.setName('pos_partition_date');

    // Append the headers.
    var headers = queryResults.schema.fields.map(function(field) {
      return field.name;
    });
    sheet.appendRow(headers);

    // Append the results.
    var data = new Array(rows.length);
    for (var i = 0; i < rows.length; i++) {
      var cols = rows[i].f;
      data[i] = new Array(cols.length);
      for (var j = 0; j < cols.length; j++) {
        data[i][j] = cols[j].v;
      }
    }
    sheet.getRange(2, 1, rows.length, headers.length).setValues(data);

    Logger.log('Results spreadsheet created: %s',
        spreadsheet.getUrl());
  } else {
    Logger.log('No rows returned.');
  }
}

 

あとはこの関数なりをスケジューラーで定期実行すると読み書きの定期実行処理が可能になります。

 

コメント

タイトルとURLをコピーしました