みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
GASでGmailに届いたWordPressサイトからの問い合わせメールの分析を進めています。
前回こちらの記事でGASで過去の問い合わせメールを特定条件で検索して取り出す方法についてお伝えしました。
今回は、Google Apps Scriptでメッセージの内容をスプレッドシートに書き出す方法をお伝えします。
では、行ってみましょう!
前回のおさらいと今回のお題
前回作成したスクリプトはこちらです。
function searchContactMail() { const query = '"このメールは 株式会社プランノーツ http://plannauts.co.jp のお問い合わせフォームから送信されました"'; const start = 0; const max = 10; const threads = GmailApp.search(query, start, max); const messagesForThreads = GmailApp.getMessagesForThreads(threads); for(const messages of messagesForThreads){ console.log(messages[0].getSubject()); } }
このスクリプトは以下のような流れになりますね。
- 特定のメッセージが含まれるスレッドを抽出
- スレッドからメッセージを取得し二次元配列に格納
- 各スレッドのインデックス0(1番目)のメッセージの件名をログ出力
各スレッドのインデックス0(1番目の)がほぼ間違いなく問い合わせメッセージになります。
ちなみに、各スレッドのインデックス1以降のメールは、問い合わせに対する返信など、一連のメールのやり取りということになるはずです。
詳細は前回記事をご覧ください。
今回は上記流れの3のところを、ログ出力ではなくスプレッドシートに書き出していきます。
各メッセージについて以下の項目を抽出して書き出します。
- 日時
- 送信元
- 件名
- 本文
以下のようなシートを準備しました。
Gmailのメッセージをスプレッドシートに書き出す
では、先ほどのスクリプトを以下のように修正しましょう。
function searchContactMail() { const query = '"このメールは 株式会社プランノーツ http://plannauts.co.jp のお問い合わせフォームから送信されました"'; const start = 0; const max = 10; const threads = GmailApp.search(query, start, max); const messagesForThreads = GmailApp.getMessagesForThreads(threads); const values = []; for(const messages of messagesForThreads){ const message = messages[0]; const record = [ message.getDate(), message.getFrom(), message.getSubject(), message.getPlainBody().slice(0,200) ]; values.push(record); } if(values.length > 0){ SpreadsheetApp.getActiveSheet().getRange(2, 1, values.length, values[0].length).setValues(values); } }
以下、解説をしていきます。
メッセージから日時、送信元、件名、本文を取り出す
まず、13~18行目ですが各メッセージから日時、送信元、件名、本文を取り出して、定数recordという配列に代入する部分です。
メッセージ、つまりMessageオブジェクトについて、日時、送信元、件名、本文を取り出すには、それぞれ以下のメソッドを使います。
送信元:Messageオブジェクト.getFrom()
件名:Messageオブジェクト.getSubject()
本文:Messageオブジェクト.getPlainBody()
文字列を一定の長さだけ取り出す
ちなみに、17行目の本文の取り出しですが、sliceメソッドを使って一定の長さだけ取り出す処理をしています。
開始位置から終了位置前までの分をスライスして返します。
なお、最初の文字の開始位置は0です。
配列をpushして二次元配列をつくる
続いて、19行目ですが、その配列recordを、配列valuesに追加しています。
配列の最後尾に要素を追加するには、以下のpushメソッドを使います。
valuesは、その要素が配列ですから、二次元配列になります。
すべてのメッセージについてvaluesにプッシュし終わったら、setValuesメソッドで一気にシートに張り付けるという方法をとっています。
二次元配列をシートに書き出す
22~24行目のif文ですが、対象となるスレッドがひとつも存在しなかった場合は、スプレッドシートへの貼り付けがエラーとなってしまいますので、それを避けるための判定をしています。
なお、シートに二次元配列を書き出す処理については、こちらの記事をご覧ください。
実行結果
このスクリプトを実行してみると、以下のようにスプレッドシートのシートに書き出されます。
まとめ
以上、Gmailからメールを検索してスプレッドシートに書き出す方法についてお伝えしました。
複数の一次元配列を作って、それをpushして二次元配列化、さらにそれをシートに書き出すという処理はとてもよく使う流れなので、ぜひマスターしてくださいね。
次回は、さらに返信アドレスとパーマリンクの取得について見ていきましょう。
どうぞお楽しみに!
連載目次:GASでGmailに届いた問い合わせメールを収集する
お仕事の現場では日々様々なメールが届きます。その中で重要なのが「問い合わせメール」ですね。このシリーズでは、Webサイトからの問い合わせメールを自動でスプレッドシートに取り込んだり、チャットワークに送る方法についてお伝えしていきます。
コメント
昨日からスプレッドシートの可能性について考えておりまして
当該サイトを参考に勉強をさせて頂いております。
今回はコピペでどんな動きをするか確認をしていた所、下記の
エラーが発生しております。
無効な MIME タイプです。(行 17、ファイル「main」)
valMsgs[i][3] = myMsgs[i][0].getPlainBody().slice(0,200);
上記の部分です。
まだまだど素人の私なのでちんぷんかんぷんにて質問をさせて
頂きます。
宜しくお願い致します。
メリー君様
コメントありがとうございます!
なのですが、さすがにそれだけの情報だけではなかなか判断が難しいですね…。
お役に立てずにすみません。
ドンピシャな内容で、勉強させていただいております。ありがとうございます。
“2 Gmailのメールの日時、送信元、件名、本文を取り出す”を参考に
コピペして動作チェックしたところ25行目で以下エラーになりました。
“4 は無効な範囲です。5 にする必要があります。”
“6 Gmailからメールを取得してスプレッドシートに書き出すスクリプト”まで読んで気付きましたが、25行目のgetRangeの列幅が4が正解ですかね?
SpreadsheetApp.getActiveSheet().getRange(2, 1, i, 4).setValues(valMsgs); //シートに貼り付け
としたら動作しました。
一応報告させいていただきました!
こうき様
コメントありがとうございます!
確かに、前半のスクリプトは列数4でしたね…失礼しました。
修正をさせて頂きました。ご指摘助かります。
今後とも、当ブログをどうぞよろしくお願いいたします。
とあるシステムから送られてくるメールを、必要な情報だけ切り出して別のアドレスに送る・・・ということがしたくなり、この記事が大変役に立ちました。ありがとうございました。
ただ、このコードのままでは、各スレッドの先頭のメールしか読みだしませんでした。いろいろと試行錯誤の末、スレッド内のメールを読むためのループと配列を追加したらうまく機能しました。
私のコーディングのどこかにミスがあったのかもしれませんが・・・