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

 

ちなみに、appendRowはとても便利ですが、数が多い時にはスピードが気になるかと思います。

※GASは実行時間に制限があり、その時間を超えると処理が途中でもストップします。

今度は書き込みの際のスピードアップについて解説したいと思います。

 

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

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

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

QUERY関数の便利な使い方

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

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

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

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

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


この記事へのコメント

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

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

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

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

      あんこ さん

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

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

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

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

    ヨシモト様

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

コメントをどうぞ

ツールの記事

  1. bg_kaitenzushi
    【GAS】Gmailで複数のメールの添付ファイルを一括でGoogleドライブへ保存する
  2. kid_job_boy_programmer
    【GAS】正規表現を使って複数行の文章をGmailから抜き出す
  3. createSSAsan
    【簡単】Google Apps Script(GAS)でメールを送る
  4. Vimが辛い人
    Vimが使いにくい人はVimiumからはじめてみたらいいかもしれない

おすすめ記事

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

人気の記事

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