notebook

都内でWEB系エンジニアやってます。

Google Apps ScriptでDataportalのレポートを毎日Slackに配信する

この記事は Google Apps Script Advent Calendar 2021のカレンダー | Advent Calendar 2021 - Qiita 2日目の記事です

qiita.com

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: ....でクエリできるのでこのレポートっていうのを特定できる

対象のメールを検索するクエリはこのページが参考になる

Gmail で使用できる検索演算子 - Gmail ヘルプ

support.google.com

添付ファイル

ページ数分の画像+PDFが取得できる

メールを見る限り順序的にPDFは最後のようなのでattachmentsの最後のファイルを取得しSlackへ送信する

GASのスケジュール設定

Dataportalのスケジュール配信をdailyで設定しているので当日メールが配信された後にGASが発動させる必要がある

まぁ1時間くらい明けておけば大丈夫なはず…

この辺はメールとの連携だとどうしてもこうなってしまうのでしかたないかなと感じる部分ではある

今までだとメール配信を10時に設定していて遅くて10:25とかはあった

Slack送信

Web APIのファイルアップロードを使う

ドキュメントは下記

files.upload method | Slack

api.slack.com

すでにいろんな記事でも言及されているし特に書くことはない

実行結果

無事PDFファイルがアップロードされた

他補足と所感

  • メール配信とGASでのSlackポストの間は調整する必要がありいけてないが毎日配信可能になるのは良い
    • 現在朝10時にメール配信、11時にGASのスケジュールトリガーを設定している
  • 探索する必要がない、定期的に見たい種類のレポートであれば有効だと思う
  • メール配信自体は配信するページの指定も行えるのでレポート用のページを用意してスケジュール配信しても良さそう
    • さらにDataportalはページごとにレイアウト(画面サイズ)を変えられる、Slack上から見る前提でサイズを設定して配信すればさらに体験が良くなりそう

2022-12-02追記

Dataportal -> Looker Studioに名称が変更されたのでそれに伴いレポート配信の送信元メールアドレスがlooker-studio-noreplyに変更された

影響があったのでコードスニペット中のメールアドレスの部分だけ差し替えた