#背景
Gmailの返信メールで送り先(to)を変更したくなりましたが、しっくりする方法がなかったので備忘録として残します。
Qiita初投稿です!
#シチュエーション
定期的に行われるイベントの連絡メールに対して、リマインドメールを送る。
ただし、連絡メールは返信が来ない可能性があるため、最新メールに返信すると送り先が自分になる可能性がある。
メールのスレッドの最新に返信し、送り先を連絡メールを送った人に送りたい。
自分 :連絡メール To Who
↓
Who :返信(ないかもしれない) To 自分
↓
自分 :リマインドメール(最新のメールに対して、最初の送り先にメールを送る) To Who
#調査
GASの公式
GASの公式の返信メール作成メソッドを見ても宛先を変更する方法はなさそう…
createDraftReply(body, options)
オプションを見ても、toに関しては記載なし。
#ソース
function myFunction() {
//返信メールの雛形
var mailBody = "各位\r\n"
+ "hogeのリマインドです。\r\n"
+ "以上です。\r\n";
//Gmailで検索する条件を作成
var serchInfoMap = {};
serchInfoMap['subject'] = "調べたいタイトル";
serchInfoMap['after'] = "2019/10/05";
//検索条件で取得したスレッド単位のメッセージリスト(2次元配列で縦がスレッド、横がメッセージ)
var messageList = searchMessageList(serchInfoMap);
//スレッド単位にループ
for(var index in messageList){
//引用文形式に力技で変換する
var lastMail = messageList[index][messageList[index].length - 1];
var quteBody = generateQuoteMailBody(lastMail.getPlainBody(), lastMail.getDate(), lastMail.getFrom());
var createMailBody = mailBody + "\r\n" + quteBody;
//返信メールを下書きに作成
var replayMailDrfut = lastMail.createDraftReply(createMailBody);
var replayMailMessage = replayMailDrfut.getMessage();
var firstMail = messageList[index][0];
var mailArgs = {cc:firstMail.getCc()};
//作成したメールの送り先を更新
replayMailDrfut.update(firstMail.getTo(), replayMailMessage.getSubject(), replayMailMessage.getPlainBody(), mailArgs) ;
}
}
/*
スレッド単位にメールリストを取得する
@parm Gmail検索条件(key:Gmailの検索クエリのキーワード、value:キーのキーワードで検索する値)
@return メッセージリスト
*/
function searchMessageList(serchInfoMap){
var query = "";
for(var serchKey in serchInfoMap){
query = query + serchKey + ":" + serchInfoMap[serchKey] + " ";
}
Logger.log(query);
//メールの検索
var threadList = GmailApp.search(query);
var messageList = GmailApp.getMessagesForThreads(threadList);
return messageList;
}
/*
引用メール本文を生成する(力技…)
@parm メール本文
@parm メール受信日
@parm 差出人
@return 引用形式のメール本文
@返却イメージ
On 2019/10/05/ 12:59, 差出人 wrote:
>〇〇
>××
*/
function generateQuoteMailBody(mailBody, receivedDate, from){
//サンダーバードで自動生成される返信時の差出人、受信日を作成
var bodyHeader = "On " + Utilities.formatDate(receivedDate, 'Asia/Tokyo', "yyyy/MM/dd hh:mm") + ", " + from + " wrote:\r\n";
var quoteMailBody = bodyHeader + mailBody;
//サンダーバードだと引用文として認識される「>」を改行直後に追加
quoteMailBody = quoteMailBody.replace(/\r\n/g, '\r\n>');
return quoteMailBody;
}
#解説
基本的には、コメントの通りです。
返信メールを一旦下書きに作成してから、更新する処理になっています。
あと、引用返信についてもオプションで指定がなかったので、改行文字を置換して無理やり、引用形式にしてます。
メールクライアントにサンダーバードを使用しているため、サンダーバード前提で処理を組んでます。
もっとイケてる方法やなにかあればご指摘お願いします!
#参考URL
GASの公式
Gmailの検索演算子について
サンダーバード