【Google Apps Script】Gmailのスレッド処理を図にしてみた

概要

今回はGoogle Apps ScriptでGmail操作をしてみます。

私の場合、文字だけ・コードだけだとわかりづらかったので自分なりに理解して図解してみました!

まずはGmailの特徴的なスレッドについて説明します。

Gmailのスレッドについて

Gmailでは同一内容のやりとりを”スレッド“としてひとまとめにして表示しているので

GASで扱う場合は どのスレッドの何番目のメール ということを意識する必要があります。

※Google Apps ScriptでGmail操作するときは以下のようなイメージを持つとわかりやすいかも?

上記の特徴を踏まえておくとGASで操作するときにイメージしやすくなるかと思います。

スクリプトの動き

今回作成したスクリプトの動きはこんな感じです!

  • 指定した条件のメール(スレッド群)を検索
  • 取得したメール一覧(スレッド群)から1つのメール(スレッド)を取り出す
  • スレッドの中からメッセージ一覧を取り出す
  • メッセージ一覧から1つのメッセージを取り出す
  • 取り出したメッセージの内容を表示する

長々と書いてますが、ある条件を満たすメールを検索して内容を表示するだけです!

サンプルスクリプト

まずは今回使用するコードから!

コピペして検索条件を少しかえてあげればそのまま使用可能です!

function myFunction() {
  var threads = GmailApp.search('from:<メールアドレス> after:2022/3/01');

  threads.forEach(function(thread){
    var messages = thread.getMessages();
    
    messages.forEach(function(message){
      var subject = message.getSubject();
      var plainBody = message.getPlainBody();

      Logger.log(subject);
      Logger.log(plainBody);
    });
  });
}

※初回実行時は[権限の許可]が必要になります。


以降は1ブロックずつスクリプトを解説していきます!

内容を理解すれば自分好みの動きにすることができますよ!

メールの検索条件

スクリプト冒頭のメール検索部分になります。

ここではさまざまな条件を指定することが可能です。

var threads = GmailApp.search('from:<メールアドレス> after:2022/3/01');
※赤文字部分はカスタマイズ可能です!

threads という変数(名前は何でもいい)にGmailで検索した内容をセットしています。

図にすると以下のような感じになります。(※条件に一致したスレッドが4つあった場合の例)

よく使うであろう検索条件を簡単にまとめました。

GmailApp.search(‘ ‘); の中に半角スペース区切りで条件を追加できます。

コマンド内容使い方
from:差出人メールの差出人のメールアドレスなど
【例】from:hogehoge@xxx.com
subject:件名に含まれる文字を検索【例】subject:adsense
→件名に”adsense”が含まれるメールを検索
is:read既読のメール
is:read
is:unread未読のメールis:unread
before:指定日以降のメール【例】before:2022/03/01 → 2022年3月1日以前のメール
after:指定日以降のメール【例】after:2022/03/01 → 2022年3月1日以降のメール

検索条件についての詳細はこちらの記事(他サイト)がより詳しいです。

参考:GASを使って特定のGmailを検索する方法

スレッド一覧からスレッドを1つずつ取り出す

取得したスレッド一覧からスレッドを1つずつ取り出す処理です。

threads の中から順番に1つずつthreadが処理されます。

{ }の中では thread を扱います。

threads.forEach(function(thread){

...

})

図にすると以下のようになります。[0]、[1]、[2]…と順番に処理されていきます。

ちなみに for文で書いてみると以下のような感じになります。

やっていることは同じなのでわかりやすい方で!

for(i=0;i<threads.length;i++){

...

} //threads.length → threads内にある要素数を表しています。

※threadsの中から要素を1つずつ処理する意味では同じですが表記方法が若干変わります。

 ・forEach文 → { }の中では thread を扱う

 ・for文    → { }の中では threads[i] を扱う

スレッドからメッセージ一覧を取り出す

スレッド内にあるメッセージ一覧を取得します。

var messages = thread.getMessages();

図にすると以下のような感じです。

メッセージ一覧から1つのメッセージを取り出す

メッセージ一覧から1つのメッセージを取り出して処理します。

messages.forEach(function(message){

...

})

図にすると以下のような感じです。スレッドの時と考え方は同じですね。

{ }の範囲の中では message を扱います。

threadで説明したようにfor文での記述も可能です!

本文・件名の情報を取得する

やっと1つのメールの内容取得までたどり着きました。

今回は以下の部分の説明になります。

本文と件名の情報を取得して変数にセットします。

      var subject = message.getSubject();
      var plainBody = message.getPlainBody();

message.getSubject()件名の取得:メッセージ変数から件名の情報を取得します

message.getPlainBody()本文の取得:メッセージ変数から本文の情報を取得します

※本文の取得は.getBody()でも可能ですがごちゃごちゃしてしまうので
 シンプルに.getPlainBody()がおすすめです!

取得した情報を画面に表示する

Logger.log(変数) でデバッグ画面への表示が可能となります。

console.log(変数)でも可能です。

画面に表示した結果がnative code{}やnullになっている場合、途中で記入ミスをしている可能性があります。

もう一度確認してみましょう!

さいごに

いかがでしたでしょうか。

コードだけだと少し難しいですが、部品化して図にしてみると意外とわかりやすくなるのではないでしょうか。

次回はGmailで取得した内容をLINEで送信する方法をご紹介したいと思います!

ではまた

コメント

  1. 惜しまない人 より:

    最近GASの勉強を始めたプログラム初心者です。ちょうどやりたいことと同じことが説明されているこのサイトに辿り着きました。丁寧な絵付きの説明でとてもわかり易く、理解が深まりました。
    ありがとうございました。

タイトルとURLをコピーしました