94856


お世話になります。  
GASでプログラムを勉強しながら社内システムを作っています。

## やりたいこと

**指定したGmailのスレッド（メッセージ）へ、スプレッドシートから返信したい。**

現在、スプレッドシート上で送受信が概ね完結できるメールシステムを作っています。  
いわゆるinfoメールのような会社の代表アドレスでカスタマー対応に使用しますが、お問い合わせいただいたメールに対し、新規スレッドで返信する形にしかならず、ぶつ切れになってしまうのが今回解決したい点になります。  
なお、できればGmailAppのみが望ましいですが、GmailAPIでめちゃめちゃすんなり解決するとかであれば参考としてご教示いただけると幸いです。

* * *

## 構成

ざっくりですが、ブック内には「カスタマーデータ（名前やメアドなど）」「メール編集・送信」「メール受信リスト」のシートがあります。  
**カスタマーデータ** は文字通りのリストです。  
**編集送信シート**
では、送信先カスタマーを指定し、メール本文をセルに自由記述し、送信ボタンを押すとカスタマー情報と本文を拾ってHTMLメールに変数として組み込んで送信する、というものです。  
**受信リスト** は、受信したメールを書き出しています。重複管理の都合で、既にスレッドID・メッセージIDは記録しています。

## ソース

現状問題なく動作しているもので、スレッド返信の対応はまだ組み込んでいないものになります。

[code]

    function sendmail() { 
      //スプレッドシートのデータを取得
      let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("mail");
      let ss = sheet.getRange("A2:E8").getValues();　//カスタマーデータが入ります
      let mailsub = sheet.getRange("B8").getValues();　//mailsubと同名のHTMLデータがあります
      let message = sheet.getRange("E16").getValue();　//自由記述の本文
      message = message.replace(/\r?\n/g, '<br>');　//E16の改行を<br>に置き換え
      
      //メール本文を差し込んで送信
      for(let i = 0;i<ss.length;i++){　//最大5件同時に送信可能にしているため、ループ処理になってます
        try{
          //1行データを取り出す
          mailarr = ss[i];
          mailbody = message;
          mailtitle = sheet.getRange("E10").getValue();　//自由記述のときのメールタイトル
          headline = sheet.getRange("E14").getValue();　//メール本文内の見出し
    
          //メアドが空なら処理を終了
          if(mailarr[0] == ""){
            break;
          }
    
          //差し込んで本文を取得
    
          let html = HtmlService.createTemplateFromFile(mailsub).evaluate().getContent().replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/＠/g, '"');　//E16をevaluateした際のエスケープ文字を修正
    
          //メールを送信
          let address = mailarr[0];
          let title = "[会社名] "+mailtitle;
          let body = "このメールはhtmlです";
    
          GmailApp.sendEmail(address, title, body, {
            name: '会社名',
            from: 'info@*********.com',
            htmlBody: html
          });   
    
        }catch(e){
          return;
        }
      }
    }
    
[/code]

## 試したこと

**ChatGPTに踊らされた部分**

  * sendEmailのオプションに`inReplyTo: messageId`
  * 受信リストで取得済みのスレッドID・メッセージIDを`getValue`して`inReplyTo: threadId`
    * `inReplyTo`はGmailAppにないので×
  * `thread.addReply`で送信 
    * `addReply`もGmailAppにないので×  
-`sendEmail`から`createDraft`に変更し、`getDraftResponsesForThreads`＆`getDrafts`し、送信
    * GPTの回答がかなり迷子になった末、ドラフト作成まではいけるも返信にならない×
  * sendEmailのオプションに`replyTo: threadId`
    * `replyTo`は返信先の指定だから、スレッドIDを指定は無効×

**その後、自分でいじる**  
当初の実現目標は「返信先メールのスレッドIDまたはメッセージIDを送信シートにコピペし送信ボタンを押すと、IDを拾ってスレッドにぶら下がり返信になるメールを送信する」だったので、『そもそも既に記録されてるIDってGASで使えるのか？』と疑問に思い、`getMessagesForThread(thread)`に直でIDを記述したところ、Stringだと形式が合わないっぽくて×でした。

* * *

若干ややこしいソースかもしれませんが、よろしくご教示いただけますと幸いです。

* * *

5/31追記  
YellowGreen様のご指摘で、解決いたしました。  
以下、もしかしたら需要があるかもしれませんので修正部分について記載しておきます。

[code]

    （evaluate()まで省略）
          //メールを送信
          let address = mailarr[0];
          let title = "[会社名] "+mailtitle;
          let body = "This email is written in html.";
          
          let idcheck = sheet.getRange("G12").getValue();　//G12=チェックボックスで新規or返信モード切替
    
          //チェックあり＝スレッド返信
          if(idcheck == true){
            let msgId = sheet.getRange("I12").getValue();　//I12=MessageID
            var replyID = GmailApp.getMessageById(msgId);
            
            replyID.reply(body,{
            name: '会社名',
            from: 'info@*********.com',
            htmlBody: html
            });
    
          //チェックなし＝新規スレッド送信
          }else{
            GmailApp.sendEmail(address,title,body,{
            name: '会社名',
            from: 'info@*********.com',
            htmlBody: html
          });
        }
    
[/code]


CC BY-SA 4.0
2023-05-11T06:58:19.227
94814
2023-05-30T15:58:20.243
2023-05-30T15:58:20.243
58248
58248
question
google-apps-script google-spreadsheet gmail
スプレッドシートからGmailを送信するとき、スレッドへぶら下げて返信したい。


GmailApp.sendEmail(recipient, subject, body, options)メソッドで送信しているようですが、  
返信したいのであれば、返信したいスレッド、メッセージを改めて取得した上で、  
そのスレッド、メッセージに対して、  
message.reply(body, options)メソッドでメッセージの送信者宛に返信するか  
thread.reply(body, options)メソッドでスレッドの最後の送信者宛に返信してみるとどうなりますか？


CC BY-SA 4.0
2023-05-15T09:06:58.477
94856
2023-05-15T12:48:17.753
2023-05-15T12:48:17.753
57654
57654
94814
answer