gm-transfer

GoogleのApps Scripthttps://script.google.com/で、ClassroomからのGmailを転送するスクリプトです。Geminiに生成してもらいました。

設定

コード

/**
 * Google Classroomからの未転送メールを指定のアドレスに転送します。
 * * 処理は2段階で行われます。
 * 1. 未処理のスレッド(Forwardedラベルなし)を検索し、全メールを転送・既読化し、スレッドにラベルを付与。
 * 2. 処理済みスレッド(Forwardedラベルあり)に追加された未読メールを検索し、未読分のみ転送・既読化。
 * * 正常動作時はログを出力せず、エラー発生時のみログに記録します。
 */
function forwardClassroomEmails() {

  // --- 設定項目 ---
  const RECIPIENT_EMAIL = '転送先メールアドレス'; // ★★★ 転送先メールアドレス
  const FORWARDED_LABEL_NAME = 'Forwarded';
  const BASE_QUERY = `from:classroom.google.com after:2025/09/17`;
  // --- 設定ここまで ---

  try {
    const label = GmailApp.getUserLabelByName(FORWARDED_LABEL_NAME) || GmailApp.createLabel(FORWARDED_LABEL_NAME);

    // --- 処理1: 未処理の新規スレッド ---
    const newThreadsQuery = `${BASE_QUERY} -label:${FORWARDED_LABEL_NAME}`;
    const newThreads = GmailApp.search(newThreadsQuery);

    if (newThreads.length > 0) {
      // 古いスレッドから処理
      for (let i = newThreads.length - 1; i >= 0; i--) {
        const thread = newThreads[i];
        const messages = thread.getMessages();

        // スレッド内のメッセージを古い順に処理
        for (let j = 0; j < messages.length; j++) {
          const message = messages[j];
          message.forward(RECIPIENT_EMAIL);
          message.markRead(); // 既読にする
          Utilities.sleep(500); 
        }
        thread.addLabel(label); // スレッドにラベル付け
      }
    }

    // --- 処理2: 処理済みスレッドへの追加メール ---
    const updatedThreadsQuery = `${BASE_QUERY} label:${FORWARDED_LABEL_NAME} is:unread`;
    const updatedThreads = GmailApp.search(updatedThreadsQuery);

    if (updatedThreads.length > 0) {
      // 古いスレッドから処理
      for (let i = updatedThreads.length - 1; i >= 0; i--) {
        const thread = updatedThreads[i];
        const messages = thread.getMessages();

        // スレッド内のメッセージを古い順に処理
        for (let j = 0; j < messages.length; j++) {
          const message = messages[j];

          // 未読のメッセージ(=新しく追加されたメール)のみ転送
          if (message.isUnread()) {
            message.forward(RECIPIENT_EMAIL);
            message.markRead(); // 既読にする
            Utilities.sleep(1000);
          }
        }
      }
    }

  } catch (e) {
    // エラーが発生した場合のみ、ログに記録
    Logger.log(`[Classroom転送エラー] ${e.message} (Stack: ${e.stack})`);
    // (オプション) エラー発生をメールで通知する場合
    // GmailApp.sendEmail('通知したいメールアドレス', 'Classroom転送スクリプト エラー', `エラーが発生しました:\n${e.message}\n${e.stack}`);
  }
}

ライセンス

MITです。

その他

なにかあればメールrc-2166-m@15km.jpもしくはSNSの個チャ/DM等まで。

更新履歴

2025/11/22 .forward()を使うようにしました。(元々は本文をコピーしていた。)
2024/11/26 初版

2025/11/22 rc-2166-m@15km.jp