コードを書いた背景
- 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