Initial Site

Initial Site

Initial Site

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

  • ヨシモト  2018/08/14 17:51
kid_job_boy_programmer

営業部ヨシモトです。

以前書いた【GAS】正規表現を使ってGmailの本文から文章を抜き出すという記事に対して、

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

というコメントをいただいたので解説したいと思います。

 

前提として

—————-

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

内容は以下の通りです。

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

—————-

このようなメールの文面から、例えば「お問い合わせ内容」に対する部分、

資料を送ってください。
今日の17時までにください。
難しければお電話ください。

これを抜き出すことを目標としてます。

 

※正規表現についてはこちらをご覧ください。

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

 

実践

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 regCont = new RegExp('■お問い合わせ内容:' + '[\\s\\S]*?' + '■送信元:');
      var Cont = body.match(regCont)[0].replace('■お問い合わせ内容:', '').replace('■送信元:', '').replace('\r', '');
      
      var regSend = new RegExp('■送信元:' + '.*?' + '\r' );
      var Send = body.match(regSend)[0].replace('■送信元:', '').replace('\r', '');

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

これを実行すると

gasRegExss
1行だけのものも、複数行のものも取得できてますね。

 

解説

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

JavaScriptのリファレンスによると、「.」を使うとそもそも複数行取得できないようです。

“(この文字は小数点です) 改行文字(\n、\r、\u2028、あるいは、\u2029)を除いたあらゆる 1 文字にマッチします。”

引用:RegExp – JavaScript | MDN

そこで、

var regCont = new RegExp('■お問い合わせ内容:' + '[\\s\\S]*?' + '■送信元:');
var Cont = body.match(regCont)[0].replace('■お問い合わせ内容:', '').replace('■送信元:', '').replace('\r', '');

「’.*?’」の部分を「'[\\s\\S]*?’」に変えます。

\sは

“スペース (space)、タブ、改ページ、改行、その他のユニコードでのスペースを含む、単一の空白文字にマッチします”

引用:RegExp – JavaScript | MDN

 

\Sは

“空白以外の単一の文字にマッチします。”

引用:RegExp – JavaScript | MDN

これで改行を含む複数行を抜き出すことができます。

※\が2つあるのはエスケープ対策です。

また、その長さを「’■送信元:’」までと指定することにより、お問い合わせ内容の長さが一定でなくても抜き出せるようにしました。

 

以前からとの変更点はわずかではありますが、これで色んな文章に対応できるようになりました。

今回参考にさせていただいたページはこちらです。ありがとうございました。

JavaScript – javascript 正規表現で複数行にまたがる値にマッチしない(21956)|teratail

JavaScriptで改行にもマッチする正規表現 – FFFF – 0x

RegExp – JavaScript | MDN

 

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

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

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

QUERY関数の便利な使い方

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

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

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

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

【GAS】Gmailの受信トレイにあるメールの添付ファイルを自動でGoogleドライブへ保存する

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

【GAS】OCRを使った画像の文字取得を自動化する

【GAS】お手軽なOCRの自動化をスプレッドシートで扱いやすくする


この記事の作者

アバター
ヨシモト


総記事本数:18

この記事へのコメント

    • あんこ さん
      2018年9月3日 2:33 PM
    • 返信

    はじめまして。
    ヨシモト様の記事内容がとてもわかりやすく、参考にさせていただいております。
    メールの文章抜き出しにて、携帯番号を抽出したいと考えておりますが
    スプレッドシートに書き出された携帯番号は先頭の”0″が表示されず、困っております。
    対策として、スプレッドシート内の列全体の書式設定を書式なしテキストに変更し、スクリプトを走らせても先頭の”0″が表示されません。
    解決方法をご存知でしたらご教示いただけますと幸いです。

    何卒よろしくお願いいたします。

      • ヨシモト さん
        2018年9月3日 3:37 PM

      あんこ さん

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

      >スプレッドシートに書き出された携帯番号は先頭の”0″が表示されず、困っております。
      >対策として、スプレッドシート内の列全体の書式設定を書式なしテキストに変更し、スクリプトを走らせても先頭の”0″が表示されません。

      シートの状態を見ていないので具体的な策をご提案できませんが、
      このスクリプトは書式設定にはノータッチですので、恐らく原因はスクリプトではなく、スプレッドシート自体にあると思います。
      「スプレッドシート 電話番号」でググると同様の内容が多数出てきますので一つずつお試しになられてみてはいかがでしょうか。
      せっかくコメントいただいたのに、お力になれずに申し訳ございません。

    • あんこ さん
      2018年9月3日 4:48 PM
    • 返信

    ヨシモト様

    早速ご返信いただきありがとうございます。
    ヨシモト様のコメントにあった通り、「スプレッドシート 電話番号」でググると
    解決用のスクリプトを作成していらっしゃる方がおり、無事解決することができました。
    解決の為、貴重なお時間を割いていただき誠にありがとうございました。

    • くら さん
      2018年12月24日 6:23 PM
    • 返信

    ものすごくわかりやすく勉強させて頂いてます。ほんとうにありがとうございます。

    以下のような、■お問い合わせ内容:以降をすべて抽出する方法はあるのでしょうか。。。


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

    • くら さん
      2018年12月24日 7:39 PM
    • 返信

    var regCont = new RegExp(‘■お問い合わせ内容:’ + ‘[\\s\\S]*?’ + ‘.*$’);
    var Cont = body.match(regCont)[0].replace(‘■お問い合わせ内容:’, ”).replace(/\r?\n/g, ”);

    先ほどは失礼しました。
    試行錯誤していたら自己解決できました。
    あっているのかは不明なので、不必要なものがあるのかもしれませんが、やりたい事は実現できました。
    今日初めてjava?というんでしょうか?このjavaに触れまして、0からでしたが、ヨシモト様のお陰でとても分かりやすく理解することができました!ありがとうございました!

      • ヨシモト さん
        2018年12月25日 11:13 AM

      くらさん
      コメントありがとうございます。

      >今日初めてjava?というんでしょうか?
      Google Apps ScriptはベースがJavaScriptで、Javaとは別のものですね。

      疑問について解決されたようで良かったです。私も参考にさせていただきます。
      ありがとうございました。

くら にコメントする コメントをキャンセル

知識の記事

  1. Young woman using a laptop computer. Graphic designer. UX design.
    仕事で大活躍のGoogle Chrome拡張機能を紹介
  2. 無題
    WordPressで出力内容が動的に変わる固定ページの<title>を変更
  3. ai_computer_sousa_robot
    【GAS】お手軽なOCRの自動化をスプレッドシートで扱いやすくする
  4. 無題
    暑い、暑いですね、会社(と紙)の話をします。

おすすめ記事

  1. 2vmuBJtYEC1oNxv1575967002_1575967016
    「波乱の幕開け」事業レポート(12/09~12/13)
  2. Qq6ekREW7NMriVV1575364443_1575364473
    「12月始まりました!」事業レポート(12/02~12/06)