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];
この辺での情報を順次処理して、対象のメールをサーチする必要がありそうです。
もし自分用のスクリプトなのであれば
- Gmail側で、特定のラベルを自動でつける用に設定
- 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)
- メールへ返信(メール#2)
としたとき、時間的にあとで送信したはずのメール#2でなく、メール#1が取得されました。
返信メールは、ちょっと性質が異なるのかもしれません。
今回やりたいことでは不要だったので、深堀りはしませんでしたが、必要になったときは別途調査が必要そうです。
実行時の許可
実行すると、権限の許可を求めるポップアップが出てきます。
Googleのアカウントサービスに触れようとすると出てくるやつですね。
許可してあげないと、メール機能へのアクセスができないので、許可しましょう。
たしかこれをせずにトリガー設定しても、権限なしで実行できない状態になったと思うので、これは必ず行いましょう。
デバッグすると思うので、やらないってことはないと思いますが……
トリガーで定期的にチェックさせる
トリガーを設定して、定期的に関数を実行させれば
- 特定のメールを監視
- 発見したら何か処理
ということができます。
トリガーの設定ページが表示されます。
トリガーの設定項目をこのように設定します。
項目 | 値 |
---|---|
実行する関数を選択 | 実行したい関数名 |
イベントのソースを選択 | 時間主導型 |
時間ベースのトリガーのタイプを選択 | 分ベースのタイマー |
時間の間隔を選択(分) | 1分おき |
これで設定した関数を1分おきに実行してくれます。
「そんなに間隔短くなくていいわ」
という人は、適切な設定に変更してください。
設定したら保存ボタンを押します。
トリガー設定時の注意点
設定時間おきに実行されるということは、例えばこのようなケースが発生する可能性があります。
- 以下のような処理を作成する
- 受信メールをチェック(特定のメールだったら次へ)
- 条件に一致したら、自分宛てにメール
- 1分おきに実行するトリガーを設定
さて、受信メールチェック処理がOKだったらメールが送れられます。
しかし「そのメールがチェック済みのもの」という判定をしていない場合、どうなるでしょうか?
答えは簡単。毎回メールが送信されます。
このように
「実行したら以降は同じものは処理しない」
という、ブロックする処理を作っていないと、大量のメールが送信されるようなこともありえます。
ちなみにこの例はぼくの実話です……
メールボックスに大量のメールが入ってしまったので
- トリガー設定を一旦削除
- UWSCで簡単な自動化を行って全て削除
- ブロックする処理を入れて、トリガー再設定
ということをして、対処しました。めっちゃ焦りました……
参考
コチラを参考にしました。ありがとうございました!
qiita.com dev.classmethod.jp tonari-it.com
あとがき
GASでGmailの受信メールをチェックする方法についてでした!
たまにGASに触れてみると、やっぱり便利ですね!