弊社のアプリにおいて、日毎の新規ユーザー・アクティブユーザー等のレポートをSlackに自動投稿させたいなーと思い、その仕組みをサクッと作ってみました。
大まかな構成
Google Looker Studioでレポート作成
↓
毎朝メールでレポート送信する設定にしておく
↓
GASで該当メールを見つけて添付ファイルを取得し、Slackに投稿
前提
今回の対象アプリでは、FirebaseのAnalyticsを利用してアプリの各種イベントを記録・送信しています。
それを、Firebaseコンソールでの設定でGoogle Analytics(GA4)に連携し、Looker Studio 上でそのデータと連携させることで、SQLなどを書かず、データポータルからイベントを参照・集計してレポートを作成することができます。
Looker Studio上で簡易なレポートを作成
- メールで送信されるレポートの画像は、データポータルのデザインそのままになります。デフォルトのレポートサイズのままだと、Slack上に表示されるサイズになった際に文字が小さく見づらくなってしまったので、今回は表の文字サイズを大きくして、画像が縮小されても内容が分かる様ようにしました(元のレポートサイズを小さくしておく手もありますが)
- あまり情報が多くても見づらいので、現状、1レポートは1ページのみ=画像1枚のみ にしています
Looker Studio上のレポートはこんな感じ(数字は隠してます)
レポートメール送信
- Looker Studio上の
共有>配信のスケジュール
で、毎朝8時に自分自身宛にメール送信するように設定
Slackでのメール受信設定
- Slackに投稿する方法として、Email利用と、SlackのAPIを利用する方法があるようでしたが、APIではToken取得など面倒そうだったので、もう少し簡単に扱えるEmail投稿を利用しています。
- Slackでは、投稿したい該当チャンネルの設定で、メール投稿を有効にしておきます。するとチャンネル専用の投稿用のメールアドレスが発行されるので、そのメールアドレスにメールを送信すると、送信メールの内容がSlackの該当チャンネルに投稿されます。
GAS(Google Apps Script)でメール送信プログラムを書く
- Looker Studioから配信されるレポートメールでは、PDFとJPGの両方が含まれているので、直接そのままSlackにメール投稿させず、一度自分のアドレスで受信し、GASでそのメールを検知、画像入りの本文をSlackにメール投稿するようにしています。
以下、GASの内容です。
function main(){
//メールから画像取得
attachment = search_from_email_attachments();
//Slackの投稿先のとなるchで発行した投稿用のメールアドレス
let address = "XXXXXXXXXXXXX@hogehoge.slack.com";
// 自分のアドレスからSlack宛に送るメールのタイトル。分かりやすい名前で適当に。
let mailTitle = "XXXXのユーザー数レポート";
// Slack上で見やすい様に適当にサイズ調整したimgタグ
let mailText = "<img src='cid:inlineImg' width=500>";
//オプションでhtmlファイルとし、srcタグで利用する画像も指定する
let options = {
"htmlBody":mailText,
"inlineImages":
{
inlineImg:attachment
}
};
//MailAppで宛先、件名、本文、添付ファイルを引数にしてメールを送付
res = MailApp.sendEmail(address, mailTitle, mailText, options);
Logger.log(res);
}
function search_from_email_attachments() {
// Datastudioからスケジュール配信されたメールを取得(条件に一致する最新のメールを一件取得)
var Threads = GmailApp.search('from:"looker-studio-noreply@google.com" subject:((レポートのタイトル))', 0, 1);
var messages = Threads[0].getMessages();
var message = messages[messages.length - 1];
// メールから画像を取得
var attachments = message.getAttachments();
for(attachment of attachments){
Logger.log(attachment.getName());
if (attachment.getName().indexOf('.jpg') > 0) {
return attachment;
}
}
}
試しに実行したら、こんな感じでSlackに投稿されました!
これを毎朝9-10時の間に実行されるようGASでトリガー設定したので、自動で毎朝Slackに投稿されています