Google Apps Scriptでメールから正規表現で抽出したデータをスプレッドシートに蓄積する方法


bricks

photo credit: Khuroshvili Ilya via photopin (license)

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

Google Apps Scriptでフォーム送信メールからデータを抜き出してスプレッドシートに登録するツールを作成しています。

前回の記事はコチラです。

Google Apps ScriptでGmailの受信メールから正規表現でデータを抽出する
Google Apps Scriptでフォーム送信メールからデータを抽出してスプレッドシートに登録するツールを作成しています。今回はGmailに届いたメールから正規表現でデータを抽出するスクリプトを紹介します。

Gmailに届いたメールから正規表現でデータを取得するスクリプトを作成しました。

データを取り出すことはできましたので、あとはスプレッドシートに蓄積していく処理が必要ですね。

とうことで、今回はGoogle Apps Scriptでメールで取得したデータをスプレッドシートに蓄積する方法をお伝えします。

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

スポンサーリンク

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

まずは前回のおさらいから。

作成したスクリプトはコチラでした。

function myFunction() {
  const fetchData = (str, pre, suf) => {
    const reg = new RegExp(pre + '.*?' + suf, 'g');
    const data = str.match(reg)[0]
      .replace(pre, '')
      .replace(suf, '');
    return data;  
  };
  const query = 'subject:([テスト]フォーム登録通知)';
  const threads = GmailApp.search(query, 0, 30);
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);
 
  for(const messages of messagesForThreads){
    for(const message of messages){
      const body = message.getPlainBody();
      console.log(fetchData(body, '名前:', 'r'));
      console.log(fetchData(body, '年齢:', '才'));    
    }
  }
}

だいぶいい感じの長さになってきましたね。

まず、fetchDataはメールの本文などの文字列を渡して、そこから正規表現を使って文字列preとsufに挟まれている文字列を返す関数です。

スクリプトの処理としては、Gmailから「[テスト]フォーム登録通知」という件名のスレッドのメッセージを取得して、それぞれのメッセージから「名前」「年齢」を取得するというものです。

このmyFunctionの16,17行目を、スプレッドシートに蓄積する処理に変更していけばよいですね。

メールから取得したデータをスプレッドシートに登録する

では、データを蓄積するために以下のようなスプレッドシートを用意しました。

A列に名前、B列に年齢を蓄積していきたいと思います。

GASでデータを蓄積するスプレッドシート

アクティブなシートを取得する

このスプレッドシートにバインドする形でスクリプトを組めば、以下getActiveSheetメソッドでこのシートを取得できますね。

SpreadsheetApp.getActiveSheet()

実際のスクリプトは以下のようになります。

const sheet = SpreadsheetApp.getActiveSheet();

コンテナバインドスクリプトについては、以下の記事もご覧ください。

初心者でも簡単!Google Apps Scriptでスプレッドシートのカスタム関数を作る方法
Google Apps Scriptを使えば、簡単にスプレッドシートのカスタム関数を作ることができます。今回は、消費税の税込計算をする関数を例に、初心者でもできる自作スプレッドシート関数の作り方をお伝えします。

スプレッドシートの最後尾にデータを追加する

スプレッドシートにデータを蓄積するのは簡単です。

Sheetオブジェクトに対してappendRowメソッドを使えば、その最後尾にデータを追加してくれます。

Sheetオブジェクト.appendRow(配列)

これだけで、Sheetオブジェクトの最後尾の次の行に、配列で与えたデータをA列から順番に追加してくれます。

ですから、今回の場合、myFunctionの16,17行目の代わりに以下の処理を入れれば良さそうです。

sheet.appendRow([
  fetchData(body, '名前:', 'r'),
  fetchData(body, '年齢:', '才')
]);

メールから抽出したデータをスプレッドシートに追加するスクリプト

以上を踏まえてmyFunctionをまとめたのが、以下スクリプトです。

function myFunction() {
 
  const fetchData = (str, pre, suf) => {
    const reg = new RegExp(pre + '.*?' + suf, 'g');
    const data = str.match(reg)[0]
      .replace(pre, '')
      .replace(suf, '');
    return data;  
  };
 
  const sheet = SpreadsheetApp.getActiveSheet();
 
  const query = 'subject:([テスト]フォーム登録通知)';
  const threads = GmailApp.search(query, 0, 30);
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);
 
  for(const messages of messagesForThreads){
    for(const message of messages){
      const body = message.getPlainBody();
      sheet.appendRow([
        fetchData(body, '名前:', 'r'),
        fetchData(body, '年齢:', '才')
      ]);
    }
  }
}

実行すると…

GASで最後尾の行にデータを追加した

おお、できちゃいました。簡単ですね。

まとめ

以上、Google Apps Scriptでメールのデータを抽出してスプレッドシートの最後尾に追加するスクリプトを紹介しました。

  • スプレッドシートのコンテナバインドスクリプトを作成してgetActiveSheetメソッドでシートを取得
  • appendRowメソッドでシートの最後尾の行にデータを追加する

…ですが、もう一回実行すると…同じメールからデータを取得してきちゃって重複しちゃうんです。

次回はこの問題を解決していきます。

Google Apps ScriptでGmailのメッセージIDを取得する方法
Google Apps Scriptでフォーム送信メールからデータを取得してスプレッドシートに蓄積していくツールを作っています。今回は、GmailメッセージのメッセージIDを取得する方法です。

どうぞお楽しみに!

連載目次:GASで正規表現を使ってデータを抽出&登録

正規表現を使うとGoogle Apps ScriptでメールやHTMLドキュメントからデータを抽出することができます。本シリーズでは、フォーム送信の通知メールからデータを抽出してスプレッドシートに追加するツールの作成を目指します。
  1. Google Apps Scriptで正規表現を使って必要な情報を抽出する最も簡単なスクリプト
  2. Google Apps Scriptで正規表現でマッチした文字列から不要な部分を削除する
  3. Google Apps ScriptでGmailの受信メールから正規表現でデータを抽出する
  4. Google Apps Scriptでメールから正規表現で抽出したデータをスプレッドシートに蓄積する方法
  5. Google Apps ScriptでGmailのメッセージIDを取得する方法
  6. Google Apps Scriptでスプレッドシートの列データを配列として取得する方法
  7. GASで二次元配列に特定の要素が含まれているかを判定する方法
  8. GASでフォーム送信メールからデータを取得してスプレッドシートに蓄積するツールの完全版

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