如何在Google Add-Ons的CardService中集成HtmlService实现下拉菜单?
解决Gmail Add-On中CardService替代ListBox实现下拉菜单的问题
嘿,我来帮你梳理清楚这个问题!首先得明确一个核心点:CardService无法直接集成HtmlService的内容——这两个服务是完全独立的体系:CardService用于构建Google Workspace插件的标准化卡片界面,而HtmlService是用来创建自定义网页或独立弹窗的,没法嵌入到CardService的卡片组件里。
官方早就为弃用的ListBox提供了替代方案:使用CardService.SelectionInput组件,这是专门为CardService设计的下拉选择控件,完全能满足你的需求。
正确实现下拉菜单的代码示例
修改后的GetContextualAddOn.gs
function createReply(e) { // 获取下拉菜单的选中值(对应setFieldName设置的名称) const selectedReplyType = e.formInput.replyTemplate; const accessToken = e.messageMetadata.accessToken; GmailApp.setCurrentMessageAccessToken(accessToken); const messageId = e.messageMetadata.messageId; const message = GmailApp.getMessageById(messageId); // 根据选中的选项自定义回复内容 let replyText = ''; switch(selectedReplyType) { case 'quick_ack': replyText = 'Got your message! I\'ll follow up shortly.'; break; case 'eod_reply': replyText = 'Thanks for reaching out. I\'ll send a detailed reply by EOD.'; break; default: replyText = 'Got your message'; } const draft = message.createDraftReply(replyText); return CardService.newComposeActionResponseBuilder() .setGmailDraft(draft).build(); } function getContextualAddOn() { const card = CardService.newCardBuilder(); card.setHeader(CardService.newCardHeader().setTitle('Respond to Email')); const section = CardService.newCardSection(); // 创建下拉菜单控件(替代弃用的ListBox) const dropdown = CardService.newSelectionInput() .setType(CardService.SelectionInputType.DROPDOWN) // 指定为下拉类型 .setFieldName('replyTemplate') // 这个名称用于后续获取选中值 .setTitle('Choose a reply template') // 下拉菜单的标题 // 添加下拉选项:显示文本、内部值、是否默认选中 .addItem('Quick acknowledgment', 'quick_ack', true) .addItem('EOD reply promise', 'eod_reply', false); section.addWidget(dropdown); // 创建回复按钮并绑定动作 const action = CardService.newAction().setFunctionName('createReply'); const replyButton = CardService.newTextButton() .setText('Create Reply Draft') .setComposeAction(action, CardService.ComposedEmailType.REPLY_AS_DRAFT); section.addWidget(replyButton); card.addSection(section); return [card.build()]; }
关键细节说明
- SelectionInput的优势:它是CardService官方支持的组件,不仅能做下拉菜单,还支持单选按钮、多选框类型,完全覆盖原ListBox的功能,且能完美适配Google Workspace的插件界面风格。
- 获取选中值:在绑定的函数(比如
createReply)中,通过e.formInput.xxx就能拿到选中的选项值,其中xxx是你在setFieldName中设置的名称。 - 关于HtmlService的替代场景:如果确实需要高度自定义的界面,你可以通过
CardService.newAction().setOpenLink()打开一个由HtmlService托管的独立网页,但这是弹窗形式,并不是嵌入到卡片内部的——而对于下拉菜单这种基础交互,完全没必要这么做。
内容的提问来源于stack exchange,提问作者Ezra Bell
相关产品推荐
相关产品推荐

