Initial Site

Initial Site

Initial Site

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

  • ヨシモト2018/01/11 19:39
tokuige

営業部 ヨシモトです。

 

Google Apps Script(以下、GAS)については以前簡単にお話しました(期間が空いてしまいました)が、うまく扱うことができると便利です。

今回はGASを使って、Gmailから受信日時や本文の一部を抜き出しスプレッドシートに入力する方法をご紹介します。

メールから文章を抜き出すこともプログラマーさんならばいとも簡単ですが、
我々ノンプログラマーにとっては未知の領域です。

是非とも覚えてみましょう。

 

こんな時に使いたい

例えば、お問い合わせフォーム経由でいただいたお問い合わせ内容を下記のようなメールで受け取っているとします。
 
—————-
≪お客様≫からお問合せがありました。
 
内容は以下の通りです。
 
■ご用件:資料請求について
■お名前:ヨシモト
■ご連絡先電話番号:090-****-****
■ご連絡先メールアドレス:sample@example.com
■お問い合わせ内容:資料を送ってください。
■送信元:スマートフォン
 
—————-

そして、これまでに受け取ったお問い合わせから、

  • ・問い合わせの多い用件は何か
  • ・問い合わせはパソコン、スマートフォンそれぞれどれくらいの割合なのか

等を調べたい時に使いたいですね。

少数であれば1通1通開いても良いですが、数百件、数千件といった場合にこそ役に立ちます。

 

実践

function getMailToiawase(){
    var sheet = SpreadsheetApp.getActiveSheet();
    var search = 'お問合せがありました';
    var start = 0;
    var max = 100;
    var thds = GmailApp.search(search,start,max);
    var row = 1;
    for(var n in thds){
        var thd = thds[n];
        var msgs = thd.getMessages();
        for(m in msgs){
            var msg = msgs[m];
            var date = msg.getDate();
            var body = msg.getBody();
            var bodys= body.replace('■ご用件:','')
              .replace('■送信元:','');

           // 改行を使って配列化する
         var ary = bodys.split("\n");
          
            // ご用件の行を取得し文字を抽出
            var yoken = ary[4].substring(0).replace('\r','');
    
            // 送信元の行を取得し文字を抽出
            var dvi = ary[9].substring(0).replace('\r','');
          
            sheet.getRange(row,1).setValue(date);
            sheet.getRange(row,2).setValue(yoken);
            sheet.getRange(row,3).setValue(dvi);
            row++;
        }
    }
  var range = sheet.getRange("A:C");
  range.sort({column: 1, ascending: true});
}

こんなふうにします。

 

すると

gasresult

できました!(本当に2件ならGASを使う必要がありません!)

 

解説

このスクリプトの中をいくつかピックアップして解説します。

 

var serach = ‘お問合せがありました’;
Gmailの中を「”お問合せがありました”」で検索します。

 

 

var ary = bodys.split(“\n”);

※↑のコードの¥マークは本来バックスラッシュですのでコピペの際はご注意ください。

本文を改行ごとに配列化します。
(本文を取得しただけでは文字の集合であるだけなので、ここから欲しい情報を指定する必要があります。
今回は改行毎に並べることで「*行目を取得」と指定できるようにします。)

 

replace(‘■ご用件:’,”)

「■ご用件:」はスプレッドシートの中に不要なので replace で空欄に置き換えています。

 

var yoken = ary[4].substring(0).replace(‘\r’,”);

ご用件はメールの5行目にあるのですが、1行目から[0]と数えるためary[4]で5行目と指定、抽出します。

※2018/02/15 追記
(このままだと改行も含まれるため、用件を抽出と同時に改行を空欄に置き換えます。)
 
sheet.getRange(row,1).setValue(date);
sheet.getRange(row,2).setValue(yoken);
sheet.getRange(row,3).setValue(dvi);

A列に日時
B列にご用件
C列に送信元が入力されるようにします。

 

var range = sheet.getRange(“A:C”);
range.sort({column: 1, ascending: true});

最後に「A列が昇順」になるようにA列からC列を並び替えています。
(trueをfalseに置き換えると降順にできます。)

 

その他の使い方

データの量がものすごく多い場合はこのスクリプトでデータベース用のシートを作成し、
必要な情報だけを別なシートで取得するといった使い方もできます。

その時はVLOOKUP関数やQUERY関数、ARRAYFORMULA関数を組み合わせて使うとより効率的でしょう。
ちなみにQUERY関数やARRAYFORMULA関数はエクセルにはなく、スプレッドシートならではの機能です。

 

※2018/1/25 更新

上記で取得したデータをCOUNTIF等で扱おうとした場合、このままでは取得できません。
パッと見ではわかりにくいですが後ろに改行が含まれています
こんな感じです→パソコン\r
ですので、Ctrl + Fで検索ウィンドウを開き「その他のオプション」で、
「正規表現を使用した検索」にチェックを入れ、
「\r」を検索し「(空欄)」に置換しましょう。

すると、これでCOUNTIF等で扱えるようになります。

改行について

 

※2018/02/15 更新

「\r」を空欄に置換する方法は煩わしいので、本文取得の際に「\r」もreplaceで空欄に置き換えられるようにスクリプトを更新しました。

これでそのままスプレッドシートで利用できます。

 

※2018/06/04 追記

行数を指定せずに抜き出す方法について新たに記事を書いたのでリンクを貼っておきます。

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

 
 
次回はエクセルにはない、スプレッドシートの便利な関数をご紹介します。

スプレッドシート独自の便利な関数 | 株式会社InitialSite

 
 
その他、スプレッドシートやGASに関する記事はこちらからどうぞ。
Google Apps Script はじめました

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

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

QUERY関数の便利な使い方

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

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

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

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

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

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

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

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

ReactとFirebase(Cloud Firestore)を使って独り言WEBアプリをつくる


この記事の作者

アバター
ヨシモト


総記事本数:17

この記事へのコメント

    • テレンスリー さん
      2018年1月24日 11:42 AM
    • 返信

    わかりやすい記事ですね!
    参考にさせていただきました。

      • ヨシモト さん
        2018年1月25日 4:11 PM

      テレンスリー さん
      コメントありがとうございます。
      今後もこのような内容を書きますので、よろしければご覧ください。

    • ひろたろう さん
      2018年8月10日 2:11 PM
    • 返信

    はじめまして、とてもわかりやすく参考になります!!
    私も試しにやってみて、近いところまではいくのですが、
    TypeError: undefined のメソッド「substring」を呼び出せません。
    と出てきます。
    何か間違っているのかご教示いただけないでしょうか?

      • ヨシモト さん
        2018年8月10日 3:51 PM

      ひろたろう さん
      コメントありがとうございます。

      >TypeError: undefined のメソッド「substring」を呼び出せません。

      コードを拝見していないので絶対とは言い切れませんが、
      ○○[0].substring(0).replace(‘\r’,”);
      の○○に何も入っていない可能性が考えられると思います。
      試しにsubstringを含む行をコメントアウトをした上で、
      ○○[0]の中身をLogger.logで確認してみてください。

      例)↓4の部分は実際にご指定している数字に置き換えてください。
      Logger.log(○○[4])
      //○○[4].substring(0).replace(‘\r’,”);

      ↑こちらを加えて実行したあとでCtrl + Enterを押すと○○[4]に何が格納されているのか(されていないのか)がわかると思います。
      もしも意図したものと違うものが入っている(何も入っていない)場合は[4]この数字を変更してから同じように確認してみてください。

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

    • ひろたろう さん
      2018年8月12日 12:41 AM
    • 返信

    ご指摘ありがとうございました。
    ヨシモトさんに教えて頂いた方法も含めてデバッグを繰り返してみたところ、
    あらかじめ用意しておいたテンプレートに必要事項だけ書き込み送信できるようにしていたせいか、
    Gメールアドレスから来たものだけが引っ掛かってエラーが起きていました。
    他のauやWindows、iPhoneなどのアドレスからきたメールのみにしてGメールアドレスからきたメールを
    はじいて実行したところ無事完了できました。

    憶測ではありますが、Gメールのフォントサイズや種類などの情報も、
    bodyに含まれてしまっているのかもしれないです。
    ご丁寧にアドバイスしていただき、ありがとうございました。

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

      ひろたろう さん
      コメントありがとうございます。

      >憶測ではありますが、Gメールのフォントサイズや種類などの情報も、
      >bodyに含まれてしまっているのかもしれないです。

      ということはもしかすると、
      var body = msg.getBody();

      var body = msg.getPlainBody();

      にするとgmailからのものをはじかずに済むかもしれませんね。
      私の環境では試すことができませんが、よろしければお試しください。

      ご返信ありがとうございました。

    • りか さん
      2018年9月14日 4:40 PM
    • 返信

    この記事のおかげで仕事のピンチを乗り切りました((+_+))
    ありがとうございます!!

    ただ今null状態で送られてきたときのために付け足し作業中です。
    がんばります!(^^)!

      • ヨシモト さん
        2018年9月14日 5:42 PM

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

      お役に立てて何よりです。

      どんどん改良して使ってみてください。

      お互いに頑張りましょう!

    • まちこ さん
      2020年1月8日 11:17 AM
    • 返信

    わかりやすい投稿ありがとうございました。
    お陰様で手作業しなくてすみます(泣)
    活用させていただきます!

      • ヨシモト さん
        2020年1月9日 3:14 PM

      まちこ さん
      コメントありがとうございます。
      手作業が減るとミスも減りますしいいこと尽くめですね!
      自動化広めていきましょう!

    • こうじ さん
      2020年1月10日 1:25 PM
    • 返信

    まさに自分が探していた記事です!問い合わせメールの転記をする手間を省くと共に、漏れも無くなりました!
    記事を書いて頂きありがとうございました!

      • ヨシモト さん
        2020年1月13日 5:21 PM

      こうじ さん
      コメントありがとうございます。
      記事を書いた当時は「自分の作業効率が圧倒的に良くなった、他の人の役にも立つかもしれない」と思い書き上げましたので、そのようなコメントをいただけて嬉しいです。
      他にも効率化記事がありますのでよろしければご覧ください。
      http://www.initialsite.com/author/yoshimoto

    • 匿名 さん
      2020年4月24日 5:22 PM
    • 返信

    全くの素人でここに行き着いたのですが、まったく動く気配がありません。
    メール本文が下記のようになっている場合、行数を変更するだけでは動かないのでしょうか。
    作業軽減したいのですが、素人には無理っぽいですね
    ■ご用件
    資料請求について
    ■お名前
    ヨシモト

      • ヨシモト さん
        2020年4月27日 1:39 PM

      匿名 さん
       
      コメントありがとうございます。
       
      こういう場合ということでうよろしいでしょうか?
      —————-
      ≪お客様≫からお問合せがありました。
       
      内容は以下の通りです。
       
      ■ご用件
      資料請求について
      ■お名前
      ヨシモト
      —————-
       
      この内容だとして行数だけを変更して実行してみたところ取得できましたので行数以外のところに原因があるかもしれません。
       
      「実際のコード」と「エラーメッセージ」を教えていただけましたら確認できますのでよろしければご返信ください。
      ※動かなかった時に赤く表示されるメッセージです。
       
      余談ですが、この記事を書いた当時の私は素人でしたので根気強くチャレンジすればできると思います。
      こういったものは大体一発では動かないものなので、動かないときに動かない原因を理解することが次へ進む一歩になります。
      微力ながら応援したしますので、なんとか成功させましょう。
       
      ヨシモト

      • 匿名 さん
        2020年4月28日 1:22 PM

      コメント頂きありがとうございます。
      エラーメッセージなどは表示されず、実行するとスプレッドシートには何も反映されない状態です。

      var search = ‘お問合せがありました’;
      上記、お問合せがありましたを変更し

      下記部分を削除してみました。
      >var bodys= body.replace(‘■ご用件:’,”)
      >.replace(‘■送信元:’,”);

      行数は1行から順に変更し挑戦してみました(笑)

      私の理解度が低すぎることが原因と思います。。。。

        • ヨシモト さん
          2020年4月28日 1:59 PM

        匿名さん
         
        その付近を
        var body = msg.getBody();
        Logger.log(body);
         
        var ary = body.split(“\n”); // bodysをbodyに代えてください
        にしてみてください。
        Logger.log(body)は、実行後にスクリプトエディタ画面でctrl + Enter を押すとbodyに何が入っているか(入っていないのか)が確認できます。
        もしbodyが空であればLogger.log(msg)をしてみたり等どこまでの変数に値が入っているのか辿っていってください。
        どこまで入っていて、どこから空になっているのかわかれば対処できると思います。
        ※Logger.logは複数設置できますのでそこまでに代入されている変数なら確認できます。
        最後の行にまとめて書いてもいいと思います。
         
        ヨシモト

      • 匿名 さん
        2020年4月30日 11:31 AM

      ヨシモトさま
      ありがとうございます。反映されました。
      お陰様で業務が簡素化されます。本当にありがとうございました。

        • ヨシモト さん
          2020年5月1日 12:09 PM

        匿名さん
         
        上手くいったようで何よりです。
        お疲れ様でした。
         
        ヨシモト

    • いくみ さん
      2020年5月9日 5:42 PM
    • 返信

    はじめまして。
    他のどのサイトよりもわかりやすく、初めて実行に成功しました!

    ただあと一つ、条件があって、
    「Gmailの未読の分だけを追記していく」という場合、

    更に複雑な構文になるでしょうか・・

      • ヨシモト さん
        2020年5月12日 12:17 PM

      いくみさん
       
      コメントありがとうございます。
       
      実行成功おめでとうございます。
       
      > 「Gmailの未読の分だけを追記していく」という場合、
      こちらについてですが、
      var search = ‘お問合せがありました’;

      var search = ‘is:unread お問合せがありました’;
      とすると未読のメールに限定して検索されるので処理の対象もその通りになります。
       
       
      余談ですが、GASで処理しただけだと「未読」→「既読」には変わりませんので、
      もしも既読にする必要がある場合はスレッドに対して
      markRead() という処理をすると既読にできます。
       
      必要な際は下記のドキュメントを読んでみてください。
      ※英語ですがもし苦手な方でもChromeの翻訳機能でも十分に読めるかと思います。
       
      公式ドキュメント: Class GmailThread |Apps Script |Google Developers
       
      ヨシモト

    • 南 さん
      2020年7月15日 5:23 PM
    • 返信

    はじめまして
    お客様からのアンケートがGmailに届くのでそれをスプレッドシートに入力したく、色々と検索したのですが
    なかなかうまくいかず、コメントさせていただきました。
    ■内容
    資料請求について
    ○○について
    ■お名前
    ▲▲
    回答がある場合はいいのですが、空欄の場合、うまくいかず、
    内容に関しての項目に■お名前と表示されてしまいます。
    スクリプト内でここからここまでという風な範囲指定が可能であればその方法を教えていただけますでしょうか?
    全くの素人の為、詳しく教えていただけるとありがたいです。

      • ヨシモト さん
        2020年7月16日 12:46 PM

      南さん
       
      コメントありがとうございます。
       
      【GAS】正規表現を使って複数行の文章をGmailから抜き出す この記事に書いた内容で取得できると思います。
       
      例えば

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

      これは「■お問い合わせ内容」から「■送信元」までを抜き出してますので中身を差し替えてみてください。
       
      ヨシモト

コメントをどうぞ

おすすめ記事

  1. 2af1a7d9bbe73319a6c346c407cdefbf_m
    リモートワークに移行します
  2. ウィルス画像
    横浜のブラック企業 Initial Site(イニシャルサイト)からコロナウイルスで考えたこと。B…
  3. E5DxwzVgVHYHr411581668296_1581668370
    わたしは公家ではありませんでした(多分)
  4. 1b8493ba94ff68762824c3c7274b3128-e1499313795652
    イオンの保存容器はジップロック超えた!?※主観的視点