LoginSignup
28
37

More than 5 years have passed since last update.

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

Posted at

やりたいこと

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

28
37
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
37