新しいGメールを受信したとき、本文中に過去メールと同じ注文番号があったなら、その過去メールにつけたラベルと同じにする・・・言葉での説明さえも難しい・・・ということがしたかったのですが、難しすぎてフィルタの限界を超えるので、GASのスクリプト制作をChatGTPに頼んだら、すぐにできた。
素晴らしい。。
// Gmailで受信したラベルが全くついていない新メールの本文に「(例)ご注文番号: 121220」という内容があれば、
// 過去に受信したメールのタイトル「(例)ご注文(#121220)」を検索し、ヒットしたら、過去メールについているラベルと同じものを新メールにつける
// ラベルを新しいメールに適用する際に「amazon」「other」のラベルが含まれていたら除外する
function applyLabelsToNewEmails() {
// 次の条件を満たすメールスレッドを最大50件取得します:
// 1.「受信トレイ」
// 2.amazon 等のラベルは付いていない
// const threads = GmailApp.search("(label:inbox OR label:楽天 OR label:Yahoo) -label:{楽天 Yahoo} is:unread", 0, 50);// 最大50件のスレッドを取得
const threads = GmailApp.search("(label:inbox) -label:{amazon other} is:unread ", 0, 50);// 最大50件のスレッドを取得
threads.forEach((thread) => {
const messages = thread.getMessages();
messages.forEach((message) => {
const body = message.getPlainBody();
const subject = message.getSubject();
// メール本文またはタイトルに注文番号が含まれているかチェック
const bodyMatch = body.match(/ご注文番号:\s*(\d+)/);
const subjectMatch = subject.match(/\[(\d+)\]/);
const orderNumber = bodyMatch ? bodyMatch[1] : subjectMatch ? subjectMatch[1] : null;
// console.log(orderNumber)
if (orderNumber) {
// 過去のメールを検索
const searchQuery = `subject:"ご注文(#${orderNumber})" OR [受注番号] ${orderNumber}"`;
const pastThreads = GmailApp.search(searchQuery);
// console.log(searchQuery)
if (pastThreads.length > 0) {
const pastLabels = pastThreads[0].getLabels();
// 除外するラベルリスト
const excludedLabels = ["amazon"];
// ラベルを新しいメールに適用(除外リストを考慮)
pastLabels.forEach((label) => {
if (!excludedLabels.includes(label.getName())) {
thread.addLabel(label);
}
});
}
}
});
});
}