Google Apps ScriptからFusion Tablesを操作する実装について調べているなかで、テーブル作成の実装例が見当たらなかったので、GoogleAppsScriptからFusion Tablesのテーブル作成と、データ挿入について書きとめておきます。
利用するメソッド
- テーブル作成:Table.insert
- データ挿入:Query.sql or Table.importRows
テーブル作成
Table.insert
作成するテーブル情報をパラメータに指定して実行します。
テーブル情報の定義はjson形式で行いますが、Fusion Tablesで指定できる項目を把握するところが一番苦労するでしょう。
ちなみに、最低限のテーブルを作成するにはこんな感じになります。
var resource = {
"name": "hoge",
"isExportable": false,
"kind": "fusiontables#table",
"columns": [
{
"name": "id",
"type": "NUMBER",
"kind": "fusiontables#column"
},
{
"name": "name",
"type": "STRING",
"kind": "fusiontables#column"
},
],
};
FusionTables.Table.insert(resource);
なお、次のようなテーブルが作成されます。
- テーブル名は"hoge"
- テーブルデータのダウンロード不可
- カラムは数値型の"id"と文字列型の"name"
テーブル設定の詳細はリファレンスを確認してください。
- テーブルの設定:https://developers.google.com/fusiontables/docs/v2/reference/table
- カラムの設定:https://developers.google.com/fusiontables/docs/v2/reference/column
データ挿入
Query.sql
INSERT文をSQL実行することで、データを挿入します。Fusion TablesのINSERT文の書式を知っていれば、利用にはあまり問題ないでしょう。
Table.insertの説明の中で作成したテーブルにデータを3行入れるなら、こんな感じになります。
var sql = "INSERT INTO XXXXXXXXXXX (id,name) VALUES (1,'data1');"
+ "INSERT INTO XXXXXXXXXXX (id,name) VALUES (2,'data2');"
+ "INSERT INTO XXXXXXXXXXX (id,name) VALUES (3,'data3');";
FusionTables.Query.sql(sql);
Table.importRows
SQLを使わずに、Fusion Tablesにデータを挿入します。
Query.sqlよりも比較的早くデータ挿入ができますが、一度実行した後は一定の時間が経過しないと、内部エラーが発生します。
Query.sqlのデータ挿入と同じデータを入れるには、こんな感じになります。
var rowsData = "1,data1\n"
+ "2,data2\n"
+ "3,data3\n";
var rowsBlob = Utilities.newBlob(rowsData, "application/octet-stream");
FusionTables.Table.importRows("XXXXXXXXXXX", rowsBlob);
まとめ
最後にデータ作成とデータ挿入を一度に行うgsコードを掲載しておきます。
runメソッドをトリガーで自動実行させれば、定期的にテーブル作成・データ挿入を行えます。
function run() {
var tableName = "hoge";
var tableId = createTable(tableName);
insertDatas(tableId);
}
function createTable(tableName) {
var resource = {
"name": tableName,
"isExportable": false,
"kind": "fusiontables#table",
"columns": [
{
"name": "id",
"type": "NUMBER",
"kind": "fusiontables#column"
},
{
"name": "name",
"type": "STRING",
"kind": "fusiontables#column"
},
],
};
return FusionTables.Table.insert(resource).tableId;
}
function insertDatas(tableId) {
var sql = "INSERT INTO " + tableId + " (id,name) VALUES (1,'data1');"
+ "INSERT INTO " + tableId + " (id,name) VALUES (2,'data2');"
+ "INSERT INTO " + tableId + " (id,name) VALUES (3,'data3');";
FusionTables.Query.sql(sql);
}