Google Apps ScriptでGmailの受信メールから正規表現でデータを抽出する

★気に入ったらシェアをお願いします!


mail-fetch

photo credit: THE RANGE PRODUCTIONS 10/27/2017 ( 2 ) via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google Apps Scriptでフォーム送信メールからデータを抽出してスプレッドシートに登録するツールを作成しています。

前回の記事はコチラ。

Google Apps Scriptで正規表現でマッチした文字列から不要な部分を削除する
Google Apps Scriptでフォーム送信メールからデータを抽出してスプレッドシートに登録するツールを作成しております。今回はGASで正規表現で抽出した文字列から、欲しいデータのみを取り出す方法です。

正規表現により、メール風の文字列から欲しいデータを抽出する方法についてお伝えしました。

とはいえ、「メール風」の文字列でしたので、実際のメッセージからできるのか?というのを今回立証していきます。

ということで、Google Apps ScriptでGmailに届いたメールから正規表現でデータを抽出するスクリプトを紹介します。

では、行ってみましょう!

前回のおさらい

前回作成したスクリプトはコチラです。

関数fetchDataがキモで、与えた文字列strから、正規表現を使って文字列preと文字列sufに囲まれている文字列を抽出するというものです。

ですから、myFunctionを修正して

  • Gmailから対象のメッセージだけを取得する
  • 対象のメッセージの本文からfetchDataでデータを抽出する

という処理を作っていけばOKですね。

Gmailの受信メールから正規表現でデータを抽出する

まず、どんなメッセージを対象とするかですが、こんなメールです。

GASで取得対象とする受信メール

データを取得するメッセ―ジは常に「[テスト]フォーム登録通知」という件名で送られてきます。

そして、その本文から「名前」「年齢」を取得していきたいということです。

Gmailからのメッセージ取得については以下記事も参考になりますので、合わせてご覧ください。

【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する
問い合わせメールのデータの蓄積と効果分析にまつわることを色々とやっていきたいということで、今回はGoogle Apps Scriptで過去の問い合わせメールを特定条件で検索して取り出す方法です。

searchメソッドでGmailからスレッドを検索する

Gmailから特定の条件でスレッドを検索するにはGmailAppクラスのsearchメソッドを使いますね。

書式は以下の通りです。

GmailApp.search(検索条件, 開始インデックス, 最大取得数)

検索条件は、Gmailの画面でスレッドを検索すると同様の文字列を指定できます。

今回は、件名が「[テスト]フォーム登録通知」のスレッドを取得したいので

subject:([テスト]フォーム登録通知)

とすればOKです。

また、今回は全てのスレッドを検索対象とするので、開始インデックスは0を指定、最大取得数は1日のGmailの読み書き制限とトリガーの頻度によって決まってきますが、控えめに30としておきましょう。

ということで、この部分は以下のように作ればOKです。

スレッドの配列からメッセージの配列を取得する

searchメソッドで取得できるのはスレッドの配列です。

Gmailでは、関連する(とGmailが判断した)メッセージは同じスレッドに紐づいていきます。つまり、スレッドが親で、その配下にメッセージがいくつかぶら下がるという構造になります。

ですので

  1. 取得したスレッドの配列から、その配下のメッセージを取得→二次元配列になる
  2. 二次元配列に含まれるすべてのメッセージについて
    1. 本文を取得
    2. 正規表現でデータを抽出
    3. スプレッドシートに追加

という流れになります。

それで、スレッドの配列からメッセージの二次元配列を取得するには、GmailAppクラスのgetMessagesForThreadsメソッドを使います。

GmailApp.getMessagesForThreads(スレッドの配列)

実際には、以下のスクリプトになります。

各メッセージについて本文を取得してデータを抽出する

取得したメッセージの二次元配列についてループをして、各メッセージについてfetchDataの結果をログ表示する部分は以下のようになります。

getPlainBodyメソッドはメッセージの本文のプレーンテキストを取得するメソッドです。

Messageオブジェクト.getPlainBody()

受け取るメールがHTMLメールである場合は、余計なHTMLタグを取り除くためにgetPlainBodyメソッドを使うほうが良いです。

また、改行コード\nから、キャリッジリターン\rに変更していますが、Gmailのメッセージの改行はキャリッジリターンですので変更しました。

Gmailから対象のメッセージを検索してデータを抽出するスクリプトとその実行

まとめると、以下のようなスクリプトになります。

実行すると、以下のような結果が得られました。

Gmailのメッセージから正規表現で抽出したデータ

まとめ

以上、Gmailの受信メールから正規表現でデータを抽出するスクリプトを紹介しました。

  • Gmailからsearchメソッドでスレッドを検索する
  • getMessagesForThreadsメソッドでスレッドの配列からメッセージの二次元配列を取得する
  • メッセージから本文を取り出して正規表現でデータを抽出する
  • (Gmailの改行はキャリッジリターン\rだった)

あとはスプレッドシートに追加していく処理が必要ですね。次回以降進めていきます。

Google Apps Scriptでメールから正規表現で抽出したデータをスプレッドシートに蓄積する方法
Google Apps Scriptでフォーム送信メールからデータを抜き出してスプレッドシートに登録するツールを作成しています。今回はメールで取得したデータをスプレッドシートに蓄積する方法をお伝えします。

どうぞお楽しみに!

連載目次:GASで正規表現を使ってデータを抽出&登録

正規表現を使うとGoogle Apps ScriptでメールやHTMLドキュメントからデータを抽出することができます。本シリーズでは、フォーム送信の通知メールからデータを抽出してスプレッドシートに追加するツールの作成を目指します。
  1. Google Apps Scriptで正規表現を使って必要な情報を抽出する最も簡単なスクリプト
  2. Google Apps Scriptで正規表現でマッチした文字列から不要な部分を削除する
  3. Google Apps ScriptでGmailの受信メールから正規表現でデータを抽出する
  4. Google Apps Scriptでメールから正規表現で抽出したデータをスプレッドシートに蓄積する方法
  5. Google Apps ScriptでGmailのメッセージIDを取得する方法
  6. Google Apps Scriptでスプレッドシートの列データを配列として取得する方法