コードを書いた背景
- Gmailの受信トレイに数万件溜まっていた
- 画面上でぽちぽちアーカイブするには大変な量だった
- コードで自動化する方法を考えて試した
一発でアーカイブしたかったけれど、以下の制約にぶつかり、トリガーで実行しました。
ぶつかった制約
- スレッドの取得はMaxで500件まで
- moveThreadsToArchiveできるのはMaxで100件まで
これを踏まえて、以下のコード.gsの archiveGmail() をトリガーに設定して自動アーカイブを試みました。
試運転してみて、500件処理するのに300秒くらいかかったため、5分おきのトリガーで実行しました。
補足:
途中で1日の実行制限を超えてしまったのか他の原因か、「Gmail の操作を行うことはできません。」というエラーが出てしまい、それ以上処理ができなくなりました。
残りが5000件くらいだったので、画面上でアーカイブして、受信トレイを空にすることができました。
コード.gs
/************************************
これを5分おきのトリガーに設定して実行して
thredsがなくなるとdeleteTriggerでトリガー自動削除
作業時間外で実行しないと、受信したメールが全てアーカイブされるので注意
************************************/
function archiveGmail() {
var start = 0;
var end = 100;
var add = 100;
var query = 'in:inbox';// ここで対象を絞れる
var threads = GmailApp.search(query);
if(threads.length > 0) {// threadsがあれば
for(var j = 0; j < 5; j++) {// maxで500件まで取得できるGmailAppの仕様らしい
console.log(j);
var threads100 = [];// 100threadsを入れる配列
if(threads.length < end) {// threadsがendの数より小さければ
end = threads.length;// endの数値を入れ換える
}
for(var i = start; i < end; i++) {// maxで100件まで処理できるGmailAppの仕様らしい
console.log([i, threads[i].getFirstMessageSubject()]);
threads100.push(threads[i]);
}
GmailApp.moveThreadsToArchive(threads100);// 100threadsをアーカイブする
start = start + add;
end = end + add;
}
} else {// 処理が完了して全てのスレッドがアーカイブできた
deleteTrigger("archiveGmail");// トリガーを削除する
console.log("trigger deleted");
}
}
/************************************
トリガーをfunctionNameを指定して削除する
************************************/
function deleteTrigger(functionName) {
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
if (allTriggers[i].getHandlerFunction() == functionName) {
ScriptApp.deleteTrigger(allTriggers[i]);
break;
}
}
}
|
参考
Gmail Service