みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Scriptでフォーム送信メールからデータを抜き出してスプレッドシートに登録するツールを作成しています。
前回の記事はコチラです。
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列に年齢を蓄積していきたいと思います。
アクティブなシートを取得する
このスプレッドシートにバインドする形でスクリプトを組めば、以下getActiveSheetメソッドでこのシートを取得できますね。
実際のスクリプトは以下のようになります。
const sheet = SpreadsheetApp.getActiveSheet();
コンテナバインドスクリプトについては、以下の記事もご覧ください。
スプレッドシートの最後尾にデータを追加する
スプレッドシートにデータを蓄積するのは簡単です。
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, '年齢:', '才') ]); } } }
実行すると…
おお、できちゃいました。簡単ですね。
まとめ
以上、Google Apps Scriptでメールのデータを抽出してスプレッドシートの最後尾に追加するスクリプトを紹介しました。
- スプレッドシートのコンテナバインドスクリプトを作成してgetActiveSheetメソッドでシートを取得
- appendRowメソッドでシートの最後尾の行にデータを追加する
…ですが、もう一回実行すると…同じメールからデータを取得してきちゃって重複しちゃうんです。
次回はこの問題を解決していきます。
どうぞお楽しみに!
連載目次: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でフォーム送信メールからデータを取得してスプレッドシートに蓄積するツールの完全版