【GAS】#1 Gmailに届いた新着メールをSlackに通知する

1. 概要

Gmail to Slack

本記事では「API連携」による通知について解説します。

2. SlackからWebHook URLを取得

2-1. Slackから「Add apps」をクリック

2-2. 「Incoming WebHooks」を検索し、「Add」ボタンをクリック

2-3. 「Add to Slack」をクリック

2-4. 「通知するチャンネルを選択」し、「Add Incoming WebHooks integration」ボタンをクリック後、「WebHook URL」(*4-3)を取得

  • 「https://hooks.slack.com/services/~」

3. サンプルコード

3-1. ファイル構成(GitHubで管理

  • notification/slack/gmail_to_slack.gs
    • メインコード
  • notification/slack/gas_properties.gsheet
    • 「WebHook URL」を含め、コード内に書かない方が良いデータ(ID、PASSWORD、KEY等)をプロパティとして保存

3-2. スプレッドシートIDの取得

3-3. GAS Editorの開け方

※「+新規」をクリック

3-4. コード & 解説

※複数のプログラムよりプロパティファイルを共有する為、敢えてスタンドアロン型(*4-2)を採用する

// SlackのWebHook URLが記載されているスプレッドシートのID
const bookId = '1j2z-S●●●●●●●●●●●●●●●●●●●●●●●●●●●●cQk';
// Slackへ通知する際の名前
const username = 'Notification';

// Mainメソッド
// Gmailに届いた新着メールをSlackへ通知する
const notifySlack = () => {
  // 新着メールを検索条件とする。
  const condition = 'in:Inbox is:Unread';
  const msgs = [];

  // オプションを設定
  const option = {
    startThreadIndex : 0,
    maxThreadCount : 100
  };

  // Gmailから新着で届いたメールを取得する。
  const threads = GmailApp.search(condition, option.startThreadIndex, option.maxThreadCount);
  let messages = GmailApp.getMessagesForThreads(threads);

  // Slackに通知する際にメールが届いた順に通知するためにソートする。
  messages = Object.keys(messages)
    .map((id) => { return messages[id] })
    .sort((a, b) => { return a[0].getDate() - b[0].getDate() });

  // 通知する対象メールを配列に格納
  messages.forEach((row) => {
    row.forEach((col) => {
      const dt = formatDt(col.getDate());
      const subject = col.getSubject();
      const body = col.getPlainBody();

      const msg = `【日時】${dt}\n【件名】${subject}\n【本文】${body}`;
      msgs.push(msg);

      // 格納後、既読とする。
      col.markRead();
    });
  });
  sendToSlack(msgs);
}

// 配列に格納されている分を回しながら、Slackへ通知
const sendToSlack = (msgs) => {
  const webhookUrl = getWebhookUrl();

  msgs.forEach((msg) => {
    // 通知する内容
    const param = {
      'username': username,
      'text': msg
    };
    // paramをJSON文字列に変換
    const payload = JSON.stringify(param);
    // APIを叩くにあたってどのような仕様で通信を行うか、どのような情報を送るかを指定
    const options = {
      'method': 'post',
      'headers': {
        'Content-Type': 'application/json'
      },
      'payload': payload
    };
    // APIの呼び出し(ここで実際に通知される)
    UrlFetchApp.fetch(webhookUrl, options);
  });
}

// 日時を読みやすく整形
const formatDt = (mailedDate) => {
  return `${mailedDate.getFullYear()}/${mailedDate.getMonth() + 1}/${mailedDate.getDate()} ${mailedDate.getHours()}:${mailedDate.getMinutes()}:${mailedDate.getSeconds()}`;
}

// 指定のスプレッドシートに記載されているWebHooks URLを取得
const getWebhookUrl = () => {
  const sheet = SpreadsheetApp.openById(bookId).getSheetByName('Properties');
  return sheet.getRange('C2').getValue();
}

4. 参考

4-1. GAS(Google Apps Script)とは

4-2. 2種類の方式

4-3. Webhookとは

4-4. 「UrlFetchApp.fetch()」について

関連記事

  1. 【GAS】#9 スプレッドシートの明日のシフト表より当番や時間を取得し…

  2. 【GAS】#7 GoogleForms入力からスプレッドシートへ記載と…

  3. 【GAS】#11 Twitterの話題を検索し、スプレッドシートに記載…

  4. 【GAS】#4 OCRにて画像からテキストを起こし、Lineへ通知する…

  5. 【GAS】#3 NewsAPI.orgからデータを取得し、Slackへ…

  6. 【GAS】#10 ウェブアプリのフォーム入力からスプレッドシートへ記載…