この記事は Google Apps Script Advent Calendar 2021のカレンダー | Advent Calendar 2021 - Qiita 2日目の記事です
Dataportalのレポートをメール配信する機能が結構良かったのでGASと合わせてSlackに投稿する
というのをやってみた
流れは次のようにする
- Dataportalのメール配信設定を行う
- GASで対象メールを特定、添付のPDFファイルをSlackへ送信
Dataportalのメール配信を行う
いつの間にかレポートのメール配信が可能になっていた(もしかしたら把握してなかっただけかも)
- 設定画面
タイトルはGASでのメール特定時に「この文字列が含まれているタイトル」というように絞り込みを行うのでこのDataportalからのメールですよというのが分かるような文字列にする
- メール
実際に配信スケジュールをセットして配信されたメールを見てみると
設定で指定したページの画像を表示+PDFファイルを添付してくれる
かなり鮮明なので良い
画像すべてを送っても良いかなと思ったが今回はPDFのみをSlackに流す
メール配信の設定自体は1Dataportalのレポートに対して1スケジュール(設定)のようなので日次でこの設定、週次でこの設定
といった使い方はできない
そういう場合分けが必要な場合はDataportalのレポートを別で作る必要がある
GASで対象メールを特定、添付のPDFをファイルをSlackへ送信
GASを使ってSlackへ送信する
- Code.js
// 初回実行用、SlackのWEB APIトークンを設定する function setSlackToken() { PropertiesService.getScriptProperties().setProperty('SLACK_WEB_API_TOKEN', ''); } // 初回実行用、スケジュールトリガーを登録する function setScheduleTrigger() { ScriptApp.newTrigger('main').timeBased().atHour(11).nearMinute(0).everyDays(1).inTimezone("Asia/Tokyo").create(); } // 設定値、投稿チャンネル、メールタイトルを設定する function setProperties() { PropertiesService.getScriptProperties().setProperty('SLACK_CHANNEL', 'metrics'); PropertiesService.getScriptProperties().setProperty('MAIL_SUBJECT_PREFIX', 'BlogDashboardReport(Dataportal)'); } function getMail() { const subjectPrefix = PropertiesService.getScriptProperties().getProperty('MAIL_SUBJECT_PREFIX'); const searchConfig = `from:looker-studio-noreply@google.com has:attachment subject:${subjectPrefix}`; const threads = GmailApp.search(searchConfig); // 最新を取得する const messages = threads[0].getMessages(); return messages[0]; } function toSlack(title, pdfFile) { const token = PropertiesService.getScriptProperties().getProperty('SLACK_WEB_API_TOKEN'); const channel = PropertiesService.getScriptProperties().getProperty('SLACK_CHANNEL'); UrlFetchApp.fetch("https://slack.com/api/files.upload", { method: "post", payload: { channels: channel, file: pdfFile, title: title, filename: title, filetype: 'pdf', token: token, } }); } function main() { const message = getMail(); const title = message.getSubject(); const attachments = message.getAttachments(); // ページ数分のスクショ画像もattachementsに含まれる、PDFは最後に添付されるので最後の添字 const pdfFile = attachments[attachments.length - 1]; toSlack(title, pdfFile); }
対象メールのクエリ
const searchConfig = `from:looker-studio-noreply@google.com has:attachment subject:${subjectPrefix}`;
メールの検索は特定文字列が含まれるかをsubject: ....
でクエリできるのでこのレポートっていうのを特定できる
対象のメールを検索するクエリはこのページが参考になる
添付ファイル
ページ数分の画像+PDFが取得できる
メールを見る限り順序的にPDFは最後のようなのでattachmentsの最後のファイルを取得しSlackへ送信する
GASのスケジュール設定
Dataportalのスケジュール配信をdailyで設定しているので当日メールが配信された後にGASが発動させる必要がある
まぁ1時間くらい明けておけば大丈夫なはず…
この辺はメールとの連携だとどうしてもこうなってしまうのでしかたないかなと感じる部分ではある
今までだとメール配信を10時に設定していて遅くて10:25とかはあった
Slack送信
Web APIのファイルアップロードを使う
ドキュメントは下記
すでにいろんな記事でも言及されているし特に書くことはない
実行結果
無事PDFファイルがアップロードされた
他補足と所感
- メール配信とGASでのSlackポストの間は調整する必要がありいけてないが毎日配信可能になるのは良い
- 現在朝10時にメール配信、11時にGASのスケジュールトリガーを設定している
- 探索する必要がない、定期的に見たい種類のレポートであれば有効だと思う
- メール配信自体は配信するページの指定も行えるのでレポート用のページを用意してスケジュール配信しても良さそう
- さらにDataportalはページごとにレイアウト(画面サイズ)を変えられる、Slack上から見る前提でサイズを設定して配信すればさらに体験が良くなりそう
2022-12-02追記
Dataportal -> Looker Studioに名称が変更されたのでそれに伴いレポート配信の送信元メールアドレスがlooker-studio-noreply
に変更された
影響があったのでコードスニペット中のメールアドレスの部分だけ差し替えた