LANG SELRCT

Apps Script Reference  (Create: Create new Spreadsheet | Create new Apps Script

Sunday, June 28, 2020

大量の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

Latest post

スプレッドシートA列にある複数のテキストをスライドに追加したい(Google Apps Script)

今回Google Apps Scriptでやりたいこと GoogleスプレッドシートA列にある複数の値を取得して Googleスライドに渡して 図形オブジェクトのテキストとして追加したい ① スプレッドシートのA列に値を入れておく ② Code.gsのinsertNewShape...