
photo credit: ellis & higgs Ein Brief für Dich / A Letter For You via photopin (license)
みなさん、こんにちは!
タカハシ(@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でフォーム送信メールからデータを取得してスプレッドシートに蓄積するツールの完全版



