【GAS】Gmailのメール本文をスプレッドシートに転記する方法
こんにちは、業務自動化ツール開発担当の吉池(@valmore_myoshi)です。
メール本文をスプレッドシートに自動で転記したいときはありませんか?
例えば、お問い合わせフォームからメール通知されたお問い合わせ内容をスプレッドシートで管理する場合などなど。
メール本文から氏名や会社名、お問い合わせ内容を1件ずつコピペするのも手間がかかります。処理するメールが多ければなおさらです。
そんなときはGoogle Apps Scriptを使って自動化しましょう。本記事ではGmailから特定のメール一覧を抽出し、メール本文をスプレッドシートに転記する方法を解説します。
手順に沿って頂ければ簡単にプログラムが完成するので、ぜひお試しください。
目次
自動化する作業手順
本記事では下記のメール本文を例として取り上げ、「差出人」「会社名」「メールアドレス」「電話番号」をスプレッドシートに転記する作業を自動化します。
手順は下記のとおりです。先に手順を書き出しておくとプログラムの全体像が見えてくるのでオススメです。
- 転記先のスプレッドシートを作成
- Gmailから検索条件に一致するメール一覧を取得
- メール本文から取り出したい文字列を正規表現を使って抽出
- 抽出した文字列をスプレッドシートに転記
- 処理が終わったメールに処理済みラベルを付ける
完成プログラム
先にプログラムの完成版をお見せします。以下ではプログラムの詳細について一つずつ解説していきます。
function myFunction() {
// 検索条件に該当するスレッド一覧を取得
var threads = GmailApp.search('subject:フォームからのお問い合わせ -label:処理済み');
// スレッドを一つずつ取り出す
threads.forEach(function(thread) {
// スレッド内のメール一覧を取得
var messages = thread.getMessages();
// メールを一つずつ取り出す
messages.forEach(function(message) {
// メール本文を取得
var plainBody = message.getPlainBody();
// 差出人を取り出す
var name = plainBody.match(/差出人: (.*)/);
// 会社名を取り出す
var company = plainBody.match(/会社名: (.*)/);
// メールアドレスを取り出す
var email = plainBody.match(/メールアドレス: (.*)/);
// 電話番号を取り出す
var tel = plainBody.match(/電話番号: (.*)/);
// 書き込むシートを取得
var sheet = SpreadsheetApp.getActive().getSheetByName('お問い合わせ');
// 最終行を取得
var lastRow = sheet.getLastRow() + 1;
// セルを取得して値を転記
sheet.getRange(lastRow, 1).setValue(name[1]);
sheet.getRange(lastRow, 2).setValue(company[1]);
sheet.getRange(lastRow, 3).setValue(email[1]);
sheet.getRange(lastRow, 4).setValue(tel[1]);
});
// スレッドに処理済みラベルを付ける
var label = GmailApp.getUserLabelByName('処理済み');
thread.addLabel(label);
});
}
転記先のスプレッドシートを作成
最初にメール本文を転記するスプレッドシートを作成します。このスプレッドシートにプログラムを書いていきます。プログラムを書くエディタを立ち上げるために「ツール」→「スクリプトエディタ」を選択します。
すると下記のようにエディタ画面が開きます。この画面にプログラムを書いていきます。
Gmailから検索条件に一致するメール一覧を取得
検索条件は適宜変更してください。今回は下記のような検索条件を指定します。スプレッドシートへの転記が終わったメールには「処理済み」ラベルを貼る想定なので、未処理のメールを検索する際には「処理済み」ラベルが貼られていないものにしています。
- 件名が「フォームからのお問い合わせ」であること
- かつ、「処理済み」ラベルが貼られていないこと
Gmailから特定の検索条件に一致するメールを取得するときは下記のように書きます。
function myFunction() {
var threads = GmailApp.search('subject:フォームからのお問い合わせ -label:処理済み');
}
これで検索条件に一致したスレッドを取得できます。個々のメールではなく、スレッドを取得している点に注意してください。
スレッドからメール本文を取り出す
スレッドとは、メールのやりとりをまとめたものです。届いたメールに対して返信したり、返信したメールに対してさらに相手が返信した一連のメールはスレッドとしてまとめられます。
Gmailから直接個々のメールを取得する方法はないみたいのなので、一つずつスレッドを取得してからメール本文を取り出します。
複数のスレッドから一つずつスレッドを取り出し、さらにメール本文を取り出すには下記のように書きます。
function myFunction() {
// 検索条件に該当するスレッド一覧を取得
var threads = GmailApp.search('subject:フォームからのお問い合わせ -label:処理済み');
// スレッドを一つずつ取り出す
threads.forEach(function(thread) {
// スレッド内のメール一覧を取得
var messages = thread.getMessages();
// メールを一つずつ取り出す
messages.forEach(function(message) {
// メール本文を取得
var plainBody = message.getPlainBody();
// メール本文が取得できているかログに出力して確認
Logger.log(plainBody);
});
});
}
上記プログラム例には完成版プログラムにはないLogger#logメソッドが追加されています。Logger#logメソッドに渡した値は「表示」→「ログ」から見ることができます。
開発途中のプログラムが意図した通り動作しているか確かめる際に役立ちます。今回は下記のようにメール本文をログ出力できました。
メール本文から取り出したい文字列を正規表現を使って抽出
次はメール本文から目的の文字列を取り出します。今回例として取り上げたメール本文は下記の通りなので、ここから「差出人」「会社名」「メールアドレス」「電話番号」を抽出します。
文字列抽出には正規表現を使います。正規表現とは、特定の文字列をパターン化して表現する方法です。正規表現の詳しい解説はこちらを参照してください。
メール本文から「差出人」「会社名」「メールアドレス」「電話番号」を抽出するには下記のように書きます。
// メール本文を取得
var plainBody = message.getPlainBody();
// 差出人を取り出す
var name = plainBody.match(/差出人: (.*)/);
// 会社名を取り出す
var company = plainBody.match(/会社名: (.*)/);
// メールアドレスを取り出す
var email = plainBody.match(/メールアドレス: (.*)/);
// 電話番号を取り出す
var tel = plainBody.match(/電話番号: (.*)/);
抽出した文字列をスプレッドシートに転記
目的の文字列を抽出できたらスプレッドシートに一行ずつ転記していきます。まずはスプレッドシートを取得し、シート名を指定して書き込むシートを選択します。そのため、シートにはあらかじめ名前を入力しておいてください。ここではシート名を「お問い合わせ」にしました。
// 書き込むシートを取得
var sheet = SpreadsheetApp.getActive().getSheetByName('お問い合わせ');
次にシート内の値が入っている行のうち、最終行を取得しています。最終行に1行プラスすることで、同じシートに追記していくことが可能です。最後に書き込む行と列を指定して、先ほど正規表現で取得した文字列を書き込みます。
// 最終行を取得
var lastRow = sheet.getLastRow() + 1;
// セルを取得して値を転記
sheet.getRange(lastRow, 1).setValue(name[1]);
sheet.getRange(lastRow, 2).setValue(company[1]);
sheet.getRange(lastRow, 3).setValue(email[1]);
sheet.getRange(lastRow, 4).setValue(tel[1]);
処理が終わったメールに処理済みラベルを付ける
転記を終えたメールには処理済みのラベルを付けます。ラベルを付けることで処理したメールを再度転記しないようにします。処理済みラベルはあらかじめGmail上で作成してください。
// スレッドに処理済みラベルを付ける
var label = GmailApp.getUserLabelByName('処理済み');
thread.addLabel(label);
まとめ
Gmailのメール本文をスプレッドシートに自動転記する方法を解説しました。Gmailからメールを取得する方法とスプレッドシートに書き込む方法を組み合わせれば簡単にルーティンワークを自動化できましたね。
今回は処理済みフラグを使って未処理のメールと区別しましたが、時間をトリガーにして定期的に処理を走らせることも可能です。本プログラムの内容を理解できたら、作業に応じてカスタマイズしてみてください。