みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Gmailに届いたWordPressサイトからの問い合わせメールの分析を進めています。
前回こちらの記事で
Google Apps Scriptで過去の問い合わせメールを特定条件で検索して取り出す方法についてお伝えしました。
今回はGoogle Apps Scriptにスクリプトを追記して、取り出したメールたちをスプレッドシートに書き出してみたいと思います。
では、行ってみましょう!
前回のおさらいと今回のお題
前回作成したスクリプトはこちらです。
function searchContactMail() { var strTerms = '("このメールは 株式会社プランノーツ http://plannauts.co.jp のお問い合わせフォームから送信されました" OR ' + '"このメールは いつも隣にITのお仕事 http://tonari-it.com のお問い合わせフォームから送信されました")'; var myThreads = GmailApp.search(strTerms, 0, 500); //条件にマッチしたスレッドを取得、最大500通と決まっる var myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納 for(var i=0;i < myMsgs.length;i++){ Logger.log(myMsgs[i][0].getSubject()); } }
検索条件がちょっと強引な感はありますが…
- 特定のメッセージが含まれるスレッドを抽出
- スレッドからメッセージを取得し二次元配列に格納
- 各スレッドの1番目のメールの件名をログ出力
という流れになりますね。
各スレッドの1番目のメールがほぼ間違いなく問い合わせメールになります。ちなみに、各スレッドの2番目以降のメールは、問い合わせに対する私の返信などを含む、一連のメールのやり取りということにほぼ間違いありません。
詳細は前回記事をご覧ください。
今回は上記流れの3のところを修正して、各スレッドの1番目のメールについて
- 日時
- 送信元
- 件名
- 本文
をスプレッドシートに書き出していきたいと思います。
シートはこのように準備しました。
メールの日時、送信元、件名、本文を取り出す
各メールについてのに日時、送信元、件名、本文を取り出すには、それぞれ以下のメソッドを使います。
日時:メール.getDate()
送信元:メール.getFrom()
件名:メール.getSubject()
本文:メール.getPlanBody()
ではこれらを用いてスクリプトを修正してみましょう。こちらです。
function searchContactMail() { /* Gmailから特定条件のスレッドを検索しメールを取り出す */ var strTerms = '("このメールは 株式会社プランノーツ http://plannauts.co.jp のお問い合わせフォームから送信されました" OR ' + '"このメールは いつも隣にITのお仕事 http://tonari-it.com のお問い合わせフォームから送信されました")'; var myThreads = GmailApp.search(strTerms, 0, 500); //条件にマッチしたスレッドを取得、最大500通と決まっている var myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納 var valMsgs = []; /* 各メールから日時、送信元、件名、内容を取り出す*/ for(var i = 0;i < myMsgs.length;i++){ valMsgs[i] = []; valMsgs[i][0] = myMsgs[i][0].getDate(); valMsgs[i][1] = myMsgs[i][0].getFrom(); valMsgs[i][2] = myMsgs[i][0].getSubject(); valMsgs[i][3] = myMsgs[i][0].getPlainBody(); } /* スプレッドシートに出力 */ SpreadsheetApp.getActiveSheet().getRange(2, 1, i, 4).setValues(valMsgs); //シートを取得 }
メールから各情報を取り出していったんvalMsgsという二次元配列に格納をして、最後にsetValuesメソッドで一気にスプレッドシートに張り付けるという方法をとっています。
このあたり、詳しくはこちらの記事をご覧ください。
実行結果
このスクリプトを実行してみると
こうなります。
一応ちゃんとシートに出力できているのですが
- 本文が長すぎて見づらい
- 送信元が自分のアドレスになっている
という問題点があります。この点を修正していきたいと思います。
文字列から指定の範囲だけ取り出す
まず本文が長すぎるので文字数でぶった切ってシートへ入力してしまいましょう。
文字列の部分文字列を取り出す場合はsliceメソッドを使いまして
文字列.slice(開始位置, 終了位置)
とします。
例えば50文字だけ取り出すのであれば
valMsgs[i][3] = myMsgs[i][0].getPlainBody().slice(0,50);
とします。
スレッドのパーマリンクを取得する
この場合、本文を全部読みたくなるときに困ります。
その時には、そのメールへのリンクを踏んでその先で全文を読めるようにしましょう。
パーマリンクはスレッド単位での取得になりますが、特定のスレッドのパーマリンクを取得する場合はgetPermalinkメソッドで
スレッド.getPermalink()
と書きます。
メールの返信先を取得する
次に送信元が自分のアドレスになってしまっている件を解決していきます。
問い合わせフォームを作成しているWordPressプラグインContact Form 7のメールの設定を確認すると
確かに、送信元が自分のアドレスになってしまっています。
過去のものは直しようがありませんので、今回は代替案として、「追加ヘッダー」に設定されている返信先つまり「Reply-To」の値をもって、送信元としたいと思います。
メールの返信先を取得する際はgetReplyToメソッドで
メール.getReplyTo()
とすればOKです。
Gmailからメールを取得してスプレッドシートに書き出すスクリプト
以上をまとめると、こちらのスクリプトになります。
function searchContactMail() { /* Gmailから特定条件のスレッドを検索しメールを取り出す */ var strTerms = '("このメールは 株式会社プランノーツ http://plannauts.co.jp のお問い合わせフォームから送信されました" OR ' + '"このメールは いつも隣にITのお仕事 http://tonari-it.com のお問い合わせフォームから送信されました")'; var myThreads = GmailApp.search(strTerms, 0, 500); //条件にマッチしたスレッドを取得、最大500通と決まっている var myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納 var valMsgs = []; /* 各メールから日時、送信元、件名、内容を取り出す*/ for(var i = 0;i < myMsgs.length;i++){ valMsgs[i] = []; valMsgs[i][0] = myMsgs[i][0].getDate(); valMsgs[i][1] = myMsgs[i][0].getReplyTo(); valMsgs[i][2] = myMsgs[i][0].getSubject(); valMsgs[i][3] = myMsgs[i][0].getPlainBody().slice(0,200); valMsgs[i][4] = myThreads[i].getPermalink(); } /* スプレッドシートに出力 */ SpreadsheetApp.getActiveSheet().getRange(2, 1, i, 5).setValues(valMsgs); //シートを取得 }
18行目ですが本文を取り出す文字列は200文字にしました。
また19行目のパーマリンクの出力先をE列にしましたので、それに伴って24行目のgetRangeの列幅を5に変更しています。
実行結果
実行結果はこちらです。
前に比べるとだいぶ見やすくなりましたね。
またパーマリンクをクリックすると
このように各メールの全文を確認できるページが開きます。
まとめ
以上、Google Apps ScriptでGmailから特定条件で検索したメールをスプレッドシートに出力をする方法をお伝えしました。
各メールについて日時、送信元、件名、本文、返信先を、そして各スレッドについてパーマリンクを取得するメソッドを紹介しましたが、他にもありますので、用途に応じて調べてみて下さいね。
Class GmailApp | Apps Script | Google Developers
これで過去の問い合わせについて分析する地盤が整いましたので、分析を進めていきたいと思います。
どうぞお楽しみに!