みの雑多ブログ

勉強したことをアウトプットしたり、しなかったり

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スレッドに複数メールということもあったのでループを駆使して対象となる件数を取ってくる必要がある。
f:id:yamami78651:20200831130110p:plain

更には、スレッドの一部のメッセージに検索条件に引っ掛かるメッセージがあると、そのメッセージだけ取得したいが、必ずスレッド単位で取得する。
そのため、スレッドを取得した後も、もう一度その条件を満たすメッセージはどれか、というのを集計する必要があった。

メールの集計

ここは、もっといい方法があると思うのでコードについては残さない。
が、躓いたところとしてはここ。
f:id:yamami78651:20200831132141p:plain
GmailMessage二次元配列!!
スレッドごとにメッセージを操作するという、ものすごいこだわりがあるみたいで私のソースはループだらけ。
ネストしまくりのウンコ〇ドになりました、が上に書いた通り、ここで検索条件を満たしているメッセージは再度チェックして件数を割り出す。
うーん。悩ましい。

ハングアウトチャットにポスト

GAS part3 ハングアウトチャットの便利機能を使った業務改善 | 日販テクシード株式会社(NT)
↑とても分かりやすく書かれていましたので、そのまま参考にさせてもらいました。

ルームのWebhookを管理からWebhookを追加して、そのURLをコピー
f:id:yamami78651:20200831132727p:plain

  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時台、みたいな指定しかできないので、細かく時刻を指定させるメソッドをトリガーに呼んでもらう形にした。

さいごに

いろんな人がアウトプットしてくださっているおかげで、どんな新しいこともやるのにハードル低いなぁと身に染みた