【GAS】スプレッドシートにGmailからスクレイピング~本文からデータを抜き出して表示~【第2回】

2022/07/22

前回は、Gmailから目当てのメールを検索して、件名を表示させてみました。今回は、もう少し踏み込んでメール本文から情報を抜き出してログに表示させます。

目次

今回やること

今回は、脳トレメールからスプレッドシートに書き込みたい情報を抜き出して、ログに表示させてみたいと思います。と言っても、すべてをいきなり抜き出すのは大変なので、今回は「計算100」「人数数え」のデータのみを抜き出します。

getPlainBody()

getPlainBodyはメール本文のプレーンテキストを取得するメソッドです。HTMLなどでは装飾がされていますが、それを取り除くことができます。

今回のメールはHTMLではないですが、こちらでも本文のテキストを取得できます。

matchと正規表現

今回の使い方では、matchメソッドは文字列の後ろで、正規表現で指定した文字列と一致した文字列を返します。

正規表現とは、いくつかの文字列をひとつの形式で表現するための方法で、前後が決まっている今回のパターンや、文字数が決まっている場合などいろいろな場合に使える便利な表現です。以下のように組み合わせて使います。

文字列.match(/正規表現/g)

最後のgはフラグと言って、検索方法のオプション設定のようなものです。gは一致したすべてを返してくれます。他にも、iやmなどもあります。

厳密不等価演算子 (!==)

文字列を検索した時に、そもそも引っかからない場合があります。脳トレにも種類があるので、その日にすべての種類を遊んだとは限らないので、検索した結果「null」が返ってくることがあります。

今回はログに表示させるだけなので、nullは除きたいです。ifで厳密不等価演算子を使ってnullを省きます。!=の不等価演算子だと、undefinedも同じ扱いになってしまうので、今回は厳密不等価演算子を使用しました。

GAS全体

function myFunction() {
  
  const query ='さんの脳トレ記録をお届けします。';
  const start = 0;
  const max = 10;

  const threads = GmailApp.search(query,start,max);

  for(const thread of threads){
    const messages = GmailApp.getMessagesForThread(thread);

    for(const message of messages){
      const plainBody = message.getPlainBody();
      const calc100 = plainBody.match(/計算100\s・(.*)(/g);
      const people = plainBody.match(/人数数え\s・(.*)問/g);

      if(calc100 !== null){
        console.log(calc100);
      }
      if(people !== null){
        console.log(people);
      }
    }
  }
}

実行結果

2種類検索して、全部で4つ記録が返ってきました。

最後に

今回は、スプレッドシートに書き込みたい情報を抜き出して、ログに表示させてみました。

次回は、抜き出したデータのいらない部分を削ったり、関数化してわかりやすくしようと思います。