【GAS】Gmailからスプレッドシートに自動転記する
GASappendrow,getLastRow,getMessage,getPlainBody,gmail,GmailApp,GmailApp.search,lastRow,match,setValues,スプレッドシート,自動転記
この記事では、Google Apps Script(GAS)を使い、Gmailから抽出した本文・件名・差出人アドレスといったメール情報をスプレッドシートに自動で転記する方法をご紹介します。
メールの内容から一つ一つ手動でコピペするのは膨大な手間がかかりますが、GASを使って自動化することで工数を大幅に削減することができます。
サンプルコード
会社に届いたお問い合わせフォームのメールからスプレッドシートに自動転記することを想定して記述しています。
function myFunction(){
// 抽出条件指定
let query = 'subject:お問い合わせフォーム';
//問合せごとの情報が要素になった二次元配列を取得
let gmail = getGmail(query);
// 書き込むシートを取得、アクティブシートを取得しているが任意のシートでOK
let sheet = SpreadsheetApp.getActive().getActiveSheet();
//要素数分appendRowメソッドを呼び出して最終行に書き込む繰り返し処理を実行
gmail.forEach(info => sheet.appendRow(info));
}
function getGmail(query) {
//Gmail取得ここから
//Gmailの履歴からマッチするメールを一覧化
let threads = GmailApp.search(query);
let gmailInfo = new Array();
//一覧化したメールの件数分繰り返し
threads.forEach(function(thread) {
// スレッド内のメール一覧を取得
let messages = thread.getMessages();
// メールを一つずつ取り出す
messages.forEach(function(message) {
// メール本文
let plainBody = message.getPlainBody();
// console.log(plainBody);
// 問い合わせ日
let date = plainBody.match(/問い合わせ日:(.*)/);
// console.log(date);
// 問い合わせ内容
let naiyo = plainBody.match(/問い合わせ内容:(.*)/);
// console.log(naiyo);
// 名前
let name = plainBody.match(/名前:(.*)/);
// console.log(name);
// よみがな
let yomi = plainBody.match(/よみがな:(.*)/);
// console.log(yomi);
// 会社名
let company = plainBody.match(/会社名:(.*)/);
// console.log(company);
// メールアドレス
let title = plainBody.match(/役職:(.*)/);
// console.log(title);
// メールアドレス
let mail = plainBody.match(/メールアドレス:(.*)/);
// console.log(mail);
// 電話番号
let tel = plainBody.match(/電話番号:(.*)/);
// console.log(tel);
//各メール情報を組みとした二次元配列として格納
gmailInfo.push([date[1],naiyo[1],name[1],yomi[1],company[1],title[1],mail[1],tel[1]]);
});
});
console.log(gmailInfo);
return(gmailInfo);
}
自動転記先のスプレッドシートを用意
抽出先のスプレッドシートを用意し、メールから転記したい要素ごとにカラムを用意します。
値を格納するカラムは列番号で指定するので、カラム名はなんでもOKです。
上記のサンプルコードを実行するとお問い合わせフォームの内容が転記されます。
それではコード内容を1つずつ見ていきましょう。
条件を指定しGmailからメール一覧を取得(GmailApp.search)
GmailApp.search(query [,start ,num])
query(必須):検索条件 ※検索窓で検索する時と同様に指定が可能
start(任意):インデックス開始位置(「0」または指定しなければ最新から取得)
num(任意):スレッドの最大取得数
戻り値:検索条件にマッチするメールのスレッド(GmailThreadオブジェクト)の配列
//Gmailの履歴からマッチするメールを一覧化
let threads = GmailApp.search('subject:フォーム問い合わせ');
GmailApp.search(query *検索条件)で自分のGmailボックスから条件に該当するメール一覧を取得できます。今回はメールの件名が「お問い合わせフォーム」のメールを取り出したいので、<'subject:お問い合わせフォーム’>と記述しています。
その他、お気に入り、本文内の文字列、送信者、期間等の条件で絞り込みしたい場合、gmailの検索ボックスと一緒のルールで記述可能です。
指定条件 | 記述方法と例 |
---|---|
送信者 | from: (例 from:花子) |
受信者 | to: (例 to:太郎) |
Cc や Bcc | cc: bcc: (例 cc:太郎) |
件名に含まれる単語 | subject: (例 subject:夕食) |
検索結果から除外するキーワードを指定 | – (例 夕食 -映画) |
複数の条件指定 | OR または { } (例 from:花子 OR from:太郎) (例 {from:花子 from:太郎}) |
searchメソッドのより詳細の解説はこちらの記事で行っています。
メール本文から要素ごとに情報を抽出(getMessages、getPlainBody)
本文の取得
GmailThread.getMessages()
- 戻り値:GmailThreadに含まれるメッセージの配列
GmailMessage.getPlainBody()
- 戻り値:GmailMessageに含まれる本文(HTMLは含まずテキストのみを取得)
<<前半:本文取得部分>>
// スレッド内のメール一覧を取得
let messages = thread.getMessages();
// メールを一つずつ取り出す
messages.forEach(function(message) {
// メール本文
let plainBody = message.getPlainBody();
// console.log(plainBody);
// 問い合わせ日
let date = plainBody.match(/問い合わせ日:(.*)/);
// console.log(date);
// 問い合わせ内容
let naiyo = plainBody.match(/問い合わせ内容:(.*)/);
// console.log(naiyo);
// 名前
let name = plainBody.match(/名前:(.*)/);
// console.log(name);
// よみがな
let yomi = plainBody.match(/よみがな:(.*)/);
// console.log(yomi);
// 会社名
let company = plainBody.match(/会社名:(.*)/);
// console.log(company);
// メールアドレス
let title = plainBody.match(/役職:(.*)/);
// console.log(title);
// メールアドレス
let mail = plainBody.match(/メールアドレス:(.*)/);
// console.log(mail);
// 電話番号
let tel = plainBody.match(/電話番号:(.*)/);
// console.log(tel);
getPlainBodyメソッドで本文をテキストで抽出した後、事前に定義していた各問合せ項目(日付、名前、アドレス等)ごとに変数に格納していきます。ここでは、matchメソッドを使い</[問合せ項目](.*)/>と正規表現で記述することで、本文内容を抽出しました。
getPlainBodyメソッドと似た記述としてgetBodyメソッドがあります。記述方法は全く同じで役割も似ているのでややこしいですが、getPlainBodyがテキストのみを取得するのに対して、getBodyはHTMLタグを含めて本文を取得します。
今回はプレーンテキストで問題なかったので、getPlainBodyメソッドを使いました。
matchメソッドと正規表現については下記の記事をご覧ください。
メール情報を二次元配列として格納
Array.push(val1 [, val2,… , valN)
- valN:配列に追加したい要素、配列の末尾に追加される
- 戻り値:要素が追加された新しい配列の要素数
元の配列は追加要素が加わった新しい配列に変更される
//各メール情報を組みとした二次元配列として格納 gmailInfo.push([date[1],naiyo[1],name[1],yomi[1],company[1],title[1],mail[1],tel[1]]
);
});
});
return(gmailinfo);
検索条件にヒットしたメールごとに、[date(日付), naiyo(問い合わせ内容), name(名前) ,yomi(よみがな), company(会社), title(役職), mail(メールアドレス), tel(電話番号)…] の組を一つの要素とした二次元配列 gmailInfoを作成。
抽出・取得した情報をスプレッドシートに転記
先ほど作成したメール一覧の二次元配列をmyFunction側で取得。
// 抽出条件指定
let query = 'subject:フォーム問い合わせ';
//問合せごとの情報が要素になった二次元配列を取得
let gmail = getGmail(query);
取得した二次元配列の各要素が、スプレッドシートに行単位で書き込みたい一つのメール情報となっているので、forEachメソッドを使って各要素に対してappendRowメソッドを実行しています。
// 書き込むシートを取得、アクティブシートを取得しているが任意のシートでOK
let sheet = SpreadsheetApp.getActive().getActiveSheet();
//要素ごとにappendRowメソッドを呼び出して最終行に書き込む繰り返し処理を実行
gmail.forEach(info => sheet.appendRow(info));
appendRowメソッドの使い方は下記の記事も参照してみてください。
今回は検索条件に一致したメール数分、1つ1つをappendRowメソッドを使って格納しましたが、lastRowメソッド・setValuesメソッド等を使いながら二次元配列を一括で格納することも可能です。例えば下記の記載も上記と同じ結果になります。
// 書き込むシートを取得、アクティブシートを取得しているが任意のシートでOK
let sheet = SpreadsheetApp.getActive().getActiveSheet();
//範囲
let lastRow = sheet.getLastRow(); //既存データが入っている最終行番号
let row = gmail.length; //書き込みたいデータの行数
let col = gmail[0].length; //書き込みたいデータの列数
let range = sheet.getRange(lastRow+1, 1, row, col); //書き込み範囲指定
//書き込み実行
range.setValues(gmail);
まとめ
GASでGmailからスプレッドシートに自動転記する方法をご紹介しました。
- 抽出・転記先のスプレッドシートを用意
- 条件を指定しGmailからメール一覧を取得(GmailApp.search)
- メール本文から要素ごとに情報を抽出(getMessages、getPlainBody)
- matchメソッドと正規表現を使って要素ごとに値を取得
- 抽出した情報をスプレッドシートに転記(appendRowまたはsetValues)
いくつかgmail特有の記述がありましたが、マスターして業務効率化していきましょう。
てつお
広告代理店出身、事業会社でWebマーケティングや開発の仕事をしている26歳です。プロフィール詳細はこちら。
■Google広告認定資格|Google アナリティクス個人認定資格(GAIQ)|TOEIC920点
関連記事
【GAS】GoogleアラートメールをLINEに自動通知する
Google Apps Scriptを使ってGoogleアラートメールの内容を定 ...
【GAS】Gmail添付ファイルの取得と自動保存
この記事では、Google Apps Script(GAS)を使って添付ファイル ...
【GAS】 Gmail連携の基本
Google Apps Script(GAS)ではGoogle系アプリ(Gmai ...
Google Apps Scriptでメルマガを分析する
前回はGoogle Apps Scriptで自分のGメールボックスにある特定メー ...
【GAS】配列に指定文字列が含まれているか検索する(includes / indexOf / lastIndexOf / filter)
Google Apps Script(GAS)プログラムのあらゆる場面で、配列( ...