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

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

-
Bitrise CI Server: 同時に実行できるビルド数と最大実行時間を90分に制限しています。90分は十分ですが、一つのビルドが詰まると他の人の実行を妨げてしまいます。
-
Travis CI サーバー: ビルド時間に応じて課金されるため、待つことはできません。お金が無駄になります。
視点を変えてみる
待たずに、アップロード完了後すぐに終了!処理済みのメール通知で次のアクションをトリガー。

ただ最近このメールが届かなくなりました。設定の問題か、Appleがこの種の通知を送らなくなったのか分かりません。
本文では、Testflightのテスト開始通知メールを例に説明します。


全体の流れは上図の通りで、原理的には可能です。しかし、本記事の主題ではないため、ここでは受信したメールを Apps Script で Slack チャンネルに転送する部分に焦点を当てます。
受信したメールを Slack チャンネルに転送する方法
有料・無料のSlackプロジェクト問わず、さまざまな方法でEmailをSlackのチャンネルやDMに転送する機能を実現できます。
公式ドキュメントを参考に設定してください:メールを Slack に送信する
どの方法でも効果は以下の通りです:

デフォルトでメール内容は折りたたまれており、クリックすると全文が表示されます。
メリット:
-
簡単で迅速
-
技術不要の敷居
-
リアルタイム転送
欠点:
-
内容をカスタマイズできません
-
表示スタイルは変更できません
カスタム転送内容
この記事で紹介するポイントです。

メールの内容データを自分が表示したいスタイルに変換します。上図の例のように。
まずは全体の動作フローチャートを示します:

-
Gmail フィルターを使って転送するメールに識別用ラベルを付ける
-
Apps Script が定期的に該当ラベルが付いたメールを取得する
-
メール内容を読み取る
-
希望する表示スタイルを作成する
-
Slack Bot API または Incoming Webhook を使って Slack にメッセージを送信する
-
メールのラベルを削除(転送済みを示す)
-
完了
まず、Gmailでフィルターを作成します
フィルターは、条件に合致するメールを受信した際に、自動で以下のような処理を行うことができます。例えば、自動で既読にする、自動でタグを付ける、自動で迷惑メールに移動する、自動でカテゴリに振り分ける…などの操作です。

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

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

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

次に、このフィルタ条件に一致するメールに対して行う動作を設定します。ここでは「ラベルを付ける」を選び、新しい識別用ラベル「forward-to-slack」を作成します。「フィルタを作成」をクリックして完了です。
以降、このラベルが付けられたメールはすべて Slack に転送されます。
Incoming WebHooks アプリの URL を取得する
まず、Slack チャンネルに Incoming WebHooks アプリを追加します。これを通じてメッセージを送信します。

-
Slack 左下の「Apps」->「Add apps」
-
右側の検索ボックスで「incoming」を検索してください。
-
「Incoming WebHooks」をクリックしてから「Add」を選択してください。


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

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

下にスクロールして、メッセージ送信時に表示されるBotの名前とプロフィール画像を設定できます。変更後は「Save Settings」を必ず押してください。
備考
公式の推奨としては、新しい Slack APP Bot API の chat.postMessage を使ってメッセージを送信することです。簡単な Incoming Webhook は将来的に廃止される予定ですが、ここでは手軽さから使用していません。次章の「社員リストのインポート」と合わせて、Slack App API を新しい方法に調整する必要があります。

Apps Script プログラムの作成
-
左上の「新しいプロジェクト」をクリックしてください
-
作成後、プロジェクト名をクリックして名前を変更できます。例:ForwardEmailsToSlack
以下の基本プログラムを貼り付けて、あなたの希望するバージョンに変更してください:
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);
}
上級編:
-
Javascript の正規表現マッチ関数を使って、メールの内容から必要な情報を抽出できます。
EX:Testflightの審査通過メールからバージョン番号情報を抽出する例:
メール件名:あなたのアプリ XXX がベータテスト用に承認されました。
メール内容:

私たちは Bundle Version Short String と Build Number の後の値 を取得したいです。
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];
}
output:
version = 3.37.0
build = 2
-
正規表現が正しいかオンラインでテストするには、こちらのサイトを使用してください。
実行してみる
-
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 の左側メニューで「トリガー」を選択します。

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

-
エラー通知設定:スクリプト実行中にエラーが発生した場合、どのように通知するか設定できます
-
実行したい機能を選択してください:Main Function
sendMessageToSlackを選択してください -
アクティビティのソース選択:カレンダーまたは時間駆動(定期または指定)から選択可能
-
時間型トリガー条件の選択:特定の日付に実行するか、毎分・毎時・毎日・毎週・毎月に一回実行するかを選択可能
-
分/時/日/週/月の間隔を選択:例)毎分、15分ごと…
ここではデモとして1分ごとに実行する設定にしていますが、メールの即時性を考えると1時間ごとにチェックするだけで十分だと思います。

-
再び Gmail に戻り、適当なメールを選んで手動でラベル「forward-to-slack」を付けます。
-
スケジュールトリガーの待機
自動チェック&転送成功!
完了
この機能を使うことで、カスタマイズしたメール転送処理が可能になり、さらにトリガーとしても利用できます。例えば、XXXのメールを受信したときに自動で特定のスクリプトを実行するなどです。
第一章の起源に戻ると、この仕組みを使ってCI/CDのプロセスを改善できます。アップルの処理をただ待つ必要がなく、自動化プロセスと連携できます!
関連記事
Post Mediumから変換 by ZMediumToMarkdown.



コメント