どうもこたにんです。
GASを使ってGmailの受信トレイを操作してみる!
ちょっくら作りたいものがありましてですね。
Gmailで受信するメールのうち、特定のメールを受信した時にスクリプトを実行させたい。
なので今回は最初のステップ。
GAS側からGmailの受信トレイを検索して特定のメールを拾う、というのをやってみます!
Gmail Service
GASの中に「Gmail Service」なるサービスがありました。
このサービスには、以下クラスが用意されてあります。
- GmailApp:Gmailの受信トレイ全体的にいじれる
- GmailAttachment:添付ファイルいじれる
- GmailDraft:下書きメッセージいじれる
- GmailLabel:ラベルいじれる
- GmailMessage:メッセージいじれる
- GmailThread:スレッドいじれる
こんな感じで、いじれる単位によってクラスが分かれています。
良い設計ですね。
今回は「受信トレイを検索して特定のメールを拾う」というアクションをしたい。
ので、たぶん GmailApp を使う気がします。
GmailApp.search()
Gmailには、そもそも検索機能が備わっていますね。
「返却完了」とタイトルに含む、未読メッセージを検索したい場合は、こんな感じで。
GAS上でも、ほとんど同じようにスクリプトは記載できます。
上記と同じ動きを実現するにはこうです。
var threads = GmailApp.search('subject:返却完了 label:unread');
非常にシンプル。
GmailApp.search() というメソッドが備わっており、それに検索クエリを入れるだけ。
これで特定のメールは拾えました。
Gmailのページで検索をためして、うまくいったら検索クエリをスクリプトに組み込む。
すごい簡単。
あとはお好きに調理します。
今回わたしは、メールの受信日付を拾って、それをSlackにPOSTしたいのです。
こんな感じで。
function searchMail() {
var threads = GmailApp.search('subject:返却完了 label:unread');
GmailApp.getMessagesForThreads(threads).forEach(function(msg) {
var date = Utilities.formatDate(msg[0].getDate(), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss');
sendSlack('返却完了 ' + date);
msg[0].markRead();
});
}
.search で返却されるのは GmailThread なので、それを forEach します。
1スレッドごとに GmailMessage が得られますので、そこから日付を拾います。
日付は GmailMessage.getDate() にDate型で入っています。
のでそれを Utilities.formatDate() でいい感じに見やすいかたちに整形。
それをSlack送信メソッド(これは自作)に投げる。
最後に処理したメッセージを GmailMessage.markRead() で既読つけておわり。
超簡単ですね。
これで、GASからGmailの受信トレイを操作できることがわかりました。
GASはとにかくリファレンスが充実しているので、とりあえず読むが最強です。
読んでたら解決策があるし、より高度な操作ができるメソッドが見つかったりします。
今回でGmail操作ができたので、次はそれにトリガー設定をするところだね。