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でメールから正規表現で抽出したデータをスプレッドシートに蓄積する方法

 

それでは!


コメントをどうぞ

ツールの記事

  1. 正規表現を使う
    【GAS】正規表現を使ってGmailの本文から文章を抜き出す
  2. webScraping_boy
    スプレッドシートを使って簡単なスクレイピングをしてみよう
  3. shigoto_desk_nobi_man
    QUERY関数の便利な使い方
  4. bunbougu_dentaku
    スプレッドシート独自の便利な関数

おすすめ記事

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

人気の記事

  1. ファミコン
    パズドラ、モンスト、白猫に続く次のゲームは…?
  2. konagaya_20150303
    日常でつい使ってしまう間違えやすい日本語
  3. クロックスの偽物と本物の違い
    クロックスの本物と偽物の違いを比べてみました
  4. konagaya20150513
    初心者でも気軽に登れて絶景が見れる山