【GAS】Gmailからメールを検索してスプレッドシートに書き出す

★気に入ったらシェアをお願いします!


write-mail

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Gmailに届いたWordPressサイトからの問い合わせメールの分析を進めています。

前回こちらの記事で

【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する
問い合わせメールのデータの蓄積と効果分析にまつわることを色々とやっていきたいということで、今回はGoogle Apps Scriptで過去の問い合わせメールを特定条件で検索して取り出す方法です。

Google Apps Scriptで過去の問い合わせメールを特定条件で検索して取り出す方法についてお伝えしました。

今回はGoogle Apps Scriptにスクリプトを追記して、取り出したメールたちをスプレッドシートに書き出してみたいと思います。

では、行ってみましょう!

前回のおさらいと今回のお題

前回作成したスクリプトはこちらです。

検索条件がちょっと強引な感はありますが…

  1. 特定のメッセージが含まれるスレッドを抽出
  2. スレッドからメッセージを取得し二次元配列に格納
  3. 各スレッドの1番目のメールの件名をログ出力

という流れになりますね。

各スレッドの1番目のメールがほぼ間違いなく問い合わせメールになります。ちなみに、各スレッドの2番目以降のメールは、問い合わせに対する私の返信などを含む、一連のメールのやり取りということにほぼ間違いありません。

詳細は前回記事をご覧ください。

【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する
問い合わせメールのデータの蓄積と効果分析にまつわることを色々とやっていきたいということで、今回はGoogle Apps Scriptで過去の問い合わせメールを特定条件で検索して取り出す方法です。

今回は上記流れの3のところを修正して、各スレッドの1番目のメールについて

  • 日時
  • 送信元
  • 件名
  • 本文

をスプレッドシートに書き出していきたいと思います。

シートはこのように準備しました。

メールを出力するスプレッドシート

Gmailのメールの日時、送信元、件名、本文を取り出す

各Messageオブジェクトつまり各メールについて、日時、送信元、件名、本文を取り出すには、それぞれ以下のメソッドを使います。

日時:Messageオブジェクト.getDate()
送信元:Messageオブジェクト.getFrom()
件名:Messageオブジェクト.getSubject()
本文:Messageオブジェクト.getPlainBody()

ではこれらを用いてスクリプトを修正してみましょう。こちらです。

メールから各情報を取り出していったんvalMsgsという二次元配列に格納をして、最後にsetValuesメソッドで一気にスプレッドシートに張り付けるという方法をとっています。

このあたり、詳しくはこちらの記事をご覧ください。

Google Apps Scriptのスプレッドシート読み書きを格段に高速化をする方法
Google Apps Scriptでスプレッドシートの操作をしていて実行速度が遅い!と感じたことがあると思います。今回はスプレッドシートを操作する場合に処理速度を格段に速くする方法をお伝えします。

23行目のif文ですが、対象となるメッセージが存在しない場合は、スプレッドシートへの貼り付けがエラーとなりますので、それを避けるために条件判断しています。

実行結果

このスクリプトを実行してみると

Gmailからのメールをスプレッドシートに出力した結果

こうなります。

一応ちゃんとシートに出力できているのですが

  • 本文が長すぎて見づらい
  • 送信元が自分のアドレスになっている

という問題点があります。この点を修正していきたいと思います。

sliceメソッドで文字列から指定の範囲だけ取り出す

まず本文が長すぎるので文字数でぶった切ってシートへ入力してしまいましょう。

文字列の部分文字列を取り出す場合はsliceメソッドを使いまして

文字列.slice(開始位置, 終了位置)

とします。

例えば50文字だけ取り出すのであれば

とします。

getPermalinkでスレッドのパーマリンクを取得する

この場合、本文を全部読みたくなるときに困ります。

その時には、そのメールへのリンクを踏んでその先で全文を読めるようにしましょう。

パーマリンクはスレッド単位での取得になりますが、特定のスレッドのパーマリンクを取得する場合はgetPermalinkメソッド

Threadオブジェクト.getPermalink()

と書きます。

getReplyToでメールの返信先を取得する

次に送信元が自分のアドレスになってしまっている件を解決していきます。

問い合わせフォームを作成しているWordPressプラグインContact Form 7のメールの設定を確認すると

Contact Form 7のメール設定

確かに、送信元が自分のアドレスになってしまっています。

過去のものは直しようがありませんので、今回は代替案として、「追加ヘッダー」に設定されている返信先つまり「Reply-To」の値をもって、送信元としたいと思います。

メールの返信先を取得する際はgetReplyToメソッド

Messageオブジェクト.getReplyTo()

とすればOKです。

Gmailからメールを取得してスプレッドシートに書き出すスクリプト

以上をまとめると、こちらのスクリプトになります。

18行目ですが本文を取り出す文字列は200文字にしました。

また19行目のパーマリンクの出力先をE列にしましたので、それに伴って26行目のgetRangeの列幅を5に変更しています。

実行結果

実行結果はこちらです。

Gmailからのメールをスプレッドシートに出力した結果

前に比べるとだいぶ見やすくなりましたね。

またパーマリンクをクリックすると

スレッドのパーマリンクをリンク

このように各メールの全文を確認できるページが開きます。

まとめ

以上、Google Apps ScriptでGmailから特定条件で検索したメールをスプレッドシートに出力をする方法をお伝えしました。

各メールについて日時、送信元、件名、本文、返信先を、そして各スレッドについてパーマリンクを取得するメソッドを紹介しましたが、他にもありますので、用途に応じて調べてみて下さいね。

Class GmailApp | Apps Script | Google Developers

これで過去の問い合わせについて分析する地盤が整いましたので、過去の集計分析を進めてみました。

フリーランスの仕事はどこから来たか、独立して1年間の受注件数を全て晒す
独立してからもうすぐ1年となります。その間、いかにして仕事を獲得したのか、毎日書いているブログによるコンテンツマーケティングの効果はあったのか、実際の件数を全て晒してフリーランスのリアルをお伝えします。

どうぞご参考ください!

連載目次:GASでGmailに届いた問い合わせメールを分析する

お仕事の現場では日々様々なメールが届きます。その中で重要なのが「問い合わせメール」ですね。このシリーズでは、Webサイトからの問い合わせメールを自動でスプレッドシートに取り込んだり、チャットワークに送る方法についてお伝えしていきます。
  1. 【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する
  2. 【GAS】Gmailからメールを検索してスプレッドシートに書き出す
  3. フリーランスの仕事はどこから来たか、独立して1年間の受注件数を全て晒す
  4. 【GAS】新たな問い合わせメールをGmailで取得しスプレッドシートに随時追加する
  5. 【GAS】Gmailに来た問い合わせをチャットワークに通知してかつタスク追加する
  6. Google Apps ScriptにおけるGmailの読み取り件数の制限とその対処法

コメント

  1. メリー君 より:

    昨日からスプレッドシートの可能性について考えておりまして
    当該サイトを参考に勉強をさせて頂いております。

    今回はコピペでどんな動きをするか確認をしていた所、下記の
    エラーが発生しております。

    無効な MIME タイプです。(行 17、ファイル「main」)
    valMsgs[i][3] = myMsgs[i][0].getPlainBody().slice(0,200);

    上記の部分です。
    まだまだど素人の私なのでちんぷんかんぷんにて質問をさせて
    頂きます。

    宜しくお願い致します。

    • メリー君様

      コメントありがとうございます!
      なのですが、さすがにそれだけの情報だけではなかなか判断が難しいですね…。

      お役に立てずにすみません。

  2. こうき より:

    ドンピシャな内容で、勉強させていただいております。ありがとうございます。

    “2 Gmailのメールの日時、送信元、件名、本文を取り出す”を参考に
    コピペして動作チェックしたところ25行目で以下エラーになりました。
    “4 は無効な範囲です。5 にする必要があります。”

    “6 Gmailからメールを取得してスプレッドシートに書き出すスクリプト”まで読んで気付きましたが、25行目のgetRangeの列幅が4が正解ですかね?
    SpreadsheetApp.getActiveSheet().getRange(2, 1, i, 4).setValues(valMsgs); //シートに貼り付け
    としたら動作しました。

    一応報告させいていただきました!

    • こうき様

      コメントありがとうございます!
      確かに、前半のスクリプトは列数4でしたね…失礼しました。
      修正をさせて頂きました。ご指摘助かります。

      今後とも、当ブログをどうぞよろしくお願いいたします。