AudienceOneの開発を担当しています。skryoです。 またまたTreasureDataネタですが、今回はGoogleスプレッドシートからGoogleAppsScriptを使ってTreasureDataへデータを取り込む手順を紹介したいと思います。
なぜ?
Googleスプレッドシート上でマスタデータみたいなものを管理していて、それを定期的にTreasureDataへ反映させる、というオペレーションを行っています。 これが個人的には面倒で、GoogleAppsScriptを使ってスプレッドシートから直接TreasureDataへ取り込めるようにしました。 (面倒と言っても、単にテキストファイルにしてアップロードするだけなんですが。
やり方
TreasureDataのJavaScript SDK内で利用してるエンドポイントを利用して、GoogleAppsScriptでスプレッドシート内のデータをPOSTして実現します。 参考: Treasure Data JavaScript SDK
GoogleAppsScriptの内容
TreasureDataのwrite onlyのAPIキーが必要になります。
var tdEndpoint = 'https://in.treasuredata.com/js/v3/event/'; var tdApikey = 'xxxxxxxxxxxxx'; // write onlyのAPIキー // TreasureDataへPOSTする function postRecords(database, table, records) { var options = { "method": "POST", "contentType" : "application/json", "headers" : { "X-TD-Write-Key": tdApikey, "X-TD-Data-Type": "k" } }; var payload = {}; payload[database + "." + table] = records; options["payload"] = JSON.stringify(payload); var response = UrlFetchApp.fetch(tdEndpoint, options); } // TreasureDataへImportするデータをスプレッドシートから取得する // ここは実際のデータの内容にあわせて適宜変更してください function getData() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var as = ss.getActiveSheet(); var lastRow = as.getLastRow(); // 2行目A列~最終行C列のデータを取得 var select = as.getRange(2,1,lastRow - 1,3).getValues(); var records = []; for (var i = 0; i < (lastRow-1);i++){ // 実際にImportするレコードデータを作る records.push({ "col1": select[i][0], "col2": select[i][1], "cpl3": select[i][2], "time": Math.floor((new Date()).getTime()/1000) // 1リクエストで複数行入れる場合はtimeカラムが必須 }); } return records; } // メインの処理 function import() { var tagetTable = Browser.inputBox('テーブル名を入力して下さい', Browser.Buttons.OK_CANCEL); if (tagetTable == 'cancel' || tagetTable == '') { Browser.msgBox("テーブル名を入力してください"); return; } var records = getData(); // 1000行ずつPOSTする for(var i = 0; i < Math.ceil(records.length / 1000); i++) { var j = i * 1000; var c = records.slice(j, j + 1000); postRecords("データベース名", tagetTable, c); } } // 使いやすいようにスプレッドシートにメニューを追加する function onOpen() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var entries = [,{ name : "TreasureDataへImport", functionName : "import", }]; spreadsheet.addMenu("CustomMenu", entries); };
これで、スプレッドシートに出てくるメニューをぽちっと押せばスプレッドシートから簡単にTreasureDataへデータを取り込むことができます。 もちろん、GoogleAppsScriptからPOSTしているので、数100万、数10万レコードある場合はやめたほうがいいでしょう。