2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GASでGmailの返信メールの送り先(To)を変更する方法

Last updated at Posted at 2019-10-06

#背景
Gmailの返信メールで送り先(to)を変更したくなりましたが、しっくりする方法がなかったので備忘録として残します。
Qiita初投稿です!

#シチュエーション
定期的に行われるイベントの連絡メールに対して、リマインドメールを送る。
ただし、連絡メールは返信が来ない可能性があるため、最新メールに返信すると送り先が自分になる可能性がある。
メールのスレッドの最新に返信し、送り先を連絡メールを送った人に送りたい。

自分 :連絡メール To Who
 ↓
Who  :返信(ないかもしれない) To 自分
 ↓
自分 :リマインドメール(最新のメールに対して、最初の送り先にメールを送る) To Who

#調査
GASの公式
GASの公式の返信メール作成メソッドを見ても宛先を変更する方法はなさそう…

createDraftReply(body, options)

オプションを見ても、toに関しては記載なし。

#ソース

メイン.gs
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) ;
  }
}
メール.gs
/*
スレッド単位にメールリストを取得する

@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の検索演算子について
サンダーバード

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?