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

write-mail

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

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

前回こちらの記事でGASで過去の問い合わせメールを特定条件で検索して取り出す方法についてお伝えしました。

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

今回は、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());
  }
 
}

このスクリプトは以下のような流れになりますね。

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

各スレッドのインデックス0(1番目の)がほぼ間違いなく問い合わせメッセージになります。

ちなみに、各スレッドのインデックス1以降のメールは、問い合わせに対する返信など、一連のメールのやり取りということになるはずです。

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

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

今回は上記流れの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オブジェクト.getDate()
送信元:Messageオブジェクト.getFrom()
件名:Messageオブジェクト.getSubject()
本文:Messageオブジェクト.getPlainBody()

文字列を一定の長さだけ取り出す

ちなみに、17行目の本文の取り出しですが、sliceメソッドを使って一定の長さだけ取り出す処理をしています。

開始位置から終了位置前までの分をスライスして返します。

なお、最初の文字の開始位置は0です。

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

配列をpushして二次元配列をつくる

続いて、19行目ですが、その配列recordを、配列valuesに追加しています。

配列の最後尾に要素を追加するには、以下のpushメソッドを使います。

配列.push(要素)

valuesは、その要素が配列ですから、二次元配列になります。

すべてのメッセージについてvaluesにプッシュし終わったら、setValuesメソッドで一気にシートに張り付けるという方法をとっています。

二次元配列をシートに書き出す

22~24行目のif文ですが、対象となるスレッドがひとつも存在しなかった場合は、スプレッドシートへの貼り付けがエラーとなってしまいますので、それを避けるための判定をしています。

なお、シートに二次元配列を書き出す処理については、こちらの記事をご覧ください。

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

実行結果

このスクリプトを実行してみると、以下のようにスプレッドシートのシートに書き出されます。

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

まとめ

以上、Gmailからメールを検索してスプレッドシートに書き出す方法についてお伝えしました。

複数の一次元配列を作って、それをpushして二次元配列化、さらにそれをシートに書き出すという処理はとてもよく使う流れなので、ぜひマスターしてくださいね。

次回は、さらに返信アドレスとパーマリンクの取得について見ていきましょう。

どうぞお楽しみに!

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

お仕事の現場では日々様々なメールが届きます。その中で重要なのが「問い合わせメール」ですね。このシリーズでは、Webサイトからの問い合わせメールを自動でスプレッドシートに取り込んだり、チャットワークに送る方法についてお伝えしていきます。

  1. 【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する
  2. 【GAS】Gmailからメールを検索してスプレッドシートに書き出す方法
  3. 【GAS】Gmailのメッセージから返信先とパーマリンクを取得する方法
  4. 【GAS】新たな問い合わせメールをGmailで取得しスプレッドシートに随時追加する
  5. 【GAS】Gmailに来た問い合わせをChatworkに通知してかつタスク追加する
  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でしたね…失礼しました。
      修正をさせて頂きました。ご指摘助かります。

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

  3. 中村(五) より:

    とあるシステムから送られてくるメールを、必要な情報だけ切り出して別のアドレスに送る・・・ということがしたくなり、この記事が大変役に立ちました。ありがとうございました。

    ただ、このコードのままでは、各スレッドの先頭のメールしか読みだしませんでした。いろいろと試行錯誤の末、スレッド内のメールを読むためのループと配列を追加したらうまく機能しました。

    私のコーディングのどこかにミスがあったのかもしれませんが・・・

タイトルとURLをコピーしました