みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Scriptでフォーム送信メールからデータを抽出してスプレッドシートに登録するツールを作成しています。
前回の記事はコチラ。
正規表現により、メール風の文字列から欲しいデータを抽出する方法についてお伝えしました。
とはいえ、「メール風」の文字列でしたので、実際のメッセージからできるのか?というのを今回立証していきます。
ということで、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の受信メールから正規表現でデータを抽出する
まず、どんなメッセージを対象とするかですが、こんなメールです。
データを取得するメッセ―ジは常に「[テスト]フォーム登録通知」という件名で送られてきます。
そして、その本文から「名前」「年齢」を取得していきたいということです。
searchメソッドでGmailからスレッドを検索する
Gmailから特定の条件でスレッドを検索するにはGmailAppクラスのsearchメソッドを使いますね。
書式は以下の通りです。
検索条件は、Gmailの画面でスレッドを検索すると同様の文字列を指定できます。
今回は、件名が「[テスト]フォーム登録通知」のスレッドを取得したいので以下のようにすればOKです。
また、今回は全てのスレッドを検索対象とするので、開始インデックスは0を指定、最大取得数は1日のGmailの読み書き制限とトリガーの頻度によって決まってきますが、控えめに30としておきましょう。
ということで、この部分は以下のように作ればOKです。
const query = 'subject:([テスト]フォーム登録通知)'; const threads = GmailApp.search(query, 0, 30);
Gmailからのメッセージ取得については以下記事も参考になりますので、合わせてご覧ください。
スレッドの配列からメッセージの配列を取得する
searchメソッドで取得できるのはスレッドの配列です。
Gmailでは、関連する(とGmailが判断した)メッセージは同じスレッドに紐づいていきます。つまり、スレッドが親で、その配下にメッセージがいくつかぶら下がるという構造になります。
ですので以下のような流れになります。
- 取得したスレッドの配列から、その配下のメッセージを取得→二次元配列になる
- 二次元配列に含まれるすべてのメッセージについて
- 本文を取得
- 正規表現でデータを抽出
- スプレッドシートに追加
それで、スレッドの配列からメッセージの二次元配列を取得するには、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, '年齢:', '才')); } } }
実行すると、以下のような結果が得られました。
なお、15行目ですが、getPlainBodyメソッドはメッセージの本文のプレーンテキストを取得するメソッドです。
受け取るメールがHTMLメールである場合は、余計なHTMLタグを取り除くためにgetPlainBodyメソッドを使うほうが良いです。
まとめ
以上、Gmailの受信メールから正規表現でデータを抽出するスクリプトを紹介しました。
- Gmailからsearchメソッドでスレッドを検索する
- getMessagesForThreadsメソッドでスレッドの配列からメッセージの二次元配列を取得する
- メッセージからgetPlainBodyメソッドで本文を取り出して正規表現でデータを抽出する
あとはスプレッドシートに追加していく処理が必要ですね。次回以降進めていきます。
どうぞお楽しみに!
連載目次:GASで正規表現を使ってデータを抽出&登録
正規表現を使うとGoogle Apps ScriptでメールやHTMLドキュメントからデータを抽出することができます。本シリーズでは、フォーム送信の通知メールからデータを抽出してスプレッドシートに追加するツールの作成を目指します。- Google Apps Scriptで正規表現を使って必要な情報を抽出する最も簡単なスクリプト
- Google Apps Scriptで正規表現でマッチした文字列から不要な部分を削除する
- Google Apps ScriptでGmailの受信メールから正規表現でデータを抽出する
- Google Apps Scriptでメールから正規表現で抽出したデータをスプレッドシートに蓄積する方法
- Google Apps ScriptでGmailのメッセージIDを取得する方法
- Google Apps Scriptでスプレッドシートの列データを配列として取得する方法
- GASで二次元配列に特定の要素が含まれているかを判定する方法
- GASでフォーム送信メールからデータを取得してスプレッドシートに蓄積するツールの完全版
コメント
初めまして。社内での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だったり変わります。