DataStudioのレポートを毎日画像でSlackに通知する

こんな感じで通知しています。

<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/61d2a357-3b7b-23e3-99f6-5c5abe2d1622.png">

# 概要
#### 事前準備
1. SlackAPIのトークンを取得しておく
2. BOTユーザーを作ってチャンネルに招待しておく

やりたいのはファイルのアップロードなので、こちらの権限を付与したトークンを作ってください

Bot Token Scopes

* `chat:write`
* `files.write`

<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/a6431af1-eb4f-1a4a-23a4-0e51626b0038.png">

#### 実装方法
1. [DataStudio] 通知用のレポートを作る
2. [DataStudio] メール通知サービスを設定
3. [Gmail] メールを受け取る
4. [GAS] Gmail取得 -> Imgファイルを摘出 -> Slackに画像をPOSTする
5. [GAS] スケジュール設定する

この方法の特徴として、全てGoogleサービスで完結できるため連携がとても楽になります。

DataStudioを画像化する `/thubnail` エンドポイントもあり、こちらの方法でもいいと思います。

## 実装
#### 1 [DataStudio] 通知用のレポートを作る
既に通知したいDataStudioのレポートができていたらそれでOKです。

Slackで通知した時に見やすいように、データ量はできる限り少なくするのがオススメです。（拡大しないと数値が見えない状態だと誰も見なかった）

`ページ -> 現在のページ設定` で、できる限り余白を削ったり文字を大きくしたりするといい感じになります。

![スクリーンショット 2020-06-29 15.29.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/3596d445-a774-73e7-b0b6-46cf123b50d3.png)

#### 2 [DataStudio] メール通知サービスを設定
DataStudioでは、レポートを画像化してGmailに送ってくれる機能があります。
これを使うことで、Gmailに画像ファイルを送ることができるので後はGASでそれを取得して通知すればOKという事です。

* 宛先 : 自分
* 開始時刻 : 自由に
* リピート : 自由に

![スクリーンショット 2020-06-29 15.31.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/b8452e61-a04f-f8f8-98df-9d58131aabcb.png)

<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/e4f0bde3-b871-10d5-27f1-92fa9cc9c033.png">

#### 3 [Gmail] メールを受け取る
対象時間になったら、Gmailが飛んできているのを確認します。数分ほど遅れてやってきます。

画像としてレポートが送られてきているはずで、この画像をそのままSlack通知に使います。
別のレポートだったり、データが取れていなければデータを見直してみてください。

メールアドレスをGASのサーチ対象にするのでメモしておきます。 `data-studio-noreply@google.com` ですね。

#### 4 [GAS] Gmail取得 -> Imgファイルを摘出 -> Slackに画像をPOSTする
GASのコードを書きます。

```javascript

var TOKEN = '***********************************************';

function main() {
  var dataStudioImage = getDataStudioImage()
  postSlackMessage()
  postSlackImage(dataStudioImage)
}

function getDataStudioImage() {
  var myThreads   = GmailApp.search('from:"data-studio-noreply@google.com"'); // datastudioのメールアドレスで検索
  var myMessages  = GmailApp.getMessagesForThreads(myThreads); // 二次元配列形式で取得
  var attachments = myMessages[0][0].getAttachments(); // 先頭の要素（一番新しいレポート)の添付ファイルを取得
  for (attachment of attachments) { if (attachment.getName().indexOf('.jpg') > 0) { return attachment; } } // 画像ファイルを探索して返す
}

function postSlackMessage() { // 画像投稿前にメッセージを追加したくて作った。無くても良い。
  var data = {
    token: TOKEN,
    channel: 'test',
    text: 'レポートだよ！'
  }
  var option = {
    'method': 'POST',
    'payload': data
  };

  var chatPostMessageRes = UrlFetchApp.fetch('https://slack.com/api/chat.postMessage', option);
  Logger.log(chatPostMessageRes)
}

function postSlackImage(dataStudioImage) { // 画像をpostする
  var data = {
    token: TOKEN,
    file: dataStudioImage,
    file_type: 'jpg',
    channels: 'test',
    title: 'report'
  };
  var option = {
    'method': 'POST',
    'payload': data
  };

  var filesUploadRes = UrlFetchApp.fetch('https://slack.com/api/files.upload', option);
  Logger.log(filesUploadRes)
}
```

main() を呼び、レポートがPOSTされればOKです。

#### 5 [GAS] スケジュール設定する
最後にGASTriggerで毎日実行させればOKです。

GAS の時計マーク ![スクリーンショット 2020-06-29 17.20.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/36a20d7b-0fa6-d45a-7f0c-b64adecae6dc.png) から、設定画面に飛び以下のように設定

* 実行する関数 : `main`
* その他自由

実行タイミングは、Gmailが飛んできてからにしてください。また、DataStudioのメールは若干タイミングが遅れてやってきます。そのため、DataStudioで設定した時間+30分~60分後くらいにするのがベターだと思います。

![スクリーンショット 2020-06-29 17.19.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/2e80cd39-d24c-04a3-2420-7c1151c63e08.png)

## 参考
* https://qiita.com/yaju/items/2e1ab8a25b6e207bfbe6
* https://qiita.com/mida12251141/items/4d0add710de8985ef6b5
* https://qiita.com/osapiii/items/e5de36ec84d28d901818
* https://qiita.com/chuo2110/items/cb394bba06b6883b44c9