GASを活用してGoogleAnalyticsの数値をslackに自動投稿する

#背景
Webメディアを運営している方であれば、ほぼ毎日GoogleAnalyticsを見ていると思います。（※ただし担当者のみ）
そうです、エンジニアやメディア担当者以外の人間はあまり見る習慣がなく、自分たちのメディアがどうなってるのか全員が正確に把握している状態にするのは難しかったりします。

昨日より今日の数値が伸びているのか、先週より今日の数値は伸びているのか？
せっかくメディアを運営している会社に所属しているのだから、一体感をもって課題に向き合いたい。でも終礼で言われてもよく分からない。

ていうかAnalyticsを毎日見に行くのもめんどくさい！笑
そんな思いが募り、slackでAnalyticsのデータを自動投稿するBotの作成を行いました。

#ゴール
1.Dailyのユーザー数、セッション数、PV数が知りたい
2.上記の数値が伸びてるのか知りたい（先週比）
3.どうせなら無機質なBotではなく、可愛い女の子に言われたい！＜ココ重要

#使用したもの
GAS（JavaScript）
slack
GoogleSpreadsheet
http://imgur.com

#コード
まずは先人の知恵を借りながらQiitaを読みまくって作成したコードをご紹介。

```Analytics_post.gs
function postSlackMessage(content) {
 
  var token = PropertiesService.getScriptProperties().getProperty("取得したトークン");
 
  var slackApp = SlackApp.create(token);
 
  var options = {
    channelId: "#general", //投稿するchannel名
    userName: "Analyticsに強いありす", //投稿するBotの名前
    icon_url: "http://i.imgur.com/einH6Tw.png", //投稿するBotのアイコン画像
    message: content
  };
 
  slackApp.postMessage(options.channelId, options.message, {username: options.userName,icon_url:options.icon_url});
}
 
function getAnalytics(){
  var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXX/edit#gid=XXXXXXXXXXXXXXXXX"); //SpreadsheetのURL
  var sheet = ss.getSheetByName('bot表示用'); //Spreadsheetのシート名（タブの奴）
  var day = sheet.getSheetValues(29,2,1,1);
  var user = sheet.getSheetValues(24,2,1,1);
  var session = sheet.getSheetValues(24,3,1,1);
  var pv = sheet.getSheetValues(24,4,1,1);
  var wow_user = sheet.getSheetValues(25,2,1,1)
  var wow_session = sheet.getSheetValues(25,3,1,1)
  var wow_pv = sheet.getSheetValues(25,4,1,1)
  var evaluate = sheet.getSheetValues(27,3,1,1)
  var p_user = sheet.getSheetValues(26,2,1,1)
  var p_session = sheet.getSheetValues(26,3,1,1)
  var p_pv = sheet.getSheetValues(26,4,1,1)
  postSlackMessage("がんばってる？ありすだよ。\n" + day + "のAnalyticsの数値を取得してきたよ！\n\nユーザー数は" + user + "（先週比" + p_user + "" + wow_user + "%）\nセッション数は" + session + "（先週比" + p_session + "" + wow_session + "%）\nPV数は" + pv + 
                   "（先週比" + p_pv + "" + wow_pv + "%）\n\nだったよ！"); 
}
```

icon_urlでは、imgur.comという画像アップロードサービスを使って、画像URLを生成しました。
URLを変更するだけで、色んなキャラで生み出せる。楽しい。

#完成図
実際の投稿はこんな感じになります。
![スクリーンショット 2016-11-24 18.54.21.png](https://qiita-image-store.s3.amazonaws.com/0/129273/f0c1b48b-5737-0423-9d0a-ca5338a5e414.png)
※デモ数値


#ぶつかった壁
色々Qiitaを読んだけども、イマイチ説明が無く大変だったところ。
1.アイコン画像が入らない！
2.先週比の％の数値が凄いことになっちゃう（Ex.10.547839%）
3.先週比の％の数値がプラスなのかマイナスなのか問題
4.GoogleAnalyticsの数値を引っ張ってくる時間が早すぎるとAnalyticsの数値反映が間に合わず謎の数字がでる

#投稿までの流れ
##1.Slack側の設定を整える
soundTrickerさんの記事が大変参考になりました。
[Slack BotをGASでいい感じで書くためのライブラリを作った](http://qiita.com/soundTricker/items/43267609a870fc9c7453)

##２.GoogleSpreadsheetにGoogleAnalyticsの数値を出力
Yamottyさんの記事が一番分かりやすいので、ご紹介。
slackで投稿したいデータを選んで出力しましょう。
[GoogleAnalytics API Add-onを使ってspreadsheetを最強のKPI管理シートに - 基礎編](http://qiita.com/Yamotty/items/41a513fe9592ee0cd11a)

ちなみに私が取得してるデータはこちら。
![スクリーンショット 2016-11-24 14.33.55.png](https://qiita-image-store.s3.amazonaws.com/0/129273/dd0b1440-13b3-08b0-7c0d-cb14776ff4a3.png)
※定時レポートの所ですね

##3.GoogleAnalyticsのデータ出力をスケジューリングする
Analyticsの数値は反映までに多少時間がかかるので、基本的に昨日のデータを引っ張ってきます。
昨日のデータが反映されるまで、バッファをもって16時から17時に取得するように設定。
![スクリーンショット 2016-11-24 14.33.41.png](https://qiita-image-store.s3.amazonaws.com/0/129273/90124557-a36f-c420-6a4d-058f78c6d939.png)


-----下準備はここまで-----
ここまで出来れば後は投稿するMessageを調整するだけです。

##4.Spreadsheetを整える

- GoogleAnalyticsのデータを出力すると下記画像のようになります。
![スクリーンショット 2016-11-24 14.43.17.png](https://qiita-image-store.s3.amazonaws.com/0/129273/1a0d6123-500b-47f0-9d52-57de148384c1.png)

※数値は全てデモです。


<div>

- そこから必要なデータだけ引っ張ってきて、slackに投稿するMessageを整えます。
![スクリーンショット 2016-11-24 14.43.33.png](https://qiita-image-store.s3.amazonaws.com/0/129273/1e384cae-a9c3-f855-8827-233a71a08178.png)

ここで発生する問題として、先週比の％を出す時に、0.67832になってしまうのと、＋なのか−なのか分からない問題です。
また、自動投稿時にAnalyticsの出力が正しく行われているのか確認するために、取得日も一緒にMessageに加えています。


この２つの課題を解決するために下記の関数を用意。

B25 =LEFT(((B24/B17)-100%)*100,5)
→先週比の割合を出す
B26 =if(B25>="0","+","")
→０以下であれば-表記、それ以上であれば＋表記になるif文
B28 =RIGHT(A24,5)
→B2の日付を取ってくる
B29 =SUBSTITUTE(B28,"-","/")
→日付の表記に直す

##5.投稿するMessage（セル）を指定する
ここまで来たら、後は投稿時のMessageと、日々変わる数値が出力されているセルの指定です。

```post_Message.gs
function getAnalytics(){
  var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXX/edit#gid=XXXXXXXXXXXXXXXXX"); //SpreadsheetのURL
  var sheet = ss.getSheetByName('bot表示用'); //Spreadsheetのシート名（タブの奴）
  var day = sheet.getSheetValues(29,2,1,1);
  var user = sheet.getSheetValues(24,2,1,1);
  var session = sheet.getSheetValues(24,3,1,1);
  var pv = sheet.getSheetValues(24,4,1,1);
  var wow_user = sheet.getSheetValues(25,2,1,1)
  var wow_session = sheet.getSheetValues(25,3,1,1)
  var wow_pv = sheet.getSheetValues(25,4,1,1)
  var evaluate = sheet.getSheetValues(27,3,1,1)
  var p_user = sheet.getSheetValues(26,2,1,1)
  var p_session = sheet.getSheetValues(26,3,1,1)
  var p_pv = sheet.getSheetValues(26,4,1,1)
  postSlackMessage("がんばってる？ありすだよ。\n" + day + "のAnalyticsの数値を取得してきたよ！\n\nユーザー数は" + user + "（先週比" + p_user + "" + wow_user + "%）\nセッション数は" + session + "（先週比" + p_session + "" + wow_session + "%）\nPV数は" + pv + 
                   "（先週比" + p_pv + "" + wow_pv + "%）\n\nだったよ！"); 
}
```

- var sheet

取得するシート名の指定。
今回定時レポートと別シートを用意しているので、そのシート名を記入。


- var day = 

これ以降は取得するセルの位置の指定です。
「day」の部分は自由に変更出来るので、抽出するデータ名を入力する


- getSheetValues(29,2,1,1);

ここでセルの位置を指定してます。

内容的にはこんな感じに認識してます。
(29,2,1,1)
(A列から何行目か,A列から数えて何列目か,1,1)
※後が何を意味してるのか結局わからず仕舞い。誰か教えてください。＞＜


- postSlackMessage

後は文章と定義文を組み合わせて投稿内容を作成する。

数値内容によって投稿文を変えたら楽しそうですね！私の知識では関数で内容変更させて、自動投稿させるのが限界ですね。

##6.GASで投稿時間を設定する
リソース＞現在のプロジェクトのトリガー
より投稿時間を設定出来ます。
Analyticsの数値を引っ張る時間が16時から17時なので、投稿時間は17時〜18時に設定。
![スクリーンショット 2016-11-24 18.50.13.png](https://qiita-image-store.s3.amazonaws.com/0/129273/8d0b9d16-33d1-b808-3967-0068076f581f.png)




##7.完成！
そうして出来上がったのがこちら。
![スクリーンショット 2016-11-24 18.54.21.png](https://qiita-image-store.s3.amazonaws.com/0/129273/f0c1b48b-5737-0423-9d0a-ca5338a5e414.png)
※デモ数値


#まとめ

自動投稿を初めてから、みんなBotの投稿を気にしてくれるようになり、
数値を見て、今日はお祝いだ！
となったり、この数値になった理由は季節要因ですかね〜と議論が発生するようになりました。
良い傾向ですね:D

GASを使えはエンジニアでなくとも、簡単にslackに投稿することが出来るので、日々のKPIや当番の指名、経費精算申請の要求など、管理部門の人間も使っていけるTopicかと思います。

ぜひ密かに試して、みんなを驚かせてやりましょう。

余談ですが、「ありす」の元ネタはバイオハザードのとんでもAIちゃんです。キャラ似せる気もありませんね笑
HAL9000とか人間味あふれるAIは未来を感じるので好きです。