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

如何在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()];
}

关键细节说明

  1. SelectionInput的优势:它是CardService官方支持的组件,不仅能做下拉菜单,还支持单选按钮、多选框类型,完全覆盖原ListBox的功能,且能完美适配Google Workspace的插件界面风格。
  2. 获取选中值:在绑定的函数(比如createReply)中,通过e.formInput.xxx就能拿到选中的选项值,其中xxx是你在setFieldName中设置的名称。
  3. 关于HtmlService的替代场景:如果确实需要高度自定义的界面,你可以通过CardService.newAction().setOpenLink()打开一个由HtmlService托管的独立网页,但这是弹窗形式,并不是嵌入到卡片内部的——而对于下拉菜单这种基础交互,完全没必要这么做。

内容的提问来源于stack exchange,提问作者Ezra Bell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:07:50