Google Apps ScriptでGmailのメッセージIDを取得する方法

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

Google Apps Scriptでフォーム送信メールからデータを取得してスプレッドシートに蓄積していくツールを作っています。

前回の記事はこちら。

Google Apps Scriptでメールから正規表現で抽出したデータをスプレッドシートに蓄積する方法
Google Apps Scriptでフォーム送信メールからデータを抜き出してスプレッドシートに登録するツールを作成しています。今回はメールで取得したデータをスプレッドシートに蓄積する方法をお伝えします。

メールからデータを抽出してスプレッドシートに書き込むまでを作成しました。

ただ、このスクリプトを複数回実行すると、何度も同じメッセージからデータを取得してしまうという問題があるんですね。

今回はこの課題を「メッセージID」を使うことで解決をしていきます。

ということで、Google Apps ScriptでGmailメッセージのメッセージIDを取得する方法です。

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

スポンサーリンク

前回のおさらいとお題

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

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, '年齢:', '才')
      ]);
    }
  }
}

muFunctionでは、「[テスト]フォーム登録通知」という件名のスレッドを検索し、そのメッセージを取得します。

その各メッセージについて、関数fetchDataにより欲しいデータである「名前」と「年齢」を抽出して、スプレッドシートの最終行にそのデータを追加していくというものです。

それで、fetchDataには正規表現を使用しています。

今回のお題: 同じメッセージを取得しないようにしたい

しかし、このスクリプトは複数回実行すると、以下のように同じメッセージを何度も取得して、データを抽出してしまうので、重複データが増えていってしまいます。

GASで同じデータが蓄積されてしまう

今回はこの何度も同じメッセージからデータを取得してしまうという問題を解決していきます。

メッセージIDを取得する

メッセージIDとはその名の通り、メッセージに一意に割り当てられたIDです。

そして、そのメッセージIDを使って、重複を防ぐための方針は以下の通りです。

  • getMessagesForThreadsメソッドで取得した各メッセ―ジについて、メッセージIDを取得する
  • 既にスプレッドシートのC列に同じメッセージIDが存在していないならば
    • 初めて取得するメッセージなので、データを取得する
    • スプレッドシートには、名前、年齢とともにメッセージIDを追加する

これで、同じメッセージから取得しようとするのを防ぐのです。

getIdメソッドでメッセージIDを取得する

メッセージIDを取得するには、getIdメソッドを使用します。

書き方はこちら。

Messageオブジェクト.getId()

試しにメッセージIDを取得してみましょう。

function logMessageId() {
 
  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){
      console.log(message.getId());
    }
  }
}

このスクリプトを実行してみますと、以下のようにそれぞれのメッセージのIDをログ出力することができました。

GASでメッセージIDをログ出力

メッセージIDをスプレッドシートに書き込む

これを踏まえて、メッセージIDもデータとともにC列に書き込むようにスクリプトを修正をしてみます。

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 id = message.getId();
      const body = message.getPlainBody();
      sheet.appendRow([
        fetchData(body, '名前:', 'r'),
        fetchData(body, '年齢:', '才'),
        id
      ]);
    }
  }
}

19行目でメッセージIDを取得して、24行目でappendRowの配列に追加をしています。

実行結果はコチラ。

GASでメッセージIDをスプレッドシートに書き出す

バッチリOKですね。

まとめ

以上、Google Apps ScriptでGmailのメッセージIDを取得する方法をお伝えしました。

  • 同じメッセージを重複して取得しないようにするアルゴリズムの考え方
  • メッセージIDを取得するgetIdメソッド

あとは、スプレッドシート上にそのメッセージIDが存在するかどうかを判定する必要があります。

その部分は次回以降お伝えしていきますね。

Google Apps Scriptでスプレッドシートの列データを配列として取得する方法
Google Apps Scriptでフォーム送信メールからデータを取得してスプレッドシートにまとめるツールを作成しています。今回はスプレッドシートの列データを配列として取得する方法についてお伝えします。

どうぞお楽しみに!

連載目次: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をコピーしました