无法调用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的撰写触发器,在弹窗打开时自动插入最新签名:
- 在
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" } } }
- 添加弹窗打开时的处理函数:
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
相关产品推荐
相关产品推荐

