GoogleAnalyticsのリアルタイムユーザーがある一定数を下回ったらSlackにアラートを飛ばしてみる

コードを修正しました。最下部の更新履歴を確認してください。

---

15分毎にGoogleAnalyticsのリアルタイムユーザーを取得して、
リアルタイムユーザーがある一定数を下回っていた場合にSlackに通知してみます。

[![https://gyazo.com/08f1c337dd0e3a3bc5aedd5e42b23926](https://i.gyazo.com/08f1c337dd0e3a3bc5aedd5e42b23926.png)](https://gyazo.com/08f1c337dd0e3a3bc5aedd5e42b23926)

ユーザー数は隠していますが、通知はこんな感じです。

当初はGoogleのAPIを利用して実現しようかなと思っていたのですが、
Google Apps Scriptを利用すれば簡単に、しかも楽に実装できました。


スプレッドシートのツール＞スクリプトエディタからGoogle Apps Scriptを起動します。

[![https://gyazo.com/fe78817751aaf6fc16e085834c25ec6b](https://i.gyazo.com/fe78817751aaf6fc16e085834c25ec6b.png)](https://gyazo.com/fe78817751aaf6fc16e085834c25ec6b)

Google Apps Scriptを起動するとエディタが表示されるので、このエディタ上でコーディングしていきます。

[![https://gyazo.com/4daf63db343563c0adf1ceb38b7f928a](https://i.gyazo.com/4daf63db343563c0adf1ceb38b7f928a.png)](https://gyazo.com/4daf63db343563c0adf1ceb38b7f928a)


任意のタイトルを設定した後で、リソース＞Googleの拡張機能からAnalyticsを有効にします。

[![https://gyazo.com/86d46be6cbbea69fbe4949dbc7ede063](https://i.gyazo.com/86d46be6cbbea69fbe4949dbc7ede063.png)](https://gyazo.com/86d46be6cbbea69fbe4949dbc7ede063)

[![https://gyazo.com/5a9cef9b14af0b2f388ac3777a8d5d55](https://i.gyazo.com/5a9cef9b14af0b2f388ac3777a8d5d55.png)](https://gyazo.com/5a9cef9b14af0b2f388ac3777a8d5d55)

> これらのサービスを Google API コンソールでも有効にする必要があります。

と注意書きがあるように上記の「Google API コンソール」のリンク先でも有効にしてください。
これで準備が整ったので、まず以下のコードを貼り付けます。

```
function execute() {
  var realTimeUserNumber = getRealTimeUserNumber()

  if (invalidRealTimeUserNumber(realTimeUserNumber))
    return

  slack('現在のユーザー数: ' + realTimeUserNumber);
}

function invalidRealTimeUserNumber(realTimeUserNumber) {
  const MINIMUM_USER_NUM_EACH_HOUR = {
     0: x,
     1: x,
     2: x,
     3: x,
     4: x,
     5: x,
     6: x,
     7: x,
     8: x,
     9: x,
    10: x,
    11: x,
    12: x,
    13: x,
    14: x,
    15: x,
    16: x,
    17: x,
    18: x,
    19: x,
    20: x,
    21: x,
    22: x,
    23: x,
    24: x
  };

  const RATIO = 0.7
  const CURRENT_HOUR = Utilities.formatDate(new Date(), "JST", "HH");  
    
  for(var hour in MINIMUM_USER_NUM_EACH_HOUR)
    if (hour == CURRENT_HOUR)
      Logger.log(MINIMUM_USER_NUM_EACH_HOUR[hour] * RATIO);
      return realTimeUserNumber > (MINIMUM_USER_NUM_EACH_HOUR[hour] * RATIO)

  slack('バグってます。 CURRENT_HOUR: ' + CURRENT_HOUR + ' realTimeUserNumber: ' + realTimeUserNumber + ' RATIO: ' + RATIO)
  return false;
}

function getRealTimeUserNumber() {
    return Analytics.Data.Realtime.get('ga:xxxxxx', 'rt:activeUsers').getRows();    
}

function slack(message) {
    const WebhookUrl = 'https://hooks.slack.com/services/hoge/piyo/fuga'

    var payload = {
      text: message,
      link_names: 1
    };

    UrlFetchApp.fetch(WebhookUrl, {
      method: "POST",
      payload: JSON.stringify(payload)
    });
}
```

個別に修正が必要な3箇所について解説していきます。

` Analytics.Data.Realtime.get('ga:xxxxxx', 'rt:activeUsers').getRows(); `

` ga:xxxxx` にはGoogleAnalyticsのビューIDをセットします。
ビューIDはAnalyticsで確認できます。

[![https://gyazo.com/f557d1552eb9ca96f0d421f394cc7421](https://i.gyazo.com/f557d1552eb9ca96f0d421f394cc7421.png)](https://gyazo.com/f557d1552eb9ca96f0d421f394cc7421)


` const MINIMUM_USER_NUM_EACH_HOUR = { ... ` の ` x ` にユーザー数を入れてください。
` invalidRealTimeUserNumber ` で ` realTimeUserNumber > (MINIMUM_USER_NUM_EACH_HOUR[hour] * RATIO) ` のようにしているので、 ` x ` に入れたユーザー数より3割少ないとslackに通知するようになっています。


` const WebhookUrl = 'https://hooks.slack.com/services/hoge/piyo/fuga' ` の右辺は通知するSlackのwebhookのURLに変更します。
` https://team-name.slack.com/apps ` でIncoming WebHooksを検索して、Add Configurationをクリックすると、どのチャンネルにintegrationsするか聞かれるのでチャンネルを選択すればwebhookのURLが発行されます。

[![https://gyazo.com/3aadaa8779b0427035c807404e1c4e63](https://i.gyazo.com/3aadaa8779b0427035c807404e1c4e63.png)](https://gyazo.com/3aadaa8779b0427035c807404e1c4e63)

最後に15分毎にこのスクリプトが実行されるように設定します。

[![https://gyazo.com/9b58de8cfdc81ab33d4c3bb57fef8502](https://i.gyazo.com/9b58de8cfdc81ab33d4c3bb57fef8502.png)](https://gyazo.com/9b58de8cfdc81ab33d4c3bb57fef8502)

# 参考にしたURL

http://blog.admage.jp/?p=1353
https://www.tam-tam.co.jp/tipsnote/javascript/post8499.html
https://api.slack.com/apps/A5VKERT4P/incoming-webhooks
http://www.devlog.atlas.jp/2016/11/18/1364
https://memordm.com/gas-log/

# 元記事

[GoogleAnalyticsのリアルタイムユーザーがある一定数を下回ったらSlackにアラートを飛ばしてみる](http://tackeyy.com/blog/notify-google-analytics-real-time-user-alert-to-slack-with-google-apps-script)

# 更新履歴

以下の対応をしたのでコードを更新しました。

- リアルタイムユーザーがある一定数を下回っていないのに通知が飛んでしまう不具合を修正
- 通知する条件（リアルタイムユーザー数 < ユーザー数閾値）のユーザー数閾値を通知内容に含める

また、コードの履歴管理が面倒なのでgistにしました。

https://gist.github.com/tackeyy/a64d895fb8fd88e163186d49b7042861