You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google App Script Gmail插件:回复草稿无法归入原邮件线程问题

问题:Gmail插件回复邮件无法归入原线程

我用Google App Script开发了一款简化邮件回复流程的插件,替代以下手动操作:

  • 在邮件界面转发邮件
  • 复制原邮件收件人地址并粘贴到转发邮件
  • 复制原邮件抄送地址并粘贴到转发邮件
  • 添加一段短文本
  • 将邮件保存到“草稿”文件夹

插件代码如下:

function REP() {
  // 激活临时Gmail权限,允许插件读取邮件元数据和内容
  var accessToken = e.gmail.accessToken;
  GmailApp.setCurrentMessageAccessToken(accessToken);

  var d1 = CardService.newDivider();

  var textToIn2 = CardService.newTextInput()
    .setFieldName("textTO2")
    .setMultiline(true);

  var composeAction = CardService.newAction()
    .setFunctionName('createReplyDraft');
  var composeButton = CardService.newTextButton()
    .setText('FK3')
    .setComposeAction(composeAction, CardService.ComposedEmailType.REPLY_AS_DRAFT);

  var cardSection1 = CardService.newCardSection()
    .addWidget(textToIn2)
    .addWidget(d1)
    .addWidget(composeButton);

  var card = CardService.newCardBuilder()
    .addSection(cardSection1)
    .build();

  return card;
}

function createReplyDraft(e) {
  // 创建回复草稿
  var messageId = e.gmail.messageId;
  var message = GmailApp.getMessageById(messageId);

  var mto = message.getTo();
  var mfrom = message.getFrom();
  var mtoCC0 = message.getCc();
  var mSub = message.getSubject();

  var mBody = message.getBody();
  var mAttach = message.getAttachments();

  var f = "some e-mail adresss @aaaaaa.com"; // 要添加的地址
  var Findf = false; 

  if (mtoCC0.indexOf(f) < 0) { Findf = true; }
  if (Findf) { mtoCC0= mtoCC0 + " ," + f ;} 

  var textget = e.formInputs.textTO2;
  mBody = "<br>" + textget + "<br><br><br>" + mBody;

  var draft = message.createDraftReply('', {  
    cc: mtoCC0,
    htmlBody: mBody,
    attachments: mAttach,
    replyTo: mfrom,
    subject: mSub
  });

  return CardService.newComposeActionResponseBuilder()
    .setGmailDraft(draft).build();
}

目前遇到的问题:同事收到我的回复时,邮件显示为新邮件而非原邮件线程的续接,请问需要修改哪些内容才能让回复归入原邮件线程?

插件的appsscript.json配置如下:

{
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.container.ui",
    "https://www.googleapis.com/auth/gmail.addons.execute",
    "https://www.googleapis.com/auth/gmail.addons.current.message.metadata",
    "https://www.googleapis.com/auth/gmail.modify",
    "https://www.googleapis.com/auth/gmail.addons.current.action.compose",
    "https://www.googleapis.com/auth/script.locale"
  ],

  "gmail": {
    "name": "FallowK",
    "logoUrl": "https://www.gstatic.com/images/icons/material/system/1x/label_googblue_24dp.png",
    "primaryColor": "#07b4ed",
    "secondaryColor": "#ed7207",
    "contextualTriggers": [
      {
        "unconditional": {},
        "onTriggerFunction": "REP"
      }
    ]
  },

  "timeZone": "Europe/Warsaw",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}

解决方案

Gmail通过邮件主题(需包含Re:前缀)和邮件头的In-Reply-To/References字段关联线程。当前代码手动指定原主题,覆盖了createDraftReply自动添加Re:前缀和线程关联头的默认行为,导致邮件无法归入原线程。

需要修改以下两处:

1. 修复主题格式(避免重复添加Re:)

在createDraftReply函数中,替换原主题处理代码:

var mSub = message.getSubject();
// 检查主题是否已包含Re:前缀,避免重复添加
if (!mSub.startsWith("Re: ")) {
  mSub = "Re: " + mSub;
}

2. 简化createDraftReply参数,让方法自动处理线程关联

删除手动指定的subject和replyTo参数,让createDraftReply自动生成线程关联所需的邮件头和主题:

var draft = message.createDraftReply('', {  
  cc: mtoCC0,
  htmlBody: mBody,
  attachments: mAttach
});

修改后,createDraftReply会自动设置正确的In-Reply-To和References头,同时确保主题带有Re:前缀,让回复邮件正确归入原线程。


内容的提问来源于stack exchange,提问作者Chora Poczta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:17:06