スレッドのメッセージを取り出すには?

前回、受信ボックスなどから「スレッド」を取り出し利用する基本について説明しました。Gmailのメールはスレッドとしてまとめられており、その中に「メッセージ」として各メールが用意されていましたね。

スレッドは、GmailThreadというオブジェクトとして用意されています。その中にあるメッセージは、「GmailMessage」というオブジェクトとして扱われます。まずは、スレッドの中からメッセージを取り出す方法を覚えておきましょう。

《GmailThread》.getMessages();

getMessagesは、スレッドに含まれるメッセージをGmailMessageの配列として返すメソッドです。これで得られた配列から、forなどで1つずつ値を取り出して処理していけばいいのです。

GmailMessageの主なメソッド

GmailMessageには、メールの内容に関するメソッドが一通り用意されています。これらを使えば、メールの内容を調べることができます。基本的なメソッドとして、以下のものを頭に入れておけばいいでしょう。いずれも引数はなく、ただ呼び出すだけで使えます。

getFrom――送信元をStringで返す
getTo――送信先をStringで返す
getDate――送信された日時をDateオブジェクトで返す
getCc――CCの値をStringで返す
getBcc――BCCの値をStringで返す
getSubject――メールのタイトルをStringで返す
getBody――メールの本文をHTMLのソースコードとして取り出しStringで返す
getPlainBody――メールの本文を標準テキストとして取り出しStringで返す

ややわかりにくいのは、getBodyとgetPlainBodyでしょう。Gmailでは、メールの内容はHTMLでフォーマットされています。getBodyは、この「HTMLでフォーマットされたソースコード」として本文を取り出します。本文のテキストだけを取り出したい場合は、getPlainBodyを使います。

受信トレイのメールを一覧表示する

では、簡単な利用例を挙げましょう。受信トレイにあるメールのタイトルと送信元をログに出力するサンプルです。


function allMail() {
  var threads = GmailApp.getInboxThreads();
  for (var th in threads) {
    var msgs = threads[th].getMessages();
    for (var msg in msgs) {
      Logger.log(msgs[msg].getSubject() + '(' + msgs[msg].getFrom() + ')');
    }
  }
}
  • 実行後、「表示」メニューの「ログ」を選ぶと、受信トレイのメールのタイトルと送信元が表示される。

スクリプトエディタからこれを実行し、「表示」メニューの「ログ」を選んでログのダイアログを表示してみて下さい。受信トレイにあるメールのタイトルと送信元アドレスがすべて表示されます。

ここでは、まずgetInboxThreadsで受信トレイのスレッドを配列として取り出し、forでそのスレッドからgetMessagesでメッセージの配列を取り出しています。後は、個々のメッセージからgetSubjectとgetFromでタイトルと送信元を取り出し表示していくだけです。メッセージを取り出すことができれば、後は必要な情報を簡単に得られるのがわかるでしょう。

スプレッドシートに書き出す!

メールの情報が取り出せるようになったら、それを活用する方法も考えないといけません。今までのように「メールにまとめて送信する」というだけではちょっと物足りませんね。

Google Apps Scriptの最大の魅力は、さまざまなG Suiteアプリを連携して動かせることです。そこで、送られてきたメールの情報を整理して、Googleスプレッドシートに書き出してみましょう。複数アプリを連携して動かす場合、アプリへのアクセスを許可する作業が必要になります。以下の手順で作業して下さい。

  1. まず、Googleスプレッドシートを新たに開いて下さい。Googleドライブから新規スプレッドシートを作ると良いでしょう。開いたら名前をつけて保存しておきます。

  2. スプレッドシートの「ツール」メニューから「スクリプトエディタ」を選んで、スクリプトエディタを開きます。そして以下のスクリプトを記述しましょう。

  3. 
    function getAllMessages() {
      var sheet = SpreadsheetApp.getActiveSheet();
      var threads = GmailApp.getInboxThreads();
      var row_count = 1;
      for (var th in threads) {
        var msgs = threads[th].getMessages();
        for (var msg in msgs) {
          sheet.getRange(row_count, 1).setValue(msgs[msg].getFrom());
          sheet.getRange(row_count, 2).setValue(msgs[msg].getTo());
          sheet.getRange(row_count, 3).setValue(msgs[msg].getSubject());
          sheet.getRange(row_count, 4).setValue(msgs[msg].getDate());
          row_count++;
        }
      }
    }
  4. スクリプトを保存し、実行しましょう。「実行」メニューの「関数を実行」から「getAllMessages」を選んで下さい。

  5. 画面に「認証が必要です」とアラートが現れるので「許可を確認」ボタンを押します。

  • 認証を求めるアラート。

  • 画面に新たにウインドウが現れ、アカウントを選択する画面になるので、認証するアカウントを選びます。
    • 認証するアカウントを選択する。

  • 「〇〇がGoogleアカウントへのアクセスをリクエストしています」とアクセスの内容が表示されるので、「許可」をクリックします。
    • アクセスを許可する。

    これでスクリプトが実行できるようになります。実行すると、Googleスプレッドシートに、受信トレイにあるメールの送信元・送信先・タイトル・送信日時といった情報が一覧表示されます。

    スプレッドシートにデータをまとめられれば、後はいろいろとデータを利用できるでしょう。

    スプレッドシートに書き出すには?

    今回は、Googleスプレッドシートにデータを書き出しています。Googleスプレッドシートをスクリプトで利用するのは、実は意外と簡単です。単純に「指定したセルに値を書き出す」というだけなら、以下の2文だけ頭に入れておけばできるようになります。

    シートを取り出す
    変数 = SpreadsheetApp.getActiveSheet();

    スプレッドシートから、現在開いているシート(Sheetオブジェクトというもの)を取り出します。

    セルに値を書き出す
    《Sheet》.getRange(行 , 列 ).setValue( 値 );

    セルの指定は、Sheetの「getRange」というメソッドを使います。これは行と列の番号を引数に指定するだけです。これで、セルの範囲を表すRangeというオブジェクトが得られるので、その「setValue」メソッドを呼び出して値をセルに設定します。ちなみに「getValue」というメソッドを使えば、そのセルの値を取り出すこともできます。

    スプレッドシートが使えるようになると、できることの幅もぐぐっと広がりますので、ぜひこの2文だけ覚えて、スプレッドシートを使えるようになりましょう。