gm-transfer
GoogleのApps Scripthttps://script.google.com/で、ClassroomからのGmailを転送するスクリプトです。Geminiに生成してもらいました。
設定
- Apps Scriptの設定ページ(https://script.google.com/home/)にアクセス。
- 左上の新しいプロジェクトから新規プロジェクト作成。
- コード.gsに下のコードを貼り付け。searchQueryとforwardToをお好みで設定。ラベルも好みで。
- searchQueryはGmailの検索と同じだった気がする。
- サービスにGmailを追加。
- ちょっと
forwardClassroomEmails実行してみて問題なさそうだったらこの関数にトリガー設定して寝る。- 最初は一件だけメール送って、通ってるか確認してからにした方がいい(経験者は云々)。
- Classroomのメールがスレッドになることが観測上ほぼないため、スレッドの転送がうまくできてるかわはかりません。
コード
/**
* 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