lisz-works

技術と興味の集合体

GASでGmailの受信メールを定期的にチェック&処理!

【スポンサーリンク】

Google Apps Script

GASでメールをチェックを定期的に実行する方法についてです!

受信メールの検索

作成したソースはこちらです。

// 検索ワードでヒットした最初のメール情報を返す
function getMailInfo(gmailSearchString) {
  // 検索文字列でヒットした一覧(スレッド)をサーチする
  const threads = GmailApp.search(gmailSearchString, 0, 1); //最新の一件
  const latestMail = GmailApp.getMessagesForThreads(threads)[0][0];
  // メール情報
  const mailInfo = {
    "id": latestMail.getId(),
    "date": latestMail.getDate(),
    "body": latestMail.getPlainBody(),
  };
  return mailInfo;
}

検索はスレッドに対して行われる

「特定のメールを検索!」ということでなく、Gmailの検索バーで検索したときに表示される一覧(スレッド)を取得するようなイメージのようです。

なので今回のように、「スレッドの先頭を!」という目的でない場合、

const threads = GmailApp.search(gmailSearchString, 0, 1); //最新の一件
const latestMail = GmailApp.getMessagesForThreads(threads)[0][0];

この辺での情報を順次処理して、対象のメールをサーチする必要がありそうです。

もし自分用のスクリプトなのであれば

  1. Gmail側で、特定のラベルを自動でつける用に設定
  2. GASでそのラベルをサーチ→処理

とした方が、処理のコストが少ない気がします。

試しに実行する

function testCheckMail() {
  const gmailSearchString = "label:me ";
  const mailInfo = getMailInfo(gmailSearchString);
  Logger.log(mailInfo)
}

実行すると、{ id, date, body }の形式でメールの情報が取得できました。

[20-02-18 19:48:43:192 JST] {date=Tue Feb 18 19:48:35 GMT+09:00 2020, id=xxxxxxxxxxxxxxxx, body=これはテストです。
}

自分から自分への返信はコレではヒットしない

実験していてわかったのですが、返信メールはこれではヒットしないようです。

試したのは

  1. メールを送る(メール#1)
  2. メールへ返信(メール#2)

としたとき、時間的にあとで送信したはずのメール#2でなく、メール#1が取得されました。

返信メールは、ちょっと性質が異なるのかもしれません。

今回やりたいことでは不要だったので、深堀りはしませんでしたが、必要になったときは別途調査が必要そうです。

実行時の許可

実行すると、権限の許可を求めるポップアップが出てきます。

権限の許可ポップアップ

Googleのアカウントサービスに触れようとすると出てくるやつですね。

許可してあげないと、メール機能へのアクセスができないので、許可しましょう。

たしかこれをせずにトリガー設定しても、権限なしで実行できない状態になったと思うので、これは必ず行いましょう。

デバッグすると思うので、やらないってことはないと思いますが……

トリガーで定期的にチェックさせる

トリガーを設定して、定期的に関数を実行させれば

  1. 特定のメールを監視
  2. 発見したら何か処理

ということができます。

トリガーの設定ボタン

トリガーの設定ページが表示されます。

トリガーの設定画面→トリガーを追加ボタン

トリガーの設定項目をこのように設定します。

トリガーの設定項目

項目
実行する関数を選択 実行したい関数名
イベントのソースを選択 時間主導型
時間ベースのトリガーのタイプを選択 分ベースのタイマー
時間の間隔を選択(分) 1分おき

これで設定した関数を1分おきに実行してくれます。

「そんなに間隔短くなくていいわ」

という人は、適切な設定に変更してください。

設定したら保存ボタンを押します。

トリガー設定時の注意点

設定時間おきに実行されるということは、例えばこのようなケースが発生する可能性があります。

  1. 以下のような処理を作成する
    1. 受信メールをチェック(特定のメールだったら次へ)
    2. 条件に一致したら、自分宛てにメール
  2. 1分おきに実行するトリガーを設定

さて、受信メールチェック処理がOKだったらメールが送れられます。

しかし「そのメールがチェック済みのもの」という判定をしていない場合、どうなるでしょうか?

答えは簡単。毎回メールが送信されます。

このように

「実行したら以降は同じものは処理しない」

という、ブロックする処理を作っていないと、大量のメールが送信されるようなこともありえます。

ちなみにこの例はぼくの実話です……

メールボックスに大量のメールが入ってしまったので

  1. トリガー設定を一旦削除
  2. UWSCで簡単な自動化を行って全て削除
  3. ブロックする処理を入れて、トリガー再設定

ということをして、対処しました。めっちゃ焦りました……

参考

コチラを参考にしました。ありがとうございました!

qiita.com dev.classmethod.jp tonari-it.com

あとがき

GASでGmailの受信メールをチェックする方法についてでした!

たまにGASに触れてみると、やっぱり便利ですね!

www.lisz-works.com

www.lisz-works.com