GAとredashの数字をGASでまとめて扱う

## やりたいこと
* redashとGAの数字がスプレッドシート上でまとめてみたい
* 上記の数字を毎日Slackに通知したい

## 使用するもの
* GoogleAnalytics
* SpreadSheet
* SpreadsheetのGAアドオン
* GoogleAppScript
* redash(API含む)

## 手順
### 1. GAの数値を取得するスプレッドシートを用意する

スプレッドシートにはGAのアドオンが用意されているので、それを使ってまずは必要な数値を取得します。

![スクリーンショット 2017-09-12 11.34.53.png](https://qiita-image-store.s3.amazonaws.com/0/10532/61fe5eaa-d446-9047-90e2-fb2f71818e58.png)

### 2. 日別で集計するスプレッドシートを用意する
1で作成したスプレッドシートの必要な箇所を参照するようにします。
※画面のIMPORTRANGEの部分参照
※redashのシートは3移行で説明します。

![スクリーンショット 2017-09-12 11.40.52.png](https://qiita-image-store.s3.amazonaws.com/0/10532/072f0a76-d2f4-806f-ca53-53e2b4ba5358.png)

### 3. GoogleAppScriptで必要な処理を実装
スプレッドシートのメニューから「ツール>スクリプトエディタ」の順に選択し、エディタを起動します。
ここで作成したスクリプトを毎日決まった時間に実行します。

* スプレッドシートからGAの前日数値を取得
* redashのAPIを使って数値を取得
* redashの数値をスプレッドシートに書き込み（2.で作成したシート）
* SlackにGAとredashの数値を通知

```js
function myFunction() {
  // GA
  var ga_message = gaReport();
  // re:dash
  var redash_message = redashReport()
  
  // Slackへの通知
  var data = {
    "channel": "#test", 
    "username": "muscle", 
    "text": ga_message + "\n" + redash_message, 
    "icon_emoji": ":icon:"
  };
  var payload = JSON.stringify(data);
  var options = {
     "method":"POST",
     "payload":payload
  };
  var res = UrlFetchApp.fetch("https://hooks.slack.com/services/hogehoge", options);
}

// GAの数値を取得
function gaReport() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("GA数値集約");
  var data = sheet.getDataRange().getValues();

  // 前日のデータ
  var date = Utilities.formatDate(data[1][0], 'Asia/Tokyo', 'M月d日');
  var dl = data[1][1];
  var dau = data[1][2];
  var mau = data[1][3];
  
  // 前々日のデータ
  var old_dl = data[2][1];
  var old_dau = data[2][2];
  var old_mau = data[2][3];
  
  var ga_message = "おはようございます！" + date + "のレポートをお伝えします！\n\n";
  ga_message += "DL数は" + dl + "（前日比" + Math.floor(dl/old_dl*100) + "%）\n";
  ga_message += "DAUは" + dau + "（前日比" + Math.floor(dau/old_dau*100) + "%）\n";
  ga_message += "MAU数は" + mau + "（前日比" + Math.floor(mau/old_mau*100) + "%）\n";
  
  return ga_message;
}

// redashの数値を取得
function redashReport() {
  // redashのクエリ番号
  var query_nums = [
    1, // 前日売上
    2, // 当月売上
    3  // チケットの利用枚数
  ];
  
  // basic認証回避
  var headers = {'Authorization' : "Basic hogehoge"};
  var params = {
    'headers': headers,
    'method': "get"
  };
  
  // sheet取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("re:dash数値集約");
  var redash_message = "";
  
  // 新しく入力する行数を取得
  var new_row = sheet.getLastRow() + 1;
  var data_start_column = 2;
  var date = new Date();
  sheet.getRange(new_row, 1).setValue((date.getFullYear()) + "/" + (date.getMonth() + 1) + "/" + (date.getDate() - 1));
  
  query_nums.forEach(function(num) {
    var url = "https://redash.jp/api/queries/" + num + "/results.json?api_key=hogehoge";
    var response = UrlFetchApp.fetch(url, params);
    var ret = JSON.parse(response.getContentText());
    var row = ret.query_result.data.rows[0];
    for (key in row) {
      redash_message += key + "は" + row[key] + "\n";
      
      // スプレッドシートにデータ書き込み
      sheet.getRange(new_row, data_start_column).setValue(row[key]);
    }
    data_start_column++;
  });
  
  return redash_message;
}
```

## まとめ
GASは手軽に実装できる反面、どこで何が動いているかわからなかったり、デプロイの手順が煩雑になったり、チームで開発するときにはいくつか問題になることがあります。
とはいえ、GASをgit管理する方法などは存在するので、属人化しないようにきちんとルールを使って運用していきたいですね。