GoogleAnalyticsの集計値をSlackに自動投稿する簡単バッチの作成

GoogleAnalyticsの集計値を定期的にSlack投稿したい時があったのですが
「スプレッドシート」「GoogleAnalyticsアドオン」「GAS」を使って簡単に自動投稿バッチ作れたので手順を記載します。
非エンジニアでも作成可能だと思います。

・簡単に作れること
・GAの値をスプレッドシート、GASで自由に集計できること
・集計結果を定期的にslackで通知してくれること
がこの記事で作れるバッチの良いところだと思います。

各項目ごとに詳しい記事が既に存在するので、本記事は索引的な記事になります。

# バッチの処理のながれ
- GoogleAnalyticsのデータをスプレッドシートに移す
- スプレッドシートの値を集計する
- 集計した値をSlack投稿する

#  GoogleAnalyticsのデータをスプレッドシートに移す
GoogleAnalyticsアドオンを使えば、簡単にGoogleAnalyticsのデータをスプレッドシートに移せます。

アドオンの設定の仕方は以下の記事が参考になります。

<a href="https://www.mk-design.co.jp/blog/2018/05/marketing-google-analytic-spreadsheet-report-automation" target="_blank">【初級編】Google Analyticsのデータを完全自動でレポートにまとめる方法、ご存知ですか？</a>
<a href="https://www.tdi.co.jp/miso/google-analytics-spreadsheet" target="_blank">アドオンでGoogle Analyticsを自動集計しよう | MISO</a>

# スプレッドシートの値を集計する
スプレッドシートに移したGAの値を集計する場合
・スプレッドシートの関数を使う
・GASを使う
の２つの方法があります。

集計できれば、どちらの方法でも構いません
今回は後者のGASの集計スクリプトのサンプルを載せておきます。

```javascript
function sample() {
  // IDから当該スプレッドシートを取得
  var obj = SpreadsheetApp.openById('xxxxx'); 
 
　// スプレッドシート中の任意のシートを取得
  var sheet = obj.getSheetByName("シート１"); 
 
  //　取得したシートから集計したいセルの範囲を指定して取得
  var values = sheet.getRange(1,3,100).getValues(); 

  // 取得した値を合計
  var total = 0;
  for(objs in values){
      for(obj in values[objs]){
          total += values[objs][obj] * 1;
      }
  }

　text = '合計値： ' + total;

  // salckに投稿　※　独自定義の関数
  postslack(text);
}
```

スプレッドシートで集計を行った場合も、以下のように集計値が入ったセルを取得してやればOKです。

```javascript
  // 集計値の入ったセルを取得
  var val = sheet.getRange("A1").getValue();

  // salckに投稿
  postslack(val);
```

GASでコードを書くまでの手順は以下が参考になります。

https://qiita.com/Brutus/items/efbd5fda4c9316fc9e3b

GASでスプレッドシートを操作する方法は以下記事が参考になります。

https://qiita.com/mitama/items/e5fbf8306384c26cf42f

# 集計した値をSlack投稿する
slack投稿したい集計値ができたら
・投稿したいslackチャンネルのWebhook URLを取得する
・GASを使ってSlackチャンネルに集計値をPOSTする
・作成したGASのスクリプトをトリガーを使って定期実行する
を行えばもうバッチが出来上がります。

## 投稿したいslackチャンネルのWebhook URLを取得する
Webhook URLを取得するのは以下記事が参考になります。

https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008

# GASを使ってSlackチャンネルに集計値をPOSTする
GASの[UrlFetchAppクラス](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app)を使って取得したWebhook URLに投稿したい文字列をPOSTできます。

サンプルを以下に載せておきます。

```javascript
function postslack(post_text) {
  
  var payload  = {
    'text'      :  post_text,        // 投稿される本文  
    'username'  : 'sample bot',      // slack通知時に表示されるユーザー名
    'channel'   : 'slack-channel',   // 通知先のチャンネル名
  };

  var options = {
    'method'      : 'post',
    'contentType' : 'application/json',
    'payload'     : JSON.stringify(payload), 
  };

  // 取得したWebhook URL
  var url = 'https://hooks.slack.com/services/xxxxxx';
  // 投稿
  UrlFetchApp.fetch(url, options);
}
```



自動投稿するコードの書き方は以下記事が参考になります。

https://qiita.com/chihiro/items/c7b11abc78f5d806c3a8

## 作成したGASのスクリプトをトリガーを使って定期実行する

トリガーを設定して作成したスクリプトを定期実行します。

GASエディタの左メニューにあるトリガーを選択　＞　「トリガーを追加」ボタンを押下

してトリガー追加の画面を開きます。

![スクリーンショット 2021-10-22 015434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/58c72c22-50b8-9a00-59e1-c38faf6c2752.png)


・実行する関数は先程作成したGASの関数を選択します。
・実行するデプロイは「Head」のままでOKです。
・イベントのソースは「時間主導型」を選択します。
あとは分毎なのか時毎なのか日毎なのか選択して「保存」を押下すればトリガーが設定され
指定した周期でスクリプトが実行されます。

成功していれば以下のように集計値がslackに投稿されます。
![スクリーンショット 2021-10-22 015933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/4c25c6ba-6bc4-4245-8eb6-05322897f09b.png)

# 余談　必要なときだけ送る
当たり前ですが、slackに投稿する前にif文を付けてやれば
特定の条件を満たした場合のみ通知を送る使い方もできます。

これでGAの値の監視みたいなこともできそうです。

```javascript
  // 集計値の入ったセルを取得
  var val = sheet.getRange("A1").getValue();
  if (val < 100) {
    // salckに投稿
    postslack(val);
  }
```