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()を手動実行してみる
- 受信トレイに上記条件(宛先 =***(メールアドレス)
 
- エディタ上部の「実行」ボタンを押して、
- 時間ベースのトリガーを設定
- 定期的にこのスクリプトを走らせることで、リアルタイムに近い形でメールが転送されます
- 「編集 > 現在のプロジェクトのトリガー」から、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 へ通知する仕組みの解説でした。
ぜひご活用ください。


