如何通过App Script程序化关闭Gmail add-on的撰写窗口?
解决Gmail Add-on发送草稿后无法关闭撰写窗口的变通方案
目前Gmail Add-ons官方并未提供直接关闭撰写窗口的API,以下是基于App Script的几种变通方案,可优化用户体验避免重复点击:
方案1:利用草稿删除后的Gmail自动感知+成功提示
调用drafts[0].send()后,该草稿会被自动删除,Gmail前端通常会在几秒内检测到草稿不存在并自动关闭撰写窗口。你可以在发送成功后返回醒目的通知,提前告知用户这一行为:
function handleSendAction(e) { const drafts = GmailApp.getDrafts(); if (drafts.length > 0) { drafts[0].send(); // 返回成功通知,提示用户窗口将自动关闭 return CardService.newActionResponseBuilder() .setNotification(CardService.newNotification() .setText("邮件已发送,撰写窗口将自动关闭") .setType(CardService.NotificationType.SUCCESS)) .build(); } // 处理无草稿的情况 return CardService.newActionResponseBuilder() .setNotification(CardService.newNotification() .setText("未找到可发送的草稿") .setType(CardService.NotificationType.ERROR)) .build(); }
方案2:直接发送邮件内容(绕过草稿)
如果你的Add-on可以从compose触发器的上下文获取撰写窗口的邮件信息(收件人、主题、正文等),可以直接调用GmailApp.sendEmail()发送,这种方式可能触发Gmail原生的撰写窗口关闭逻辑:
function handleDirectSend(e) { const composeMeta = e.gmail.composeMetadata; // 提取撰写窗口中的邮件信息 const to = composeMeta.toRecipients.join(','); const subject = composeMeta.subject || "无主题"; const body = composeMeta.bodyContent; const cc = composeMeta.ccRecipients.join(','); const bcc = composeMeta.bccRecipients.join(','); // 直接发送邮件 GmailApp.sendEmail(to, subject, body, { cc: cc, bcc: bcc, htmlBody: composeMeta.bodyContent // 如果是HTML格式邮件 }); // 返回成功通知 return CardService.newActionResponseBuilder() .setNotification(CardService.newNotification() .setText("邮件已发送") .setType(CardService.NotificationType.SUCCESS)) .build(); }
方案3:刷新插件卡片+明确引导手动关闭
如果上述自动方案效果不稳定,可以在发送成功后将插件卡片替换为仅显示成功信息的简洁卡片,明确提示用户手动关闭撰写窗口,避免重复操作:
function handleSendAndRefresh(e) { const drafts = GmailApp.getDrafts(); if (drafts.length > 0) { drafts[0].send(); // 创建成功提示卡片 const successCard = CardService.newCardBuilder() .setHeader(CardService.newCardHeader().setTitle("邮件发送成功")) .addSection(CardService.newCardSection() .addWidget(CardService.newTextParagraph().setText("请手动关闭撰写窗口,无需重复点击发送"))) .build(); // 返回更新后的卡片 return CardService.newActionResponseBuilder() .setNavigation(CardService.newNavigation().updateCard(successCard)) .build(); } // 无草稿的错误处理 return CardService.newActionResponseBuilder() .setNotification(CardService.newNotification() .setText("未找到可发送的草稿") .setType(CardService.NotificationType.ERROR)) .build(); }
内容的提问来源于stack exchange,提问作者Yuchao Wu
相关产品推荐
相关产品推荐

