DACエンジニアブログ:アドテクゑびす界

DACのエンジニアやマーケター、アナリストが執筆するアドテクの技術系ブログです。

GoogleスプレッドシートからTreasureDataへデータを取り込む

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万レコードある場合はやめたほうがいいでしょう。