#はじめに
これまでは、GASでSpreadsheetを操作することについて触れてきました。
1.特定のスプレッドシートを取得する
2.特定のシートを取得する
3.特定のセルを取得する
4.特定のセルに値を入力・削除をする
基本的な操作は理解できたので、これからはGmail操作について触れていきたいと思います。
#Method
GmailApp.serch(検索条件,検索スレッドのインデックス,最大取得数);
//検索結果によって抽出されたスレッドを取得
//最大取得数はmax500
threadObject.getMessages();
//スレッドからメッセージを取得する。
msgObject.getDate();
//メッセージObjectから日付を取得
msgObject.getSubject();
//メッセージオブジェクトから件名を取得
msgObject.getPlainBody();
//メッセージオブジェクトから本文を取得
##メールの検索結果のスレッドとメッセージを取得してスプレッドシートに書き込み
Gmailの特定のスレッドを、スプレッドシートに書き込むコードを書いて見ます。
var ss1 = SpreadsheetApp.openById("Spreadsheet-key");
//spreadsheetをss1に格納。
var sh1 = ss1.getSheetByName("sheet1");
//特定のシート(sheet1)をsh1に格納
var threads = GmailApp.search('subject:テスト');
//gmail.searchによって得られた検索結果のスレッドを全てthreadsに格納
var row = 2;
for ( var n in threads){
var thread = threads[n];
//threadsから一つのスレッドをthreadに格納
var msgs = thread.getMessages();
//threadからmessageを取得しmsgsに全て格納
for(var m in msgs){
var msg = msgs[m];
//msgにmsgsの[m]番目を格納
var date = msg.getDate();
//msgから日付を取得しdateに格納
var subject = msg.getSubject();
//msgから件名を取得しsubjectに格納
var subject = msg.getBody();
//msgから本文を取得しbodyに格納
sh1.getRange(row,1).setValue(date);
//dateをシート(row,1)にセット
sh1.getRange(row,2).setValue(subject);
//subjectをシート(row,2)にセット
sh1.getRange(row,3).setValue(body);
//bodyをシート(row,3)にセット
sh1.getRange(row,4).msg.getId();
row++;
//行数カウント
}
}
#メールはスレッドとメッセージの関係性
メールはスレッドというグループがあり、その中にメッセージが存在します。
例えば、以下のような形です。
1.ある人Aさんが新規メールでご相談メールをBさんに送りました。
2.BさんはAさんからのメールを確認し、[返信]でメールを返しました。
3.さらにBさんからの返信を見たAさんは、そのメールに対して[返信]でメールを返しました。
上記の場合、スレッド、メールの関係性で表すと以下のようになります。
スレッド1
・メッセージ1 AさんからBさんへのメール
・メッセージ2 Bさんから→Aさんへの返信メール
・メッセージ3 Aさんから→Bさんへの返信メール
これが仮に、メッセージ2で、Bさんが返信ではなく、新規でAさんにメールを送信した場合、
それはスレッド1のメッセージ2ではなく、新たなスレッドのメッセージ1になります。
上記の構造上、メールからはスレッドをまず取得し、その中のメッセージを取得する必要があります。
詳しい情報は、こちらを参考にするといいかと思います。
for ( var n in threads){
var thread = threads[n];
//threadsから一つのスレッドをthreadに格納
var msgs = thread.getMessages();
//threadからmessageを取得しmsgsに全て格納
for(var m in msgs){
var msg = msgs[m];
//msgにmsgsの[m]番目を格納
一番初めのfor文で、スレッドを一つずつ取得する動きをしています。
二番目のfor文で、メッセージを一つずつ取得する動きをしています。
#メッセージから日付、タイトル、本文を取得
メッセージを取得したら、メッセージ内にある日付、件名、本文を取得してそれぞれのオブジェクトに
入れる作業が以下となっています。
var msg = msgs[m];
//msgにmsgsの[m]番目を格納
var date = msg.getDate();
//msgから日付を取得しdateに格納
var subject = msg.getSubject();
//msgから件名を取得しsubjectに格納
var subject = msg.getPlainBody();
//msgから本文を取得しbodyに格納
それぞれオブジェクトに格納できたら、各行のシートに反映させます。
sh1.getRange(row,1).setValue(date);
//dateをシート(row,1)にセット
sh1.getRange(row,2).setValue(subject);
//subjectをシート(row,2)にセット
sh1.getRange(row,3).setValue(body);
//bodyをシート(row,3)にセット
sh1.getRange(row,4).msg.getId();
#最後に
今回はGmailから特定のメールをSpreadsheetに抽出することを描いて見ました。
次回は、本格的に私が作った、ホームページからの問い合わせをSpreadsheetに集約する
物を題材に書いてみようと思います。
参考
GoogleAppsScriptでいろいろな条件を指定してメールを取得する
[【GAS】Gmailの特定条件で検索したスレッドの全メールを取得してスプレッドシートに書き出す]
(https://tonari-it.com/gas-gmail-get-thread/)