みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
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には正規表現を使用しています。
今回のお題: 同じメッセージを取得しないようにしたい
しかし、このスクリプトは複数回実行すると、以下のように同じメッセージを何度も取得して、データを抽出してしまうので、重複データが増えていってしまいます。
今回はこの何度も同じメッセージからデータを取得してしまうという問題を解決していきます。
メッセージIDを取得する
メッセージIDとはその名の通り、メッセージに一意に割り当てられたIDです。
そして、そのメッセージIDを使って、重複を防ぐための方針は以下の通りです。
- getMessagesForThreadsメソッドで取得した各メッセ―ジについて、メッセージIDを取得する
- 既にスプレッドシートのC列に同じメッセージIDが存在していないならば
- 初めて取得するメッセージなので、データを取得する
- スプレッドシートには、名前、年齢とともにメッセージIDを追加する
これで、同じメッセージから取得しようとするのを防ぐのです。
getIdメソッドでメッセージIDを取得する
メッセージIDを取得するには、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をログ出力することができました。
メッセージ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の配列に追加をしています。
実行結果はコチラ。
バッチリOKですね。
まとめ
以上、Google Apps ScriptでGmailのメッセージIDを取得する方法をお伝えしました。
- 同じメッセージを重複して取得しないようにするアルゴリズムの考え方
- メッセージIDを取得するgetIdメソッド
あとは、スプレッドシート上にそのメッセージIDが存在するかどうかを判定する必要があります。
その部分は次回以降お伝えしていきますね。
どうぞお楽しみに!
連載目次:GASで正規表現を使ってデータを抽出&登録
正規表現を使うとGoogle Apps ScriptでメールやHTMLドキュメントからデータを抽出することができます。本シリーズでは、フォーム送信の通知メールからデータを抽出してスプレッドシートに追加するツールの作成を目指します。- Google Apps Scriptで正規表現を使って必要な情報を抽出する最も簡単なスクリプト
- Google Apps Scriptで正規表現でマッチした文字列から不要な部分を削除する
- Google Apps ScriptでGmailの受信メールから正規表現でデータを抽出する
- Google Apps Scriptでメールから正規表現で抽出したデータをスプレッドシートに蓄積する方法
- Google Apps ScriptでGmailのメッセージIDを取得する方法
- Google Apps Scriptでスプレッドシートの列データを配列として取得する方法
- GASで二次元配列に特定の要素が含まれているかを判定する方法
- GASでフォーム送信メールからデータを取得してスプレッドシートに蓄積するツールの完全版