スプレッドシートはGoogle が提供する表計算ツールです。スプレッドシートでは簡単にデータを分析し、共同作業などが凄く楽になります。
BigQueryはデータの分析業務によく使われているGoogle Cloud Service の重要なサービスです。日々の業務中は手動で スプレッドシート のシートを BigQuery のテーブルへuploadすることがよくあります。今回はスプレッドシートからシートの内容に変動がある場合に自動的にBigQueryへuploadするAppscriptのバッチの作成方法を紹介します。
App scriptとは
1 |
Apps Script は、Google Workspace の統合、自動化、拡張のためのビジネス ソリューションをすばやく簡単に構築するための唯一のローコード プラットフォームです。Apps Script を使えば、ビジネス ユーザーは本格的なソフトウェア開発の経験がなくても、Google Workspace 上にカスタム ソリューションを構築できます。Apps Script は、Gmail アカウントをお持ちであればどなたでもご利用いただけます。 |
流れ
下記はバッチの流れ図です。ユーザーがスプレッドシートのシートに何か変更を行うとバッチは自動的に呼ばれてシートの内容をcsvファイルでGoogle Driveに保存します。その後このcsvファイルをBigQueryのテーブルへuploadします。 さあ早速Appscriptのバッチを作成しましょう。
スプレッドシートを作成
まずテスト用のシートを作ります。今回は例として下記のデータを入れました。App Scriptのプログラムを作成
拡張機能->App Scriptを選んてください。 新しく作成されたApp Scriptの様子は下記です。App Scriptのサービス設定
左側の”サービス”を押してください。 BigQuery ApiとDriveを追加しましょう。Google Driveで新しいフォルダを作成
csv ファイルを保存するための新しいフォルダを作成してください。作成できたらmouseの右ボタンをクリックして リンクを取得 を押しましょう。 取得できたリンクのID(https://drive.google.com/drive/folders/後の部分)をメモしてください。バッチのコードを書く
シートの内容をDrive のcsvファイルへ書く関数を作成
1 2 3 4 5 |
var FOLDERID = "フォルダID" function save2Drive(filename, csv) { var destfolder = DriveApp.getFolderById(FOLDERID); return destfolder.createFile(filename, csv) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
function importCSVtoBigQuery(table, file) { projectId = table.tableReference.projectId datasetId = table.tableReference.datasetId tableId = table.tableReference.tableId try { BigQuery.Tables.remove(projectId,datasetId, tableId) } catch (e) { Logger.log(e.toString()); } BigQuery.Tables.insert(table, projectId, datasetId); data = file.getBlob().setContentType('application/octet-stream'); var job = { configuration: { load: { destinationTable: { projectId: projectId, datasetId: datasetId, tableId: tableId }, skipLeadingRows: 1 } } }; job = BigQuery.Jobs.insert(job, projectId, data); Logger.log('Job status for %s https://bigquery.cloud.google.com/jobs/%s', file.getName(), projectId); }さ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
SPREADSHEET_URL = "spread sheetのURL" function spreadsheet2Bigquery() { var sheets = SpreadsheetApp.openByUrl(SPREADSHEET_URL).getSheets(); //BigQuery テーブルの項目 var data_csv = "name,price,number\r\n"; if (sheets.length >= 1) { for (var i = 0; i < sheets.length; i++) { if (!sheets[i].isSheetHidden()) { var range = sheets[i].getDataRange(); var values = range.getValues(); for (var j = 1; j < values.length; j++) { var name = values[j][0].toString().trim() var price = values[j][1].toString().trim() + "_" + values[j][cate_index2].toString().trim() var number = values[j][2].toString().trim() data_csv += [name, price, number].join(",") + "\r\n"; } } } } //BigQueryのprojectId、datasetId、table var projectId = 'projectId'; var datasetId = 'datasetId'; var table = { tableReference: { projectId: projectId, datasetId: datasetId, tableId: "test_data_blog" }, //BigQuery テーブルのshcema schema: { fields: [ { name: 'name', type: 'STRING' }, { name: 'price', type: 'FLOAT' }, { name: 'number', type: 'INT64' } ] } }; var data_csv_file = save2Drive("data_csv.csv", data_csv) importCSVtoBigQuery(table, data_csv_file) } |