2022/08/14に更新

【GASで便利に】特定のメールが来たらSlackに通知する

SlackAPIメール

Gmailに届いたメールから特定の件名のものをSlackに通知するGoogle Apps Scriptです。Slackが浸透するほどメールをあまり見なくなり、大事なメールを見逃すことが増えてきたので作りました。

こんな悩みを解決します


  • 一日中Slackを見るようになってメールを見逃すことが多くなった・・・
  • 大事なメールはSlackに通知してほしい!

用意するもの


特にありません。
スプレッドシートのコンテナバインド型スクリプトとして作成していますが、スタンドアロン型で実装いただいても構いません。

このスクリプトで出来ること


  • 指定した件名にマッチしたメールが来たら、Slackに通知することができます。
  • 通知する間隔も(GASのトリガーで設定できる範囲で)任意に指定できます。

使い方


1.事前準備

Slackと連携するために、「Incoming Webhook」を使用します。
GASからSlackに投稿するための「入り口」を作ります。
詳しい手順はこちらをご確認ください。

https://myfunc.jp/items/00066/index.html

Webhook URLが発行されたら完了です。このURLをスクリプトの事前設定エリアにある「slack_webhook_url」にセットしましょう。

他にもチェックする間隔や、拾いたいメールのキーワードを登録します。
キーワードは何個でもOKです。必要なだけ配列に追加してください。
サンプルとしてクレジットカードの利用通知と宅配便の配達通知を拾ってみます。

事前設定が終わったら関数「onOpen」を一度実行して権限の承認をしておきましょう。

2.動作確認

スプレッドシートに戻るとメニューが増えているはずです。
上のメニューにある「スクリプト実行」から「特定のメールが来たらSlackに通知する」を実行します。

Incoming Webhookを設定したチャンネルにメッセージが届いていれば成功です。
差出人と件名が記載されているので要件がなんとなくわかりますね。

3.トリガーの設定

動作に問題がなければトリガーをセットしましょう。
サンプルでは24時間以内のメールをチェックしていたのでトリガーも1日1回とします。
もっと頻繁にチェックしたい場合はスクリプトの事前設定エリアを書き換えて、トリガーもその時間間隔に合わせてください。

  • 実行する関数: send_notification_to_slack_when_mail_arrived
  • 実行するデプロイ: HEAD
  • イベントのソース: 時間主導型
  • 時間ベースのトリガーのタイプ: 日付ベースのタイマー
  • 時刻をを選択: 午前9時〜10時

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00131/index.html
 */

function onOpen() {
  // スプレッドシートを開いたときに実行される関数

  // UIの取得
  const ui = SpreadsheetApp.getUi()

  // メニューの表示名
  const menu = ui.createMenu('スクリプト実行');

  // メニューに追加するボタン
  menu.addItem('特定のメールが来たらSlackに通知する', 'send_notification_to_slack_when_mail_arrived');

  // メニューを画面に追加する
  menu.addToUi();
}

function send_notification_to_slack_when_mail_arrived() {

  // ######### 事前設定ここから ########

  // SlackのWebhook URLを入力してください
  const slack_webhook_url = 'https://hooks.slack.com/services/*******************';

  // 過去何時間のメールを検索するか指定してください(24なら過去24時間以内に届いたメールが対象になります);
  const hours = 24;

  // 通知したいメールの件名(部分一致)を指定してください(配列で複数可)。
  const keywords = ['家族カードご利用明細のお知らせ', 'お荷物お届けのお知らせ'];

  // ######### 事前設定ここまで ########


  // 検索期間を指定するための日付を取得する
  let date = new Date(); // 現在の日時を取得

  // メール検索条件に使うため、UNIX時に変換する
  let unixtime = Math.floor(date.getTime() / 1000);

  // 事前設定で指定された時間分、マイナスして検索の開始時間にする
  unixtime = unixtime - (hours * 3600);

  // メールを検索するための条件文を作る
  const query = 'Subject:"' + keywords.join(' OR ') + '" after:' + unixtime;

  // Gmailからメールを取得する
  const threads = GmailApp.search(query);

  if (threads.length == 0) {
    // スレッド(メール)が1つも見つからない場合は処理を終了する
    return;
  }

  // メールから必要な部分を抜き出して格納するための配列を宣言する
  let result = [];

  // スレッドを1つずつ処理する
  for (let i = 0; i < threads.length; i++) {

    // 1スレッドに複数のメッセージ(=メール)が入っているので取得
    let messages = threads[i].getMessages();

    // メールを1通ずつ処理していく
    for (let j = 0; j < messages.length; j++) {

      // メールの差出人を取得する
      let mail_from = messages[j].getFrom();

      // メールの件名を取得する
      let mail_subject = messages[j].getSubject();

      // 結果用の配列に、差出人と件名を連結して追加する
      result.push(mail_from + ':' + mail_subject);

    }
  }

  // 結果の配列を改行で連結し、Slack投稿用テキストとする
  const text = result.join('
');

  // SlackのWebhook URLに投稿するデータをまとめる
  const json =
  {
    'username': '大事なメールが届きました',
    'icon_emoji': ':exclamation:',
    'text': text
  };

  // SlackのWebhook URLに送信するデータをJSONに変換する
  const payload = JSON.stringify(json);

  // UrlFetchAppで使用するメソッドやコンテントタイプを指定
  const options =
  {
    'method': 'post',
    'contentType': 'application/json',
    'payload': payload
  };

  // Slackに送信
  UrlFetchApp.fetch(slack_webhook_url, options);

}

関連するアプリ


タグ一覧

最新のアプリ

人気のアプリ

ページトップに戻る
myfunc.jp