Google Apps ScriptでGmailのメール内容を解析してスプレッドシートに書き込むための手順

公開日:2016/09/26 更新日:2016/09/26
Google Apps ScriptでGmailのメール内容を解析してスプレッドシートに書き込むための手順のサムネイル

はじめに

Webサイトのお問い合わせフォームから送信されたメールを蓄積して傾向などを調べることは多くの人にとって重要だと思います。しかし、そのようなことはせずその都度対応だけして終っている方も多いと思います。ここでは、お問い合わせメールの管理の一歩として、お問い合わせメールの内容をGoogleスプレッドシートに自動で保存するシステムの構築手順をメモします。

構築するシステムの前提と概要説明

まず、以下のようなお問い合わせフォームがWebサイトにあるとします。

inquiry_form_example.png 上記を見てわかるように、このお問い合わせフォームには以下の4項目の情報が含まれます。

  • お名前
  • メールアドレス
  • 電話番号
  • お問い合わせ内容

そしてこのお問い合わせフォームが送信される度に、その内容が以下のようなスプレッドシートに自動保存されるようになります。

spreadsheet_example.png

以降で上記を実現するための手順を説明します。

構築の流れ

以下のような流れになります。

  • Webサイトの自動返信メールを設定 まずはじめに、お問い合わせフォームからの自動返信メールを自分のGmailアドレスに届くよう設定しておきます。また、自動返信メールの本文をXML形式で記述しておきます。
  • Gmailの受信メールを解析してスプレッドシートに書き込むGoogle Apps Script作成 お問い合わせフォームからの内容を保存するためのスプレッドシートを作成して、メール取得やスプレッドシート保存を行うGoogle Apps Scriptを書きます
  • Google Apps Scriptを一定時間間隔で実行するための設定 最後に書いたスクリプトを一定時間間隔で自動実行するよう設定します。
それぞれについて順番に書きます。

Webサイトの自動返信メールを設定

まず前提として、自分のWebサイトのお問い合わせフォームの自動返信メールの送信先や内容を自由に設定できるとしています。 例えば、WordPressでプラグインなどを使用してお問い合わせフォームを設置した経験がある方は分かるかと思いますが、これらのお問い合わせフォームでは、お問い合わせフォーム送信時に、お問い合わせした本人のアドレスや自分で指定したアドレスに自動返信メールを送信することができます。また、この自動返信メールの中身は自由に設定できます。そこで、これを利用してこの自動返信メールの送信先の1つを自分のGmailに設定しておきます。

また、今回は自動返信メールに以下のようなXML形式で記述された内容を記述しておきます。XML形式で記述する理由は、お問い合わせメールの内容に含まれる各情報(ここではお名前、メールアドレス、電話番号、お問い合わせ内容の4項目)をGoogle Apps Scriptを使って取り出しやすくするためです。なお、ここで使うXMLは全く複雑なものではなく、馴染みがなくても見ればすぐに分かると思います。詳しくは後述します。 例えば、WordPressのプラグインである「Contact Form 7」の場合は、お問い合わせフォームの各項目の変数名を[your-name]のように指定できます。ですので、Contact Form7 を使っている場合は以下のように自動返信メールの中身を設定しておきます。以下の[your-name][your-email][your-tel][your-content]がそれぞれお問い合わせフォームで入力された値に置換されてメールが送信されます。

<inquiry>
    <customer>[your-name]</customer>
    <email>[your-email]</email>
    <tel>[your-tel]</tel>
    <content>[your-content]</content>
</inquiry>

上記のような自動返信メールを設定しておけば、当然ながら以下のようなメールが指定したGmailに届くようになります。

gmail_example.png

そして後はGoogle Apps Scriptでメールを取得&XML解析して、各マークアップの値を取得します。これについては後述します。 XMLの記述ルールについては以下のサイトが参考になると思います。

1週間で学ぶIT基礎の基礎 XML入門~乗り遅れたと感じるあなたへ(第2回)| ITPro

なお、注意点としては、XML部分より以前に1文字でも記述されていると、Content is not allowed in prologのようなエラーがGoogle Apps Scriptから警告されます。 また、逆にXML部分よりも後に1文字でも記述されていると、今度はContent is not allowed in trailing sectionというようなエラーが表示されるので注意が必要です。 すなわち、XML形式の前後に不要な文字は記述せず、XMLのルールに準拠している必要があります。

Gmailの受信メールを解析してスプレッドシートに書き込むGoogle Apps Script作成

あとはメール内容の保存先となるスプレッドシートを新規作成して、新規作成したスプレッドシートからスクリプトエディタを開きます。そしてそこにスクリプトを書き込みます。 なお、スクリプトエディタは以下のようにメニューの「ツール」から開けます。

script_editor.png

スクリプト

スクリプトは以下のようになります。以下のスクリプトは条件に合致するメールを自分のGmailアカウントから検索して取得、取得したメールの受信日、件名、本文を取り出しています。そしてメール本文についてはさらにXMLを解析して各マークアップに格納されている値を取得し、スプレッドシートにまとめて書き込んでいます。 コメントを入れているので長くなっていますが、コード自体はかなり短くて済みます。内容については、コメントを参照して頂ければ大体わかるかと思います。

function getMailandInsert(){
  
  var sheet = SpreadsheetApp.getActiveSheet();
  
  // 特定のスプレッドシートを指定してそこに書き込む場合
  // スプレッドシートのIDは、https://docs.google.com/spreadsheets/d/ここがスプレッドシートのID/edit#gid=0
  // var fileid = "スプレッドシートのID"
  // var sheetfile = SpreadsheetApp.openById(fileid)
  // var sheet    = sheetfile.getSheetByName('シート名');
  
  // start potision
  var start = 0;
  
  // 取得するメールの最大件数
  var max = 5; 
  
  // スプレッドシートに挿入するデータ列数
  // ここでは受信日、差出人、件名、お名前、メールアドレス、電話番号、お問い合わせ内容の7つ
  var insertCol = 7; 
  
  // 条件にマッチする受信メールを取得
  // ここで検索する受信メールは、このスプレッドシートを開いているGoogleアカウントのGmailになります。
  var threads = GmailApp.search('from:contact@example.local is:unread',start,max);
  
  // 条件にマッチしたスレッド数
  var length = threads.length;
  
  // データ保存先となるシートの最終行。すなわち挿入開始位置
  var row = sheet.getLastRow() + 1; 
  
  // 取得したメール内容を格納する用の配列
  var resultArr = new Array(); 
     
   for( var n in threads ){
    
      var the = threads[n];
    
      // スレッド内のメールを取得
      var msgs = the.getMessages();
    
      // スレッド内のメールを解析して resultArr に格納
      returnData(msgs, resultArr);        
    
      // 取得したスレッドを既読にする
      the.markRead(); 
    
      Utilities.sleep(1000);       
    }
      
   if( length != 0 ){
      sheet.getRange(row, 1, length, insertCol).setValues( resultArr ); // データ保存
   }
    
}

function returnData(msgs, resArray) {
  
  
  for( m in msgs ){
    
    try{
      
      var tempArray = new Array();
      var msg = msgs[m];
    
      // メールの日付
      var date = msg.getDate();

      // メールの送信元アドレス
      var from = msg.getFrom();
    
      // メールの件名
      var subject = msg.getSubject();

      // メール本文をPlainBodyで取得
      // getPlainBody以外については、https://developers.google.com/apps-script/reference/gmail/gmail-message
      var body = msg.getPlainBody();
    
      // bodyをXMLパーサーで解析
      var xml = XmlService.parse(body);
    
      // XML解析結果のルート要素を取得
      var root = xml.getRootElement();

      // XML内の各子要素を指定してその値を取得。下記のgetChildの中身は自分で設定したXMLのマークアップに合わせてください。
      var customer = root.getChild("customer").getText();
      var email = root.getChild("email").getText();
      var tel = root.getChild("tel").getText();
      var content = root.getChild("content").getText();    
  
      // 各値を配列に格納
      tempArray[0] = date;
      tempArray[1] = from;
      tempArray[2] = subject;
      tempArray[3] = customer;
      tempArray[4] = email;
      tempArray[5] = tel;
      tempArray[6] = content;

      // 配列をpushで末尾に追加
      resArray.push(tempArray);
      
     }catch(e){
       Logger.log("Error: " + e);
     }
    
    }
       
}

以下が注意点となります。

  • 上記はスレッド(同じ差出人のメールがまとまったもの)形式でメールを取得しています。そしてスレッドには複数のメールが含まれる場合があるので、各スレッドの各メールに対してXML解析をしています。ただし、上記のコードでは自動返信メールに対して返信などをすることはなく、自動返信メールのみで完結すること(すなわち、各スレッドにはXML形式で記述された1つの自動返信メールのみが含まれる)ことを想定しています。
  • 取得するメールの条件として、「差出人のメールアドレスがcontact@example.localである」 かつ 「未読である」に設定しています。ここの条件としては、メールの件名や特定のラベルなど他にも色々な条件を指定可能です。詳しくは以下のURLが参考になると思います。
    Gmail で使用できる検索演算子 | Gmailヘルプ 演算子を使ったフィルタ条件の記述方法 | AjaxTower
  • 以下の83 ~ 87行目のgetChildで指定しているcustomeremailtelcontentは、冒頭で書いた自動返信メールに設定したXMLマークアップを指定しています。
    // XML内の各子要素を指定してその値を取得
          var customer = root.getChild("customer").getText();
          var email = root.getChild("email").getText();
          var tel = root.getChild("tel").getText();
          var content = root.getChild("content").getText();    
    
    

なお、このスクリプトがきちんと動作するかは、以下のようにメニューから直接実行することで確認できます。

execute_script.png

もちろん、これを毎回手動で実行するのは手間ですので、あとはこのスクリプトを一定の時間間隔で自動実行するよう設定します。

Google Apps Scriptを一定時間間隔で実行するための設定

以下のように、スクリプトエディタのメニュー内の「リソース」→「現在のプロジェクトのトリガー」をクリックします。

trigger_for_project.png

すると以下のような画面が表示されるので、「今すぐ追加するにはここをクリックしてください」という部分をクリックします。

click_here.png

後は以下のように好きなトリガーを指定します。お問い合わせメールが届く頻度にもよりますが、以下では10分毎にスクリプトを実行するようトリガを指定しています。

10minutes_trigger.png

まとめ

簡単なものではありますが、このようにお問い合わせメールを自動でスプレッドシートに保存して蓄積していくと後々便利です。間違いや他に良い方法がありましたらぜひコメントよろしくお願いします。

関連記事

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。