【コード付き】GASでGmail の未読メールを自動でChatworkに通知する方法

  • URLをコピーしました!

Gmail の中から特定条件に合う未読メールをピックアップし、Chatwork へ自動通知する仕組みを Google Apps Script(GAS) で組んでみました。

たとえば、以下のようなケースで便利です。

  • 特定のアドレスに届いた問い合わせメールをチームに共有したい
  • 外部からのレポート/エラー通知メールを逃さずリアルタイムで監視したい
  • 外出先でも Chatwork だけ見ればメール状況を把握したい

今回は「受信トレイにあり、宛先が メールアドレス で、未読のメールを最大 20 件まで取得して、全員宛で Chatwork へ投稿」という想定です。
もちろん、検索クエリを変更すれば、ほかの条件にも応用できます。

目次

実行イメージ

  1. Gmail の受信トレイに「宛先: メールアドレス」の新着メールが届く
  2. Google Apps Script が定期的にチェックし、「未読メール」があれば Chatwork にメッセージ投稿
  3. メッセージには「差出人」「宛先」「CC」「BCC」「件名」「本文」を含め、受信メールの概要をそのまま通知
  4. 通知後はそのメールを自動で「既読」にして二重通知を防止

コード全文

以下のコードを 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); // レスポンスを確認したい場合にログ出力
}

コードのポイント

  • apiTokenroomId
    • ChatworkのAPI トークンと投稿先ルームIDを設定する必要があります。
    • ChatworkのAPI設定画面などから取得したトークンを貼り付けてください。
  • 検索クエリ: "in:inbox to:***(メールアドレス) is:unread"
    • in:inbox: 受信トレイのみ
    • to:***(メールアドレス) : 宛先がこのメールアドレスのもの
    • is:unread: 未読メール
    • (0,20): 検索結果の先頭から 20 スレッドを取得
  • postChatWork(message)
    • body の先頭に [toall] とつけることで、Chatwork ルーム全員宛にメンションが付きます。

手順

  1. GAS プロジェクトを新規作成
    • Google Drive か Script.google.com を開き、新規プロジェクトを作成
    • エディタに上記のソースコードをコピペ
  2. Chatwork API トークンを取得
    • Chatwork の APIキー(Personal Token)を事前に発行しておきます
    • ソースコードの apiToken に貼り付ける
  3. Chatwork ルームID を確認
    • Chatwork の URL を見ると、https://www.chatwork.com/#!rid12345678 のようにルームIDが含まれています
    • ソースコードの roomId に指定
  4. 実行テスト
    • エディタ上部の「実行」ボタンを押して、myFunction() を手動実行してみる
    • 受信トレイに上記条件(宛先 =***(メールアドレス) 、未読)を満たすメールがあれば、Chatwork へ転送されることを確認
  5. 時間ベースのトリガーを設定
    • 定期的にこのスクリプトを走らせることで、リアルタイムに近い形でメールが転送されます
    • 「編集 > 現在のプロジェクトのトリガー」から、myFunction() を 1分間隔 or 5分間隔 などで設定すると便利

応用

  • 件名や本文の一部だけ抜粋したい
    • 例えば、本文冒頭100文字だけ取り出すなど、body.substring(0, 100) で文字数を制限
  • ファイル添付の扱い
    • msg.getAttachments() で添付ファイルを取得可能。必要に応じて Google Drive に保存したり、Chatwork のファイルアップロードAPIを呼び出して転送したりもできます。
  • Gmail の検索クエリを柔軟に変更
    • 例: "label:重要 is:unread" など、ラベルを使った絞り込み
    • 例: "subject:エラー報告 newer_than:1d" など、件名や日付条件を指定

まとめ

  • 本スクリプトを使えば、Gmail の特定メールを Chatwork に自動通知でき、さらに通知後はメールを既読にして二重転送を防止します。
  • シンプルな構成なので変更も容易で、使い勝手がよいです。
  • デバッグ時には、Logger.log() で情報を出力して確認しながら進めるとスムーズです。

以上で、Gmail 未読メールを自動転送して Chatwork へ通知する仕組みの解説でした。
ぜひご活用ください。

  • URLをコピーしました!
目次