Gmail の中から特定条件に合う未読メールをピックアップし、Chatwork へ自動通知する仕組みを Google Apps Script(GAS) で組んでみました。
たとえば、以下のようなケースで便利です。
- 特定のアドレスに届いた問い合わせメールをチームに共有したい
- 外部からのレポート/エラー通知メールを逃さずリアルタイムで監視したい
- 外出先でも Chatwork だけ見ればメール状況を把握したい
今回は「受信トレイにあり、宛先が メールアドレス
で、未読のメールを最大 20 件まで取得して、全員宛で Chatwork へ投稿」という想定です。
もちろん、検索クエリを変更すれば、ほかの条件にも応用できます。
目次
実行イメージ
- Gmail の受信トレイに「宛先:
メールアドレス
」の新着メールが届く - Google Apps Script が定期的にチェックし、「未読メール」があれば Chatwork にメッセージ投稿
- メッセージには「差出人」「宛先」「CC」「BCC」「件名」「本文」を含め、受信メールの概要をそのまま通知
- 通知後はそのメールを自動で「既読」にして二重通知を防止
コード全文
以下のコードを Google Apps Script のエディタに貼り付けてください。
GAS プロジェクトの作成方法やトリガー設定などの詳細は後述します。
/***** Chatwork用設定 *****/
var apiToken = "***"; // ChatworkのAPIトークン
var roomId = "***"; // ChatworkのルームID
function myFunction() {
// 「受信トレイ」にあり、「宛先が ***」で、「未読」のメールを最大20スレッド分取得
// - 'in:inbox' で受信トレイ限定
// - 'to:~' で宛先を絞り込み
// - 'is:unread' で未読限定
// - (0,20) => 先頭から20スレッド分を取得
var threads = GmailApp.search("in:inbox to:*** is:unread", 0, 20); // メールアドレス
// 取得したスレッドを順番に処理
for (var i = 0; i < threads.length; i++) {
var messages = threads[i].getMessages(); // スレッド内のメールをすべて取得
for (var j = 0; j < messages.length; j++) {
var msg = messages[j];
// 未読のみを対象
if (msg.isUnread()) {
// 各種情報を取得
var from = msg.getFrom();
var to = msg.getTo();
var cc = msg.getCc();
var bcc = msg.getBcc();
var subject = msg.getSubject();
var body = msg.getPlainBody();
// Chatworkに送るメッセージを作成
var postMessage =
"差出人(From) : " + from + "\n" +
"宛先(To) : " + to + "\n" +
"宛先(Cc) : " + cc + "\n" +
"宛先(Bcc) : " + bcc + "\n" +
"件名 : " + subject + "\n" +
"本文:\n" + body;
// Chatworkに投稿
postChatWork(postMessage);
// 投稿後は既読にする
msg.markRead();
}
}
}
}
/**
* Chatworkにメッセージを送信する関数
* ルーム内の全員宛てに通知したい場合、メッセージ先頭に [toall] を入れる
*/
function postChatWork(message) {
var url = "https://api.chatwork.com/v2/rooms/" + roomId + "/messages";
var payload = {
"body": "[toall]\n" + message
};
var options = {
"method" : "post",
"headers": {"X-ChatWorkToken": apiToken},
"payload": payload
};
var response = UrlFetchApp.fetch(url, options);
var json = JSON.parse(response.getContentText());
Logger.log(json); // レスポンスを確認したい場合にログ出力
}
コードのポイント
apiToken
とroomId
- ChatworkのAPI トークンと投稿先ルームIDを設定する必要があります。
- ChatworkのAPI設定画面などから取得したトークンを貼り付けてください。
- 検索クエリ:
"in:inbox to:***(メールアドレス) is:unread"
in:inbox
: 受信トレイのみto:
: 宛先がこのメールアドレスのもの***(メールアドレス)
is:unread
: 未読メール(0,20)
: 検索結果の先頭から 20 スレッドを取得
postChatWork(message)
body
の先頭に[toall]
とつけることで、Chatwork ルーム全員宛にメンションが付きます。
手順
- GAS プロジェクトを新規作成
- Google Drive か Script.google.com を開き、新規プロジェクトを作成
- エディタに上記のソースコードをコピペ
- Chatwork API トークンを取得
- Chatwork の APIキー(Personal Token)を事前に発行しておきます
- ソースコードの
apiToken
に貼り付ける
- Chatwork ルームID を確認
- Chatwork の URL を見ると、
https://www.chatwork.com/#!rid12345678
のようにルームIDが含まれています - ソースコードの
roomId
に指定
- Chatwork の URL を見ると、
- 実行テスト
- エディタ上部の「実行」ボタンを押して、
myFunction()
を手動実行してみる - 受信トレイに上記条件(宛先 =
、未読)を満たすメールがあれば、Chatwork へ転送されることを確認***(メールアドレス)
- エディタ上部の「実行」ボタンを押して、
- 時間ベースのトリガーを設定
- 定期的にこのスクリプトを走らせることで、リアルタイムに近い形でメールが転送されます
- 「編集 > 現在のプロジェクトのトリガー」から、
myFunction()
を 1分間隔 or 5分間隔 などで設定すると便利
応用
- 件名や本文の一部だけ抜粋したい
- 例えば、本文冒頭100文字だけ取り出すなど、
body.substring(0, 100)
で文字数を制限
- 例えば、本文冒頭100文字だけ取り出すなど、
- ファイル添付の扱い
msg.getAttachments()
で添付ファイルを取得可能。必要に応じて Google Drive に保存したり、Chatwork のファイルアップロードAPIを呼び出して転送したりもできます。
- Gmail の検索クエリを柔軟に変更
- 例:
"label:重要 is:unread"
など、ラベルを使った絞り込み - 例:
"subject:エラー報告 newer_than:1d"
など、件名や日付条件を指定
- 例:
まとめ
- 本スクリプトを使えば、Gmail の特定メールを Chatwork に自動通知でき、さらに通知後はメールを既読にして二重転送を防止します。
- シンプルな構成なので変更も容易で、使い勝手がよいです。
- デバッグ時には、
Logger.log()
で情報を出力して確認しながら進めるとスムーズです。
以上で、Gmail 未読メールを自動転送して Chatwork へ通知する仕組みの解説でした。
ぜひご活用ください。