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

Gmail Workspace插件开发:SelectionInput.setExternalDataSource回调返回值疑问

为Gmail Workspace插件的SelectionInput返回正确的外部数据源格式

当你使用setExternalDataSource()为SelectionInput绑定外部数据源时,对应的函数(比如getContacts())不能直接返回普通对象数组,必须返回CardService.SelectionInputResponse类型的对象,该对象需要通过官方提供的构建器来创建。

核心要求

函数必须通过CardService.newSelectionInputResponseBuilder()构建响应,并用CardService.newSelectionItem()创建每个下拉选项,为每个选项分别设置显示文本(setText())和对应的值(setValue())。

完整代码示例

1. 创建绑定外部数据源的SelectionInput

function buildCard() {
  // 创建下拉选择组件
  const contactDropdown = CardService.newSelectionInput()
    .setType(CardService.SelectionInputType.DROPDOWN)
    .setTitle("选择联系人")
    .setFieldName("selectedContact")
    // 绑定外部数据源函数
    .setExternalDataSource(CardService.newAction().setFunctionName("getContacts"));

  // 将组件添加到卡片并返回
  const card = CardService.newCardBuilder().addSection(
    CardService.newCardSection().addWidget(contactDropdown)
  );
  return card.build();
}

2. 实现外部数据源函数getContacts()

function getContacts(event) {
  // 可选:获取用户输入的查询词(用于搜索过滤场景)
  const userQuery = event?.commonEventObject?.query || "";

  // 调用外部Web服务获取数据(替换为你的实际请求逻辑,比如UrlFetchApp.fetch)
  const externalContacts = fetchContactsFromExternalService(userQuery);

  // 构建下拉选项响应
  const responseBuilder = CardService.newSelectionInputResponseBuilder();
  externalContacts.forEach(contact => {
    const selectionItem = CardService.newSelectionItem()
      .setText(contact.displayName) // 下拉框显示的文本
      .setValue(contact.uniqueId); // 选中后传递的值
    responseBuilder.addItem(selectionItem);
  });

  // 返回构建完成的响应对象
  return responseBuilder.build();
}

// 模拟外部Web服务请求逻辑
function fetchContactsFromExternalService(query) {
  // 这里替换为实际的API调用,比如:
  // const response = UrlFetchApp.fetch("https://your-api.com/contacts?query=" + encodeURIComponent(query));
  // return JSON.parse(response.getContentText());
  
  // 模拟返回数据
  const mockData = [
    {displayName: "张三", uniqueId: "user_001"},
    {displayName: "李四", uniqueId: "user_002"},
    {displayName: "王五", uniqueId: "user_003"}
  ];
  
  // 根据查询词过滤(可选)
  return mockData.filter(item => item.displayName.includes(query));
}

关键注意点

  • 必须使用CardService提供的构建器类,不能直接返回普通JSON或数组,否则插件无法识别
  • 如果需要支持搜索过滤,可通过event.commonEventObject.query获取用户输入的关键词,在函数中对外部数据进行过滤后再构建选项
  • 确保外部数据请求逻辑符合Google Apps Script的执行限制(比如请求超时、权限等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:48:19