Binary Diary

ありのままでいいのかな

GASでGmailを操作するのは超簡単!GmailApp.search() を使ってみた。

どうもこたにんです。

GASを使ってGmailの受信トレイを操作してみる!

ちょっくら作りたいものがありましてですね。

Gmailで受信するメールのうち、特定のメールを受信した時にスクリプトを実行させたい。
なので今回は最初のステップ。
GAS側からGmail受信トレイを検索して特定のメールを拾う、というのをやってみます!

 

 

 

Gmail Service

GASの中に「Gmail Service」なるサービスがありました。
このサービスには、以下クラスが用意されてあります。

  • GmailApp:Gmailの受信トレイ全体的にいじれる
  • GmailAttachment:添付ファイルいじれる
  • GmailDraft:下書きメッセージいじれる
  • GmailLabel:ラベルいじれる
  • GmailMessage:メッセージいじれる
  • GmailThread:スレッドいじれる

こんな感じで、いじれる単位によってクラスが分かれています。
良い設計ですね。

今回は「受信トレイを検索して特定のメールを拾う」というアクションをしたい。
ので、たぶん GmailApp を使う気がします。

GmailApp.search()

Gmailには、そもそも検索機能が備わっていますね。
「返却完了」とタイトルに含む、未読メッセージを検索したい場合は、こんな感じで。

f:id:Kotanin0:20200201131203p:plain

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操作ができたので、次はそれにトリガー設定をするところだね。