記事

Google Apps ScriptでGmailをSlackに自動転送|フィルター連携で効率化

GmailのフィルターとGoogle Apps Scriptを活用し、受信メールを自動でSlackチャンネルにカスタマイズ転送。手動作業を削減し、情報共有を即時化する方法を解説。

Google Apps ScriptでGmailをSlackに自動転送|フィルター連携で効率化

本記事は AI による翻訳をもとに作成されています。表現が不自然な箇所がありましたら、ぜひコメントでお知らせください。

記事一覧


Google Apps Script を使って Gmail メールを Slack に転送する方法

Gmail フィルター + Google Apps Script を使ってメール受信時にカスタマイズした内容を自動で Slack チャンネルに転送する

Photo by [Lukas Blazek](https://unsplash.com/@goumbik?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText){:target="_blank"}

Photo by Lukas Blazek

起源

最近、iOSアプリのCI/CDプロセスを最適化しており、Fastlaneを自動化ツールとして使用しています。パッケージをアップロードした後、自動審査申請を続ける場合(skip_submission=false)、Appleの処理完了まで約30〜40分のCIサーバー時間が必要です。これはAppleのApp Store Connect APIが十分に整備されておらず、Fastlaneもアップロードしたビルドの処理完了を1分ごとにしか確認できないため、非常にリソースを浪費しています。

  • Bitrise CI サーバー: 同時ビルド数と最大実行時間を90分に制限。90分は十分ですが、1つのビルドが詰まると他の人の実行を妨げます。

  • Travis CI サーバー: ビルド時間に応じて課金されるため、待つ余裕はありません。無駄なコストが発生します。

別のアプローチ

もう待たない、アップロード完了後すぐに終了!処理済みのメール通知で次のアクションをトリガー。

ただ最近このメールが届かなくなりました。設定の問題か、Appleがこの種の通知を送らなくなったのか分かりません。

本文は Testflight のテスト開始通知メールを例に説明します。

全体の流れは上図の通りで、原理的には可能ですが、本記事の主題ではありません。この記事では、メール受信後に Apps Script を使って Slack チャンネルに転送する部分に焦点を当てます。

受信したメールを Slack チャンネルに転送する方法

有料・無料のSlackプロジェクト問わず、さまざまな方法でEmailをSlackのチャンネルやDMに転送することが可能です。

公式ドキュメントを参照して設定してください: 傳送電子郵件至 Slack

どの方法でも効果は以下の通りです:

デフォルトでメール内容は折りたたまれており、クリックすると全文が表示されます。

利点:

  1. 簡単で迅速

  2. 技術的なハードルなし

  3. リアルタイム転送

欠点:

  1. 内容をカスタマイズできません

  2. 表示スタイルは変更できません

カスタム転送内容

この記事で紹介するポイントです。

メールの内容データを自分が表示したいスタイルに変換します。上の画像の例のように。

まずは全体のフロー図を示します:

  • Gmail フィルターを使って転送するメールに識別ラベルを付ける

  • Apps Script が指定ラベルの付いたメールを定期取得する

  • メール内容の読み取り

  • 希望する表示スタイル

  • Slack Bot API または Incoming Webhook を使って Slack にメッセージを送信する

  • メールのラベルを削除(転送済みを示す)

  • 完了

まず、Gmailでフィルターを作成します

フィルターは、条件に合ったメールを受信した際に自動で以下のような処理を行うことができます:自動で既読にする、自動でタグを付ける、自動で迷惑メールに移動する、自動でカテゴリに振り分ける…などの操作

Gmail の右上にある詳細検索アイコンボタンをクリックし、転送したいメールの条件を入力します。例えば、送信元:[email protected] + 件名が is now available to test.。次に「Search」をクリックして、フィルタ結果が期待通りか確認します。正しければ、Search の隣にある「Create filter」ボタンをクリックします。

またはメール上部の「Filter message like these」をクリックして、フィルタ条件を簡単に作成できます

または、メールの上部にある「Filter messages like these」をクリックすると、フィルタ条件を素早く作成できます。

このボタンのデザインは非常に使いにくく、初めて探したときに全く見つけられませんでした。

次に、このフィルタ条件に一致するメールに対して行う動作を設定します。ここでは「ラベルを付ける」を選択し、新しい識別用ラベル「forward-to-slack」を作成します。「フィルタを作成」をクリックして完了です。

以降、このラベルが付けられたメールはすべて Slack に転送されます。

Incoming WebHooks アプリの URL を取得する

まず、Incoming WebHooks アプリを Slack チャンネルに追加します。これを通じてメッセージを送信します。

  1. Slack 左下の「Apps」->「Add apps」

  2. 右側の検索ボックスで「incoming」を検索してください。

  3. 「Incoming WebHooks」をクリックして、「Add」を選択してください。

メッセージを送信したいチャンネルを選択します。

最上部の「Webhook URL」をメモしてください

下にスクロールすると、メッセージ送信時に表示されるBotの名前とアイコンを設定できます。変更後は「Save Settings」を必ず押してください。

備考

公式では新しい Slack APP Bot API の chat.postMessage を使ってメッセージを送ることを推奨しています。簡単な Incoming Webhook は将来的に廃止される予定です。ここでは手抜きで使っていませんが、次章の「従業員リストのインポート」と組み合わせる場合は Slack App API を新しい方法に合わせて調整する必要があります。

Apps Script の作成

以下の基本プログラムを貼り付けて、あなたが望むバージョンに変更してください:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function sendMessageToSlack(content) {
    var payload = {
      "text": "*あなたにメールが届きました*",
      "attachments": [{
          "pretext": "メール内容は以下の通りです:",
          "text": content,
        }
      ]
    };
    var res = UrlFetchApp.fetch('貼上你的Slack incoming Webhook URL',{
      method             : 'post',
      contentType        : 'application/json',
      payload            : JSON.stringify(payload)
    })
}

function forwardEmailsToSlack() {
    // 参考:https://gist.github.com/andrewmwilson/5cab8367dc63d87d9aa5

    var label = GmailApp.getUserLabelByName('forward-to-slack');
    var messages = [];
    var threads = label.getThreads();
  
    if (threads == null) {
      return;
    }

    for (var i = 0; i < threads.length; i++) {
        messages = messages.concat(threads[i].getMessages())
    }

    for (var i = 0; i < messages.length; i++) {
        var message = messages[i];
        Logger.log(message);

        var output = '*新着メール*';
        output += '\n*送信者:* ' + message.getFrom();
        output += '\n*宛先:* ' + message.getTo();
        output += '\n*CC:* ' + message.getCc();
        output += '\n*日付:* ' + message.getDate();
        output += '\n*件名:* ' + message.getSubject();
        output += '\n*本文:* ' + message.getPlainBody();

        sendMessageToSlack(output);
   }

   label.removeFromThreads(threads);
}

上級:

EX:Testflight 審査成功メール内のバージョン番号情報を取得する例:

メール件名:あなたのアプリ XXX はベータテストの承認を受けました。

メール内容:

私たちは Bundle Version Short String と Build Number の後の値 を取得したいです。

1
2
3
4
5
6
7
var results = subject.match(/(Bundle Version Short String: ){1}(\S+){1}[\S\s]*(Build Number: ){1}(\S+){1}/);
if (results == null \\|\\| results.length != 5) {
  // 無効です
} else {
  var version = results[2];
  var build = results[4];
}

実行してみる

  • Gmail に戻り、適当なメールを選んで手動でラベル「forward-to-slack」を付けます。

  • Apps Script のコードエディタで「forwardEmailsToSlack」を選択し、「実行」ボタンをクリックしてください

「Authorization Required」が表示されたら、「Continue」をクリックして認証を完了してください。

認証の過程で「Google hasn’t verified this app」という表示が出ることがありますが、これは正常です。私たちが作成した App Script は Google の認証を受けていないためです。しかし、自分用に作成したものなので問題ありません。

左下の「Advanced」→「Go to ForwardEmailsToSlack (unsafe)」をクリックしてください。

「Allow」をクリックしてください

転送成功!!!

トリガー(スケジュール)設定による自動チェック&転送

Apps Script の左側メニューで「トリガー」を選択します。

左下の「+ 新しいトリガーを追加」。

  • エラー通知設定:スクリプト実行中にエラーが発生した場合の通知方法を設定できます

  • 実行したい機能を選択してください:メイン機能である sendMessageToSlack を選択してください

  • アクティビティのソース選択:カレンダーまたは時間駆動(定期または指定)から選べます

  • 時間型トリガー条件の選択:特定の日付に実行するか、分/時/日/週/月ごとに一回実行するか選べます

  • 分/時/日/週/月の間隔を選択:例:毎分、15分ごと…

ここではデモとして1分ごとに実行する設定にしていますが、メールのリアルタイム性を考えると1時間ごとにチェックするだけで十分だと思います。

  • 再び Gmail に戻り、適当なメールを選んで手動でラベル「forward-to-slack」を付けます。

  • スケジュールトリガーの待機

自動チェック&転送成功!

完了

この機能により、カスタマイズしたメール転送処理が可能になり、さらにトリガーとしても利用できます。例えば、XXXのメールを受信したときに自動で特定のスクリプトを実行するなどです。

第一章の起源に戻ると、この仕組みを使って CI/CD プロセスを改善できます。アップルの処理完了をただ待つ必要がなく、自動化プロセスと連携できます!

関連記事

ご質問やご意見がございましたら、こちらからご連絡ください

Post MediumからZMediumToMarkdownを使って変換。


🍺 Buy me a beer on PayPal

👉👉👉 Follow Me On Medium! (1,053+ Followers) 👈👈👈

本記事は Medium にて初公開されました(こちらからオリジナル版を確認)。ZMediumToMarkdown による自動変換・同期技術を使用しています。

Improve this page on Github.

本記事は著者により CC BY 4.0 に基づき公開されています。