Gmailのスレッド関連で調べたことを備忘録として書いておきます

先日、GmailからGoogle Apps Scriptを使ってGoogleスプレッドシートに書き込むスクリプトを書く仕事の話をしましたが、スレッド関連で調べたことを備忘録として書いておきます。

一つひとつはよく知られている情報だと思います。

取得するメールは、あるWebサイトのメールフォームからGmailに転送されて来ます。

例えば今日は2月2日でスレッドのスタートが2月1日のメール、そこに2月2日のメールがくっ付いているとします。

このスレッドのメールは、「昨日」を指定してもゴミ箱に移らず、「今日」を指定してもサーチできません。

なので、ゴミ箱に移すには「今日以前」を指定してスレッドを全部移すしかありません。一度に削除できるのは最大100件までらしいのでこんな感じ。

var myThreads = GmailApp.search('older_than:0d', 0, 99);
GmailApp.moveThreadsToTrash(myThreads);

実際にはトリガーを使って下の方法でGoogleスプレッドシートに書き込んで行くのですが、上記の削除は毎日深夜にトリガーで実行します。

仮にこのスレッドをゴミ箱に移したあと、スレッドに続くはずのメールが来たとします。

このメールも「今日」を指定してもサーチできないので、「昨日以降」を指定してゴミ箱の情報まで含めてサーチすることになります。こんな感じ。

var myThreads = GmailApp.search('subject:メールの件名 after:2019/02/01', 0, max);
var myMsgs = GmailApp.getMessagesForThreads(myThreads);
var myDate = [];
var myBody = [];
for(var i = 0;i < myMsgs.length;i++){
  for(var j = 0;j < myMsgs[i].length;j++){
    myDate[j] = myMsgs[i][j].getDate();
    myBody[j] = myMsgs[i][j].getPlainBody();
    // 何かの処理
  }
}

Gmailサーチの件数制限は1日2万回のようです。

スクリプトではゴミ箱のスレッドを削除できないようなので、定期的に手動で削除する必要があります。

あとは、Googleスプレッドシートに書き込み済みのメールの最終タイムスタンプとmyDate[j]を比較して、最終タイムスタンプよりあとのメールを書き込んで行けばいいですね。