Initial Site

Initial Site

Initial Site

【GAS】正規表現を使ってGmailの本文から文章を抜き出す

  • ヨシモト  2018/05/16 18:08
正規表現を使う

営業部ヨシモトです。

以前GASを使ってGmailから本文の一部を抜き出すという記事を書きましたが、今回はその応用編とも言えます。

 

以前ご紹介した方法(行番号で指定する)

Gmailで受信したメールをスプレッドシートで集計する方法として、以前ご紹介したのは下記のようなメールを「何行目から~」という方法でした。

—————-

≪お客様≫からお問合せがありました。

内容は以下の通りです。

■ご用件:資料請求について
■お名前:ヨシモト
■ご連絡先電話番号:090-****-****
■ご連絡先メールアドレス:sample@example.com
■お問い合わせ内容:資料を送ってください。
■送信元:スマートフォン

—————-

ですが、これがもしも

—————-

≪お客様≫からお問合せがありました。

内容は以下の通りです。

■ご用件:資料請求について
■お名前:株式会社ヨシモト
ヨシモト部 ヨシモト
■ご連絡先電話番号:090-****-****
■ご連絡先メールアドレス:sample@example.com
■お問い合わせ内容:資料を送ってください。
今日の17時までにください。
難しければお電話ください。
■送信元:スマートフォン

—————-

(やや無理やりですが)というメールだった場合はメールによって行数が変わるため、行番号を指定するという以前の方法では取得位置がズレます

これを解決するために正規表現を使います。

 

正規表現とは

正規表現とはwikipediaによると

正規表現(せいきひょうげん、regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つである。正則表現(せいそくひょうげん)とも呼ばれ、形式言語理論の分野では比較的こちらの訳語の方が使われる。まれに正規式と呼ばれることもある。”

正規表現 – Wikipedia

だそうです。

ものすごく嚙み砕いていうと、

「イニシャルサイト」という文字列の集合を一つの文字列で表現すると「カタカナ」です!

みたいな感じです。

「イニシャルサイト」・・・文字列の集合

「カタカナ」・・・一つの文字列で表現する

 

なぜ正規表現を使うのかというと、

—————–
イニシャルサイトは横浜市中区の会社です。
—————–

このような文章から「カタカナだけを抜き出す」という指示をすると「イニシャルサイト」という文字だけ抜き出すことができるからです。

 

どのようにやるか

前回の記事と同様に「受信日」「ご用件」「送信元」を抜き出すことにします。

前回のコードをそのまま実行すると

arrayRec

こうなります。ズレていますね。

 

では正規表現を使って抜き出してみましょう

コードはこうしてみました。※\は円マークでなくバックスラッシュなのでご注意ください。


function RegExpForm() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var thds = GmailApp.search("お問合せがありました", 0, 30);
  var messe = GmailApp.getMessagesForThreads(thds);

  for(var i = 0; i < messe.length; i++) {
    for(var j = 0; j < messe[i].length; j++) {
      var date = thds[i].getMessages()[j].getDate();
      var body = messe[i][j].getPlainBody();

      var regBiz = new RegExp('■ご用件:' + '.*?' + '\r' );
      var Biz = body.match(regBiz)[0].replace('■ご用件:', '').replace('\r', '');
      
      var regSend = new RegExp('■送信元:' + '.*?' + '\r' );
      var Send = body.match(regSend)[0].replace('■送信元:', '').replace('\r', '');

      sheet.appendRow([date, Biz, Send]);
    }
  }
  //受信日時順の昇順に並び替え
  var range = sheet.getRange("A:C");
  range.sort({column: 1, ascending: true});
}

これを実行すると

regExptoiawase

ズレずに取れました。

 

解説

for(var i=0; i < messe.length; i++) {
    for(var j=0; j < messe[i].length; j++) {
・
・(処理)
・
    }
}

Gmailは基本的にスレッドでメッセージを管理していて、
getMessagesForThreads()を使うと該当するスレッドの全てのメッセージを取得してくれます。
その構造としては、
「お問い合わせがありました」・・・スレッド1
Aさんからのお問い合わせ・・・メッセージ(メール)1
Bさんからのお問い合わせ・・・メッセージ(メール)2
Cさんからのお問い合わせ・・・メッセージ(メール)3
ざっくりとですが、こんな構造になっています。
これでひとかたまり(1スレッド)です。
上のコードは
「(“お問い合わせがありました”)にヒットしたスレッドの中の1つのメッセージに対して(処理)を行います。それをスレッド内の各メッセージで繰り返します。それをヒットした各スレッドで繰り返します。」
という意味になっています。

 

var regBiz = new RegExp('■ご用件:' + '.*?' + '\r' );
var Biz = body.match(regBiz)[0].replace('■ご用件:', '').replace('\r', '');

ここで正規表現を使います。

new RegExp()で何に一致させるのかを指定します。
上の行は’■ご用件’にから始まり、.*?(任意の文字が0回以上含まれていて)、\r(改行)で終わる部分に一致させるようにしています。
「■ご用件:資料請求について」ここですね。下の行では「■ご用件:」と\r(改行)をreplaceで空欄に置き換えて「資料請求について」だけが残るようになっています。

 

sheet.appendRow([date, Biz, Send]);

appendRow()を使うと中に入れてある要素を列の最後に追加してくれます。
ここでは「受信日」「用件」「送信元」を配列にして指定しています。

 

最後に

正規表現を自在に使えるととても強力なのでなんとしてもものにしたいところですね。

 

今回は下記の記事を参考にさせていただきました。ありがとうございます。

正規表現の基本 – Qiita

Google Apps Scriptでメールから正規表現で抽出したデータをスプレッドシートに蓄積する方法

 

その他、スプレッドシートやGASに関する記事はこちらからどうぞ。

GASを使ってGmailから本文の一部を抜き出す

スプレッドシート独自の便利な関数

QUERY関数の便利な使い方

スプレッドシートを使って簡単なスクレイピングをしてみよう

【GAS】正規表現を使ってGmailの本文から文章を抜き出す

【簡単】GASでスプレッドシートの送信リストからメールを送る

【GAS】正規表現を使って複数行の文章をGmailから抜き出す

【GAS】Gmailの添付ファイルを一括でGoogleドライブへ保存する

【難しくない】GASでwebスクレイピングして正規表現でデータを集める

それでは!


この記事へのコメント

    • GAS初心者 さん
      2018年8月14日 12:26 PM
    • 返信

    お問い合わせ内容の3行を抜き出したいときはどうすればいいのでしょうか?

      • ヨシモト さん
        2018年8月14日 3:42 PM

      GAS初心者 さん
      コメントありがとうございます。

      私もわからなかったので調べてみました。
      記事に書いてみましたのでぜひご覧ください。
      【GAS】正規表現を使って複数行の文章をGmailから抜き出す

      • GAS初心者 さん
        2018年8月14日 6:46 PM

      ヨシモトさん
      本当にありがとうございました!
      まとめたページまで作っていただいてありがとうございました。

      「’.*?’」の部分を「'[\\s\\S]*?’」に変えます。この部分が明確に記載できなくてすごい悩んでいました。
      私はこの後、メール詳細の本文にある複数の改行を除きたくて、また時間がかかってしまいましたが、
      おかげさまで実装できました。

      まさか、ご回答いただけるとは思っておらず、本当に感謝しております。

      P.S.
      コメントにソースを書いていただいたとき、「'[\\s\\S]+?’」
      現状の説明ページ「'[\\s\\S]*?’」
      と、少し表現が違うようなのですが、同じ意味合いなのでしょうか。
      ど素人の質問で申し訳ございません。

      • ヨシモト さん
        2018年8月15日 10:12 AM

      GAS初心者 さん

      コメントありがとうございます。

      >コメントにソースを書いていただいたとき、「'[\\s\\S]+?’」
      >現状の説明ページ「'[\\s\\S]*?’」
      >と、少し表現が違うようなのですが、同じ意味合いなのでしょうか。

      今回のケースではほぼほぼ同じ動作をしますが、
      厳密には
      “X* Xが0 回以上”
      “X+ Xが1 回以上”
      という違いがあります。
      こちらを参考にさせていただきました。
      正規表現の基本 | Qiita

      私も新しい知識を得ることができた良い機会でした。
      ありがとうございました。

コメントをどうぞ

ツールの記事

  1. dance_shoot_dance
    【難しくない】GASでwebスクレイピングして正規表現でデータを集める
  2. bg_kaitenzushi
    【GAS】Gmailの添付ファイルを一括でGoogleドライブへ保存する
  3. kid_job_boy_programmer
    【GAS】正規表現を使って複数行の文章をGmailから抜き出す
  4. createSSAsan
    【簡単】Google Apps Script(GAS)でメールを送る

おすすめ記事

  1. スギ花粉
    鼻がムズムズ目がカユカユな花粉症についてまとめてみた
  2. 『テレビ観ないんだよね…』と言うのがかっこいいと思っている人に告ぐ!
  3. 出典:無料壁紙:格闘技がテーマの写真やイラスト画像まとめ(格闘家・ブルースリー)
    ブルース・リーの出身地ってどこだかわかりますか?
  4. ハイビスカス
    ウチナーンチュが沖縄に帰った時に必ず行くお店10選+α
  5. イニシャルサイトコーポレートサイト
    コーポレートサイトをリニューアルしました
  6. なんでもQ
    相談Q&Aサイト「なんでもQ」開発中です!
  7. さんぽすフォトコンペ開催中
    今年もさんぽすフォトコンペ開催しました!

人気の記事

  1. クロックスの偽物と本物の違い
    クロックスの本物と偽物の違いを比べてみました
  2. ファミコン
    パズドラ、モンスト、白猫に続く次のゲームは…?
  3. konagaya_20150303
    日常でつい使ってしまう間違えやすい日本語
  4. Doctor scanning mri patient with MRI scanner machine technology
    MRI検査(造影剤付き)の感想と注意点