Google BigQuery

Google Apps Scriptを使ってスプレッドシートからBigQueryのテーブルを更新する

こんにちは、エクスチュアの権泳東(コン・ヨンドン)です。
今回はAppsScriptを使って、スプレッドシートからBigQueryのテーブルを更新する方法についてです。

1.スプレッドシートのデータを用意する

例として、sstable1とsstable2というシート2枚から構成されるスプレッドシートを使います。

スキーマはいずれも:
id: INTEGER
name: STRING
memo: STRING
という簡単なものです。

sstable1

sstable2

2.Apps Scriptを作成する

スプレッドシートで開いているアクティブなシート名を取得して、そのシートの内容をBigQueryに書き込むスクリプトを書きます。

function main() {
  var projectId = 'my-project'; //プロジェクトID
  var datasetId = 'my-dataset'; //データセット

  var app = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = app.getActiveSheet();
  var tableId = sheet.getSheetName();
  
  var table = {
    tableReference: {
      projectId: projectId,
      datasetId: datasetId,
      tableId: tableId
    },
    schema: {
      fields: [
        {name: 'id', type: 'integer'},
        {name: 'name', type: 'string'},
        {name: 'memo', type: 'string'}
      ]
    }
  };
  try{
    BigQuery.Tables.remove(projectId, datasetId, tableId); 
  } catch(e) {}
  table = BigQuery.Tables.insert(table, projectId, datasetId);
  
  var range = sheet.getDataRange();
  var blob = Utilities.newBlob(convCsv(range)).setContentType('application/octet-stream');
  var job = {
    configuration: {
      load: {
        destinationTable: {
          projectId: projectId,
          datasetId: datasetId,
          tableId: tableId
        },
        skipLeadingRows: 1
      }
    }
  };
  job = BigQuery.Jobs.insert(job, projectId, blob);
}

function convCsv(range) {
  try {
    var data = range.getValues();
    var ret = "";
    if (data.length > 1) {
      var csv = "";
      for (var i = 0; i < data.length; i++) {
        for (var j = 0; j < data[i].length; j++) {
          if (data[i][j].toString().indexOf(",") != -1) {
            data[i][j] = "\"" + data[i][j] + "\"";
          }
        }
        if (i < data.length-1) {
          csv += data[i].join(",") + "\r\n";
        } else {
          csv += data[i];
        }
      }
      ret = csv;
    }
    return ret;
  }
  catch(e) {
    Logger.log(e);
  }
}

このスクリプトをスプレッドシートの[ツール] > [スクリプトエディタ]を開いて、エディタに登録します。

3.スプレッドシートとGCPプロジェクトをリンクする

スクリプトエディタの [リソース] > [Cloud Platform プロジェクト] を開いて、リンクするプロジェクトの「プロジェクト番号」を入れます。

そしてBigQuery APIを有効化します。
[リソース] > [Googleの拡張サービス]を開いて、BigQuery API v2 を有効化します。

4.スクリプトを実行する

さて、ではスクリプトを実行します
BigQueryにデータを書き込みたいシートを開いてる状態で、スクリプトエディタの[実行] > [関数を実行] > [main]を選びます。
これでスプレッドシートの内容がBigQueryのテーブルに書き込まれました。
すべてのシートを開いてこれを実行します。

sstable1

sstable2

5.シート編集時に自動的にBigQueryを更新するようにトリガーを設定する

シートを更新するたびにメニューから実行を選択しないでも自動的にテーブルが更新されるようにトリガーを設定します。

スクリプトエディタの[編集] > [現在のプロジェクトのトリガー]を開いて、新しいトリガーを追加します。

実行: main
イベント: スプレッドシートから 編集時

これで、シートを編集すると自動的にBigQueryのテーブルが更新されます。

今回はGoogleスプレッドシートから、Apps Scriptを使ってBigQueryのテーブルを更新する方法についてでした。
弊社ではGoogle Cloud認定データエンジニアがGCPを使った分析基盤構築や、分析の支援を行っております。
お問い合わせはこちらからどうぞ。

関連記事

  1. Adobe Analytics

    AdobeAnalyticsでReactNativeアプリを計測する

    こんにちは、エクスチュアの権泳東(コン・ヨンドン)です。今回は…

  2. Google BigQuery

    GCP: 今月のGCP課金額をslackに自動的に書き込む

    こんにちは、エクスチュアCTOの権です。今回はGCPの課金額を…

  3. Adobe Analytics

    Adobe AnaltyicsとGoogle Analytics の「生Webビーコン」をBigQu…

    こんにちは、エクスチュアの権泳東(コン・ヨンドン)です。前回の…

  4. Google BigQuery

    Tableau : BigQueryでLOD計算が使えない場合の対処法

    こんにちは、エクスチュアの渡部です。Tableau×BigQu…

  5. Adobe Analytics

    Adobe Analytics: BigQueryにロードしたデータフィードをDataStudioで…

    こんにちは、エクスチュアCTOの権です。前回のブログで、Big…

  6. Adobe Analytics

    Adobe Analytics: DatafeedのログからパスフローレポートをBigQueryで作…

    こんにちは、エクスチュアの権泳東(コン・ヨンドン)です。以前このブ…

最近の記事

  1. Adobe Analytics + Google BigQu…
  2. Adobe AnaltyicsとGoogle Analyti…
  3. TableauでTreasure Data上のデータへ接続す…
  4. Treasure DataからBigQueryにデータを移動…
  5. Adobe AnaltyicsとGoogle Analyti…
  1. Adobe Analytics

    Adobe Analytics: データフィードをGoogle Compute …
  2. Adobe Analytics

    Adobe AnaltyicsとGoogle Analytics の「生Webビ…
  3. Tableau

    Tableau:抽出を含んだワークブックを10.4以下にダウングレードする
  4. Adobe Analytics

    Adobe Analytics: DWHレポートの日付列をBigQueryのDa…
  5. Adobe Dynamic Tag Manager

    Tag Manager: Adobe DTM で Google Analytic…
PAGE TOP