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に届いたメールから正規表現でデータを抽出するスクリプトを紹介します。

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

スポンサーリンク

前回のおさらい

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

function myFunction() {
  const fetchData = (str, pre, suf) => {
    const reg = new RegExp(pre + '.*?' + suf, 'g');
    const data = str.match(reg)[0]
      .replace(pre, '')
      .replace(suf, '');
    return data;  
  };
 
  const str = '高橋様rお世話になっております。rr名前:鈴木r年齢:30才rr以上です。';
  console.log(fetchData(str, '名前:', 'r'));
  console.log(fetchData(str, '年齢:', '才'));
}

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

ですから、スクリプトを修正して以下のような処理を作っていけばOKですね。

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

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

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

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

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

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

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

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

書式は以下の通りです。

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

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

今回は、件名が「[テスト]フォーム登録通知」のスレッドを取得したいので以下のようにすればOKです。

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

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

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

const query = 'subject:([テスト]フォーム登録通知)';
const threads = GmailApp.search(query, 0, 30);

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

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

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

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

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

ですので以下のような流れになります。

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

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

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

実際には、以下のコードになります。

const messages = GmailApp.getMessagesForThreads(threads);

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

では、取得したメッセージの二次元配列についてループをして、各メッセージについてfetchDataの結果をログ表示するようにスクリプトを修正していきましょう。

こちらです。

function myFunction() {
  const fetchData = (str, pre, suf) => {
    const reg = new RegExp(pre + '.*?' + suf, 'g');
    const data = str.match(reg)[0]
      .replace(pre, '')
      .replace(suf, '');
    return data;  
  };
  const query = 'subject:([テスト]フォーム登録通知)';
  const threads = GmailApp.search(query, 0, 30);
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);
 
  for(const messages of messagesForThreads){
    for(const message of messages){
      const body = message.getPlainBody();
      console.log(fetchData(body, '名前:', 'r'));
      console.log(fetchData(body, '年齢:', '才'));    
    }
  }
}

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

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

なお、15行目ですが、getPlainBodyメソッドはメッセージの本文のプレーンテキストを取得するメソッドです。

Messageオブジェクト.getPlainBody()

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

まとめ

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

  • Gmailからsearchメソッドでスレッドを検索する
  • getMessagesForThreadsメソッドでスレッドの配列からメッセージの二次元配列を取得する
  • メッセージからgetPlainBodyメソッドで本文を取り出して正規表現でデータを抽出する

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

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でスプレッドシートの列データを配列として取得する方法
  7. GASで二次元配列に特定の要素が含まれているかを判定する方法
  8. GASでフォーム送信メールからデータを取得してスプレッドシートに蓄積するツールの完全版

コメント

  1. TTM より:

    初めまして。社内でのGAS構築の際に大変参考にさせていただきました。ありがとうございます。自分の勉強不足でしたら大変申し訳ないのですが、fetchdataの第3引数が\nの時(https://tonari-it.com/gas-regexp-replace-new/)と\r(https://tonari-it.com/gas-gmail-regexp-fetch-data/)の時がございます。これらの違いについてはどのようなものになるのでしょうか。何卒よろしくお願いいたします。

    • TTMさん

      記事内に以下のように記載しているとおりですね。

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

      改行コードはOSやサービスによって、\nだったり、\rだったり、\r\nだったり変わります。

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