GoogleAppsScript
gmail

Google Apps ScriptでGmailの情報を取得する際に、受信日時を細かく指定する方法。

やりたいこと

Google Apps Scriptを使ってGmailの情報を取得する際に、受信日時を細かく(分単位)で指定したい。

それでができると何が良いの?

スクリプトに重複取得時の挙動を書く必要がなくなります。

Gmailから定期的に該当するメールを検索して取得するスクリプトにおいて、抽出対象の時間とトリガーの時間を一致させます。
そうすることで、同じメールが重複して取得されることがないため、後続での重複制御が不要になります。(たぶん)

例)
検索条件:受信日時が今から5分前
トリガー:5分毎に実行

完成したコード

Code.gs
function searchMail(){

  // Gmailから特定条件のスレッドを検索しメールを取り出す
   //受信日時指定
  const date = new Date() ;//現在時刻を取得
  const unixTime = date.getTime();//UNIX TIMEに変換
  const now = Math.floor(unixTime/1000); //ミリ秒を秒に変換
  const term = now - 300; //現在時刻から5分(300秒)前
  const termStr = term.toString(); //検索期間を文字列に変換
   //検索条件指定
  const srchCondition = [ //検索条件を配列で格納
  '(検索条件その1)',
  '(検索条件その2)'  
  ].join("\u0020"); //半角スペースで連結

  const strTerms = 'after:'+ term +' '+ srchCon; //検索条件:termの期間に、srchConの条件に合致するメール
  const myThreads = GmailApp.search(strTerms, 0, 30); //条件にマッチしたスレッドを取得
  const myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する

/**
あとは取得した情報を煮るなり焼くなりする。
**/
}

コードの説明

前段:Gmailの検索条件について

Gmailのヘルプには、日付単位での指定方法しか書いてありません。

説明 検索演算子と例
指定した期間に送信されたメールを検索します after:
before:
older:
newer:
例: after:2004/04/16
例: before:2004/04/18
日(d)、月(m)、年(y)を指定して、それより古いメールか新しいメールを検索します older_than:
newer_than:
例: newer_than:2d

しかしながら、UNIX時間(エポック時間)を指定して検索することもできるので、これを利用します。
Gmail非公開テクニック:時間帯を指定してメール検索 | ライフハッカー[日本版]

Gmail検索において「after」「before」のパラメータを先ほどのエポック時間で入力し、メールの検索を>します。すると、特定した2つの時間の間に受信したメールが表示されるのです。

コードの中身の説明

Code.gs
function searchMail(){

  // Gmailから特定条件のスレッドを検索しメールを取り出す
   //受信日時指定
  const date = new Date() ;//現在時刻を取得
  const unixTime = date.getTime();//UNIX時間に変換
  const now = Math.floor(unixTime/1000); //ミリ秒を秒に変換

コメントに書いてある通りの内容ですが、getTimeで取得したUNIX時間はミリ秒で返ってくるので、秒に変換するのがポイントです。

Code.gs
   //検索条件指定
  const srchCondition = [ //検索条件を配列で格納
  '(検索条件その1)',
  '(検索条件その2)'  
  ].join("\u0020"); //半角スペースで連結

受信日時だけ指定することもあまりないと思うので、検索条件も指定しておきます。
一行でつらつら書いても良いのですが、配列で書くと見やすいです。

Code.gs
  const strTerms = 'after:'+ term +' '+ srchCon; //検索条件:termの期間に、srchConの条件に合致するメール
  const myThreads = GmailApp.search(strTerms, 0, 30); //条件にマッチしたスレッドを取得
  const myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する

「after:(UNIX時間)(検索条件)」でメールの検索をして、結果を取得しています。
あとはここから必要な情報を取り出して、煮るなり焼くなり調理してもらえればOKです。

関連URL