Google Apps ScriptでGmailをSlackに自動転送|フィルター連携で効率化
GmailのフィルターとGoogle Apps Scriptを活用し、受信メールを自動でSlackチャンネルにカスタマイズ転送。手動作業を削減し、情報共有を即時化する方法を解説。
本記事は AI による翻訳をもとに作成されています。表現が不自然な箇所がありましたら、ぜひコメントでお知らせください。
記事一覧
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 サーバー: 同時ビルド数と最大実行時間を90分に制限。90分は十分ですが、1つのビルドが詰まると他の人の実行を妨げます。
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 を取得する
まず、Incoming WebHooks アプリを Slack チャンネルに追加します。これを通じてメッセージを送信します。
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
以下の基本プログラムを貼り付けて、あなたが望むバージョンに変更してください:
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);
}
上級:
Javascript の正規表現マッチ関数を使って、メールの内容をマッチングして取得できます。
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を使って変換。
本記事は Medium にて初公開されました(こちらからオリジナル版を確認)。ZMediumToMarkdown による自動変換・同期技術を使用しています。



























