LANG SELRCT

Google Apps Scriptのコードを書く場所  (新規作成: スプレッドシート | スクリプトエディタ

2020年6月28日日曜日

大量のGmailをスクリプトでアーカイブしたい


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

最新の投稿

Pixel 5でSuicaが使えないときはGoogle PayでSuicaを有効にしてみる

Pixel 5への機種変でSuicaが使えない人向けに書きました。 MISSION Pixel 5でSuicaを使えるようにする SOLUTION 旧端末で機種変更の設定を行う NFCをオンにする Google PayでSuicaを有効にする PROBLEMS 以前...