GASを使ってGmailから受信メールの件数を集計してみた
訳あって、毎日受信メールの件数を集計する必要があり、肉眼での集計は非効率なのでGASを使って集計結果を出力してみました。
その内容の一部をメモ。
方針
- 24時間前から現在までのメール分を集計
- 集計対象のメールは件名で絞り込み可
- アウトプットはどこでもなにでもよいが、今回はハングアウトチャットの専用ルームにポスト
- chrome v.8
メールの取得
Class GmailApp | Apps Script | Google Developers
ここのAPIを駆使すれば、モウマンタイ!
とても簡単にメールが取得できる。
今回は、時間(24時間前)と件名を指定してメールを取得。
var today = new Date(); var unixTime = today.getTime(); var now = Math.floor(unixTime/1000); // ミリ秒を秒変換 var term = now - 24 * 3600; // 現在時刻から24時間前 var baseCondition = "after:" + term.toString(); var cond = baseCondition + " " + "subject:(" + [検索したい件名] + ")"; var threads = GmailApp.search(cond,0,30); // スレッドを取得 var messages = GmailApp.getMessagesForThreads(threads); // スレッド内のすべてのメッセージを取得
condの部分は実際に生成した文字列を使って、Gmailの検索窓に突っ込んでみて意図通りか確認すると、いい!
はい、メールは取得できた。
ここから、少しコネコネが必要。
その前にスレッドとは何たるか。自分が躓いたので残しておく。
スレッドとは
スレッドというのは図の赤線で引いている通り、1つのスレッドに複数のメールが管理されているときがある。(件名?メールの送り方?ここの仕様がよくわからん・・・)
GmailApp.searchでは、検索条件のほかに、何スレッド取ってきますか、というのを指定する。
集計対象が1スレッド1メールのものもあったり、1スレッドに複数メールということもあったのでループを駆使して対象となる件数を取ってくる必要がある。
更には、スレッドの一部のメッセージに検索条件に引っ掛かるメッセージがあると、そのメッセージだけ取得したいが、必ずスレッド単位で取得する。
そのため、スレッドを取得した後も、もう一度その条件を満たすメッセージはどれか、というのを集計する必要があった。
メールの集計
ここは、もっといい方法があると思うのでコードについては残さない。
が、躓いたところとしてはここ。
GmailMessage二次元配列!!
スレッドごとにメッセージを操作するという、ものすごいこだわりがあるみたいで私のソースはループだらけ。
ネストしまくりのウンコ〇ドになりました、が上に書いた通り、ここで検索条件を満たしているメッセージは再度チェックして件数を割り出す。
うーん。悩ましい。
ハングアウトチャットにポスト
GAS part3 ハングアウトチャットの便利機能を使った業務改善 | 日販テクシード株式会社(NT)
↑とても分かりやすく書かれていましたので、そのまま参考にさせてもらいました。
ルームのWebhookを管理からWebhookを追加して、そのURLをコピー
var url = [WebhookのURL]; var payload = { "text" : [ポストしたい内容] } var json = JSON.stringify(payload); //エンコード // ポストするためにヘッダーとかボディをまとめて入力する var options = { "method" : "POST", "contentType" : 'application/json; charset=utf-8', "payload" : json } var response = UrlFetchApp.fetch(url, options);
gasで時間指定して実行
Google Apps Script で毎日決まった時間にスクリプトを実行するトリガー設定
時刻指定はこちらの記事が分かりやすく書かれていましたので、そのまま参考にさせてもらいました。
トリガーが、9時台、8時台、みたいな指定しかできないので、細かく時刻を指定させるメソッドをトリガーに呼んでもらう形にした。
さいごに
いろんな人がアウトプットしてくださっているおかげで、どんな新しいこともやるのにハードル低いなぁと身に染みた