こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。
今回はAppsScriptを使って、スプレッドシートからBigQueryのテーブルを更新する方法についてです。
1.スプレッドシートのデータを用意する
例として、sstable1とsstable2というシート2枚から構成されるスプレッドシートを使います。
スキーマはいずれも:
id: INTEGER
name: STRING
memo: STRING
という簡単なものです。
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のテーブルに書き込まれました。
すべてのシートを開いてこれを実行します。
5.シート編集時に自動的にBigQueryを更新するようにトリガーを設定する
シートを更新するたびにメニューから実行を選択しないでも自動的にテーブルが更新されるようにトリガーを設定します。
スクリプトエディタの[編集] > [現在のプロジェクトのトリガー]を開いて、新しいトリガーを追加します。
実行: main
イベント: スプレッドシートから 編集時
これで、シートを編集すると自動的にBigQueryのテーブルが更新されます。
今回はGoogleスプレッドシートから、Apps Scriptを使ってBigQueryのテーブルを更新する方法についてでした。
弊社ではGoogle Cloud認定データエンジニアがGCPを使った分析基盤構築や、分析の支援を行っております。
お問い合わせはこちらからどうぞ。
ブログへの記事リクエストはこちらまで