Google Spreadsheet에서 Treasure Data로 데이터 가져오기

Spreadsheet의 데이터를 Treasure Data에 삽입하고 싶어졌습니다.

Treasure Data와 Google Spreadsheet를 함께 사용하여 집계 시스템을 만들고 싶습니다.



SQL을 두드릴 수 없는 영업팀에서도 데이터 드리븐인 의사 결정을 요구하는 요즘이므로, 사용하기 쉬운 로그 집계 환경은 필수입니다.
사실은 Tableau가되어 Domo 나름의 BI 툴을 도입하는 것이 편합니다만 (TD는 그 근처의 제휴가 강하다),
돈이 없는 여러가지 사정으로 가지고 있는 것만으로 집계 환경을 만들 필요가 있었습니다.

거기서 필요한 것이 집계 조건을 DB에 전하는 인터페이스입니다.

BI 툴이라면 기간의 입력이나 집계축의 결정, 그리고 싶은 그래프의 선택도 손의 물건입니다만, 그런 고급스러운 것은 없습니다.
필요한 최소한의 집계 조건을, 무료로 누구나 취급할 수 있는 플랫폼상에서 입력시켜, 그것을 DB에 가져가야 합니다.
거기서 눈을 돌린 것이 Google Spreadsheet입니다. Google App Script라는 Java Script와 유사한 매크로를 사용할 수 있습니다. 무엇보다 사용하는 사람이 많다.

집계 JOB 주문 테이블로 Spreadsheet 사용



예를 들면 이런 느낌에 집계 조건을 써 달라고 합니다.


Excel 감각으로 어느 DB에, 어느 기간에, 어떤 분석을 하고 싶은지를 써 달라고 합니다.
이 집계 조건에 따라 DB 측에서 쿼리를 이동합니다. 결과를 다시 다른 Google Spreadsheet에 반환하면 간단한 집계 시스템이 완성됩니다.
이번에는 작성된 집계 조건을 Treasure Data의 Table에 자동으로 반영하는 방법에 대해 기록합니다.

참고로 한 블로그



여기의 TD 개발자 블로그를 참고로 하고 있으므로, 자세한 것은 이쪽을 참조해 주세요.

Spreadsheet의 내용을 배열로 가져오기


// activeSheet: 読みたいSheetを指定
// rowIndex: 何行目からデータが入っているか。header付きなら2
// colNames: 列名が入った配列を指定
// rowCount: 一度に読み込む行数を指定する。
function readMultipleRows(activeSheet, rowIndex, colNames, rowCount) {
  // データをrowCount分だけ読んで配列に格納する関数
  var rowJSONs = [];
  // time列の有効範囲を指定
  var timeLowerBound = (Date.parse(Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd 00:00:00')) / 1000 - 7 * 86400).toFixed();
  var timeUpperBound = (Date.parse(Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd 00:00:00')) / 1000 + 3 * 86400).toFixed();
  for (var offset = 0; offset < rowCount; offset++) {
    // 何もない行があったら終端と認識する
    var rowValues = activeSheet.getRange(rowIndex+offset, 1, 1, colNames.length).getValues();
    var isEnd = true;
    for (var ii in rowValues) {
      if (rowValues[0][ii] !== "") {
        isEnd = false;
        break;
      }
    }
    if (isEnd) { break; }
    rowJSONs.push((function() {
      var o = {};
      for (var ii in colNames) {
        o[colNames[ii]] = rowValues[0][ii];
      }
      // time列の値チェック(七日前~三日後)
      if ( timeLowerBound < Date.parse(o["time"]) / 1000 && Date.parse(o["time"]) / 1000 < timeUpperBound){
          return o;
      }
    })());
  }
  return rowJSONs;
}

※time열의 체크 부분은 참고 블로그의 것보다 간략화되어 있습니다

읽은 배열을 JSON으로 변환하여 TD로 게시


// databaseとtableにTD上のスキーマを指定
// apikeyは別途TDから取得しておく
function postTreasureData(rowJSONs, database, table, apikey) {
  var data = {};
  data[database+"."+table] = rowJSONs;
  var payload = JSON.stringify(data);
  var options = {
    "method": "POST",
    "contentType" : "application/json",
    "headers" : {
      "X-TD-Write-Key": apikey,
      "X-TD-Data-Type": "k"
    },
    "payload": payload
  };
  // TreasureDataのREST APIにJSON形式で渡す
  var response = UrlFetchApp.fetch("http://in.treasuredata.com/js/v3/event/", options);
  Logger.log(response);
}
options를 구성하여 Treasure Data의 REST API에 전달합니다.
Spreadsheet의 내용을 JSON 형식으로 변환하여 전달하고 있기 때문에 얼마든지 쓰자.

Treasure Data API key (write only) 필요


  • Treasure Data API key

  • htps : // / cs. t 어째서였다. 코 m / r 치 c ぇ s / 게 t 아피케 y 근처를 참고로 Write only key를 앞두고


  • time의 함정



    TD의 테이블에는 모든 시간 열이 필요합니다. Import 때 이 time의 범위에 제한이 있는 것을 모르고, 잠시 빠졌습니다.
    Javascript SDK쪽의 문서에 은근하게 써 있습니다.

    When you try the above example, please change time value to current unixtime value, we're currently ignoring records which have a timestamp older than 7 days, and newer than 3 days ahead.
    htps : // / cs. t 어째서였다. 코 m / 아 rc c ぇ s / 그럼 sc 리 ptsdk

    즉 오늘부터 보고 7일전~3일후까지의 unixtime의 범위의 값이 time열에 들어가 있지 않으면 import시키지 않아, 라고. 함정이군요.

    문서



    참고하신 TD 개발자 블로그
    htps : // bg. t 어째서였다. 코 m / b ぉ g / 2016/03/24 / 이 mpo r 찐 g an d e x po r ch ng g go g ぇ- sp rea d shi ts u u th et 했어 /

    REST API로 데이터를 가져올 때 문서
    htps : // / cs. t 어째서였다. 코 m / r 치 c ぇ s / 레 st - 아피 m 포 rt

    Javascript로 작성할 때는 이쪽도 참고
    htps : // / cs. t 어째서였다. 코 m / 아 rc c ぇ s / 그럼 sc 리 ptsdk

    좋은 웹페이지 즐겨찾기