社内の同テンプレのスプレッドシートまとめるのこれでやると楽だったのでメモ。
#!/bin/bash SCHEMA=date:DATE,id:STRING,description:STRING URL=https://docs.google.com/spreadsheets/hoge/fuga PRJ=myproject DS=mydataset TBL=mytable bq mk --external_table_definition=${SCHEMA}@GOOGLE_SHEETS=${URL} ${PRJ}:${DS}.${TBL}
データセットは先に作っておかないと怒られる。
しかしこの方法はシート1枚目しか対応してない仕様。
複数シートも扱うならAppsScriptでBQのネイティブテーブル直接作るしかない。
外部テーブルじゃないけどさ。
function main() { var projectId = 'myproject'; var datasetId = 'mydataset'; var app = SpreadsheetApp.getActiveSpreadsheet(); var sheet = app.getActiveSheet(); var tableId = sheet.getSheetName(); var table = { tableReference: { projectId: projectId, datasetId: datasetId, tableId: tableId }, schema: { fields: [ {name: 'date', type: 'date'}, {name: 'id', type: 'string'}, {name: 'description', 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); } }