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

无法调用composeTrigger函数,撰写邮件弹窗签名语录无法实时更新

解决Gmail Add-on签名无法实时更新的问题

问题原因

Gmail撰写弹窗在打开时会缓存用户的签名内容,即使通过Gmail API成功更新了全局签名,已打开的撰写弹窗也不会自动刷新缓存,必须刷新页面重新打开弹窗才能加载新签名。

解决方案

需要在更新全局签名的同时,主动更新当前打开的撰写草稿中的签名内容;或者在打开撰写弹窗时,强制插入最新签名替代缓存版本。

方案1:切换签名时同步更新当前草稿

修改开关触发的handleToggleSwitchChange函数,在更新全局签名后,检查并修改当前打开的草稿内容:

async function handleToggleSwitchChange(e) {
  // 解析开关参数,获取对应签名ID
  const switchName = e.parameters.switchName;
  const signatureId = switchName.replace('toggle_switch_', '');
  
  // 获取最新签名数据和属性信息
  const signatures = await getUsedSignatures();
  const selectedSignature = signatures.data.find(s => s.id === signatureId);
  const ancer = (await getAttribute()).data[0].attribute;

  // 先更新用户全局签名
  updateGmailSignature(selectedSignature.quote, ancer, selectedSignature.toggle);

  // 同步更新当前撰写草稿的签名
  try {
    const draftId = e.draftId;
    if (draftId) {
      // 获取草稿内容并解码
      const draft = Gmail.Users.Drafts.get('me', draftId);
      let body = Utilities.base64DecodeWebSafe(draft.message.payload.body.data)
        .map(byte => String.fromCharCode(byte))
        .join('');

      // 根据开关状态替换/移除签名
      const oldSignaturePattern = new RegExp(`(${ancer})$`, 'm');
      let newBody;
      if (selectedSignature.toggle === "TRUE") {
        if (oldSignaturePattern.test(body)) {
          newBody = body.replace(oldSignaturePattern, `${selectedSignature.quote}\n${ancer}`);
        } else {
          newBody = `${body}\n\n${selectedSignature.quote}\n${ancer}`;
        }
      } else {
        newBody = body.replace(oldSignaturePattern, '');
      }

      // 重新编码并更新草稿
      const updatedDraft = {
        message: {
          payload: {
            body: {
              data: Utilities.base64EncodeWebSafe(newBody)
            }
          }
        }
      };
      Gmail.Users.Drafts.update(updatedDraft, 'me', draftId);
    }
  } catch (error) {
    Logger.log('Error updating draft signature: ' + error);
  }

  // 返回更新后的插件卡片
  return startApp();
}

方案2:打开撰写弹窗时强制插入最新签名

配置Add-on的撰写触发器,在弹窗打开时自动插入最新签名:

  1. 在appsscript.json中添加撰写触发器配置:
{
  "timeZone": "Asia/Shanghai",
  "dependencies": {
    "enabledAdvancedServices": [
      {
        "userSymbol": "Gmail",
        "serviceId": "gmail",
        "version": "v1"
      }
    ]
  },
  "oauthScopes": [
    "https://www.googleapis.com/auth/gmail.addons.execute",
    "https://www.googleapis.com/auth/gmail.settings.basic",
    "https://www.googleapis.com/auth/gmail.compose"
  ],
  "gmail": {
    "name": "签名语录插件",
    "logoUrl": "",
    "composeTrigger": {
      "draftAccess": "WRITE",
      "onTriggerFunction": "onComposeOpen"
    }
  }
}
  1. 添加弹窗打开时的处理函数:
async function onComposeOpen(e) {
  const attribute = await getAttribute();
  const ancer = attribute.data[0].attribute;
  const newsResult = await getUsedSignatures();
  
  // 获取最新启用的签名内容
  let latestSignature = '';
  if (newsResult && newsResult.data.length > 0) {
    const defaultSignature = newsResult.data[0];
    if (defaultSignature.toggle === "TRUE") {
      latestSignature = `${defaultSignature.quote}\n${ancer}`;
    }
  }

  // 创建更新草稿的动作,插入最新签名
  const updateAction = CardService.newUpdateDraftAction()
    .setUpdateDraftBodyAction(CardService.newUpdateDraftBodyAction()
      .addUpdateContent(latestSignature, CardService.ContentType.TEXT)
      .setAppend(false)); // false替换现有签名,true则追加,按需调整

  // 构建提示卡片
  const card = CardService.newCardBuilder()
    .addSection(CardService.newCardSection()
      .addWidget(CardService.newTextParagraph().setText("签名已更新为最新版本")));

  // 返回卡片和更新动作
  return CardService.newComposeResponseBuilder()
    .setCard(card.build())
    .setUpdateDraftAction(updateAction)
    .build();
}

关键注意事项

  • 确保Add-on拥有https://www.googleapis.com/auth/gmail.compose权限,否则无法修改草稿
  • 签名替换的正则表达式需根据实际签名格式调整,确保能准确匹配旧签名内容
  • 使用方案2时,建议关闭Gmail默认的自动插入签名功能,避免重复显示

内容的提问来源于stack exchange,提问作者Dinesh Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:43:18