设计互动式卡片或对话框

本页介绍了如何向卡片或对话框消息添加 widget 和界面元素,以便用户与您的 Google Chat 应用互动,例如点击按钮或提交信息。


使用卡片制作工具设计和预览卡片。

打开卡片制作工具

前提条件

  • 有权访问 Google ChatGoogle Workspace 帐号
  • 一款已发布的 Chat 应用。如需构建 Chat 应用,请按照此quickstart操作。
  • 添加按钮

    ButtonList widget 会显示一组按钮。按钮可以显示文本和/或图标。每个 Button 都支持在用户点击该按钮时发生的 OnClick 操作。例如:

    • 使用 OpenLink 打开超链接,以便为用户提供更多信息。
    • 运行可运行自定义函数(如调用 API)的 action

    为实现无障碍功能,按钮支持替代文本。

    添加一个运行自定义函数的按钮

    以下卡片由一个 ButtonList widget 和两个按钮组成。只需点按一下,即可在新标签页中打开 Google Chat 开发者文档。另一个按钮会运行一个名为 goToView() 的自定义函数并传递 viewType="BIRD EYE VIEW" 参数。

    添加一个具有自定义颜色和一个已停用按钮的按钮

    您可以通过设置 "disabled": "true" 来阻止用户点击按钮。

    以下代码将显示一张卡片,其中包含一个具有两个按钮的 ButtonList widget。一个按钮使用 Color 字段自定义按钮的背景颜色。另一个按钮会通过 Disabled 字段停用,这会阻止用户点击该按钮并执行该函数。

    添加带图标的按钮

    以下代码显示的卡片由一个 ButtonList widget 和两个图标 Button widget 组成。一个按钮使用 knownIcon 字段来显示 Google Chat 的内置电子邮件图标。另一个按钮使用 iconUrl 字段显示自定义图标 widget

    添加带有图标和文本的按钮

    以下代码显示的卡片包含提示用户发送电子邮件的 ButtonList widget。第一个按钮显示电子邮件图标,第二个按钮显示文本。用户可以点击图标或文本按钮来运行 sendEmail 函数。

    添加可选择的界面元素

    SelectionInput widget 提供了一组可选项,例如复选框、单选按钮、开关或下拉菜单。您可以使用此微件向用户收集已定义和标准化的数据。如需向用户收集未定义的数据,请改用 TextInput widget。

    SelectionInput widget 支持建议(可帮助用户输入统一数据)和变化操作(即 Actions,在选择输入字段中发生更改时(例如用户选择或取消选择某项)时运行)。

    聊天应用可以接收和处理所选项的价值。 如需详细了解如何使用表单输入,请参阅接收表单数据

    本部分提供了使用 SelectionInput widget 的卡片示例。这些示例使用不同类型的部分输入:

    添加复选框

    以下代码会显示一个对话框,其中含有使用复选框的 SelectionInput widget,要求用户指定联系人是职业联系人、个人联系人还是二者兼有:

    添加单选按钮

    以下代码使用一个使用单选按钮的 SelectionInput widget 来显示一个对话框,要求用户指定联系人是专业联系人还是个人联系人:

    添加开关

    以下代码会显示一个对话框,其中要求用户通过一个使用开关的 SelectionInput widget 指定联系人是专业联系人还是个人联系人:

    以下代码使用一个使用下拉菜单的 SelectionInput widget,要求用户指定联系人是专业联系人还是个人联系人:

    添加多选菜单

    以下代码会显示一个对话框,要求用户从多选菜单中选择联系人:

    为多选菜单使用数据源

    以下部分介绍了如何使用多选菜单从动态来源(例如 Google Workspace 应用或外部数据源)填充数据。

    Google Workspace 的数据源

    您可以从 Google Workspace 中的以下数据源为多选菜单填充内容:

    • Google Workspace 用户:您只能填充同一 Google Workspace 组织内的用户。
    • Chat 聊天室:用户在多选菜单中选择的内容只能查看和选择其 Google Workspace 组织内所属的聊天室。

    如需使用 Google Workspace 数据源,请指定 platformDataSource 字段。与其他选择输入类型不同,您可以省略 SectionItem 对象,因为这些选择项是从 Google Workspace 动态获取的。

    以下代码显示了 Google Workspace 用户的多选菜单。为了填充用户,选择输入会将 commonDataSource 设置为 USER

    JSON

    {
      "selectionInput": {
        "name": "contacts",
        "type": "MULTI_SELECT",
        "label": "Selected contacts",
        "multiSelectMaxSelectedItems": 5,
        "multiSelectMinQueryLength": 1,
        "platformDataSource": {
          "commonDataSource": "USER"
        }
      }
    }
    

    以下代码显示了 Chat 聊天室的多选菜单。如需填充空格,选择输入会指定 hostAppDataSource 字段。多选菜单还会将 defaultToCurrentSpace 设置为 true,这会将当前空间设为菜单中的默认选择:

    JSON

    {
      "selectionInput": {
        "name": "spaces",
        "type": "MULTI_SELECT",
        "label": "Selected contacts",
        "multiSelectMaxSelectedItems": 3,
        "multiSelectMinQueryLength": 1,
        "platformDataSource": {
          "hostAppDataSource": {
            "chatDataSource": {
              "spaceDataSource": {
                "defaultToCurrentSpace": true
              }
            }
          }
        }
      }
    }
    
    Google Workspace 以外的数据源

    多选菜单还可以填充来自第三方或外部数据源的项。例如,您可以使用多选菜单来帮助用户从客户关系管理 (CRM) 系统中的潜在客户列表中进行选择。

    如需使用外部数据源,请使用 externalDataSource 字段指定用于从数据源返回项的函数。

    为了减少向外部数据源发出的请求,您可以在用户输入内容之前,先在多选菜单中包含一些建议菜单项,然后再使用这些选项。例如,您可以为用户填充最近搜索过的联系人。如需填充来自外部数据源的建议内容,请指定 SelectionItem 对象。

    以下代码为用户显示了外部联系人集中的项多选菜单。默认情况下,该菜单会显示一个联系人,并运行 getContacts 函数以从外部数据源检索和填充项目:

    JSON

    {
      "selectionInput": {
        "name": "contacts",
        "type": "MULTI_SELECT",
        "label": "Selected contacts",
        "multiSelectMaxSelectedItems": 5,
        "multiSelectMinQueryLength": 2,
        "externalDataSource": {
          "function": "getContacts"
        },
        "items": [
          {
            "text": "Contact 3",
            "value": "contact-3",
            "startIconUri": "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
            "bottomText": "Contact three description",
            "selected": false
          }
        ]
      }
    }
    

    对于外部数据源,您还可以自动补全用户在多选菜单中开始输入的内容。例如,如果用户开始输入 Atl 以显示填充美国城市的菜单,您的 Chat 应用可以在用户完成输入之前自动建议 Atlanta。您最多可以自动填充 100 项。

    如需自动补全项目,您需要创建一个函数,该函数会查询外部数据源,并且每当用户在多选菜单中输入内容时就会返回相应项目。该函数必须执行以下操作:

    • 传递一个表示用户与菜单互动的事件对象。
    • 确定互动事件的 invokedFunction 值与 externalDataSource 字段中的函数匹配。
    • 当函数匹配时,从外部数据源返回建议的项。如需根据用户输入的内容建议内容,请获取 autocomplete_widget_query 键的值。此值表示用户在菜单中输入的内容。

    以下代码会自动填充外部数据资源中的项。在前面的示例中,Chat 应用会根据函数 getContacts 的触发时间推荐项目:

    Apps 脚本

    apps-script/selection-input/on-widget-update.gs
    /**
     * Widget update event handler.
     *
     * @param {Object} event The event object from Chat API.
     * @return {Object} Response from the Chat app.
     */
    function onWidgetUpdate(event) {
      const actionName = event.common["invokedFunction"];
      if (actionName !== "getContacts") {
        return {};
      }
    
      return {
        actionResponse: {
          type: "UPDATE_WIDGET",
          updatedWidget: {
            suggestions: {
              items: [
                {
                  value: "contact-1",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 1",
                  bottomText: "Contact one description",
                  selected: false
                },
                {
                  value: "contact-2",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 2",
                  bottomText: "Contact two description",
                  selected: false
                },
                {
                  value: "contact-3",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 3",
                  bottomText: "Contact three description",
                  selected: false
                },
                {
                  value: "contact-4",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 4",
                  bottomText: "Contact four description",
                  selected: false
                },
                {
                  value: "contact-5",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 5",
                  bottomText: "Contact five description",
                  selected: false
                },
              ]
            }
          }
        }
      };
    }
    

    Node.js

    node/selection-input/on-widget-update.js
    /**
     * Widget update event handler.
     *
     * @param {Object} event The event object from Chat API.
     * @return {Object} Response from the Chat app.
     */
    function onWidgetUpdate(event) {
      const actionName = event.common["invokedFunction"];
      if (actionName !== "getContacts") {
        return {};
      }
    
      return {
        actionResponse: {
          type: "UPDATE_WIDGET",
          updatedWidget: {
            suggestions: {
              items: [
                {
                  value: "contact-1",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 1",
                  bottomText: "Contact one description",
                  selected: false
                },
                {
                  value: "contact-2",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 2",
                  bottomText: "Contact two description",
                  selected: false
                },
                {
                  value: "contact-3",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 3",
                  bottomText: "Contact three description",
                  selected: false
                },
                {
                  value: "contact-4",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 4",
                  bottomText: "Contact four description",
                  selected: false
                },
                {
                  value: "contact-5",
                  startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
                  text: "Contact 5",
                  bottomText: "Contact five description",
                  selected: false
                },
              ]
            }
          }
        }
      };
    }
    

    添加供用户输入文本的字段

    TextInput widget 提供了一个字段,用户可以在其中输入文本。该 widget 支持可帮助用户输入统一数据的建议和变化操作(即 Actions,可在文本输入字段中发生变化时(例如用户添加或删除文本)运行。

    如果您需要向用户收集抽象或未知数据,请使用此 TextInput widget。如需向用户收集已定义的数据,请改用 SelectionInput widget。

    如需处理用户输入的文本,请参阅接收表单数据

    下面是一个包含 TextInput widget 的卡片:

    让用户选择日期和时间

    借助 DateTimePicker widget,用户可以输入日期和/或时间。或者,用户可以使用选择器选择日期和时间。如果用户输入的日期或时间无效,选择器会显示错误,提示用户正确输入信息。

    如需处理用户输入的日期和时间值,请参阅接收表单数据

    以下代码将显示一张卡片,其中包含三种不同类型的 DateTimePicker widget:

    问题排查

    当 Google Chat 应用或卡片返回错误时,Chat 界面会显示“出了点问题”或“无法处理您的请求”的消息。有时,Chat 界面不会显示任何错误消息,但 Chat 应用或卡片会产生意外结果;例如,卡片消息可能不会显示。

    虽然 Chat 界面中可能不会显示错误消息,但当为 Chat 应用启用错误日志记录功能时,您可以借助描述性错误消息和日志数据修正错误。如需查看、调试和修正错误方面的帮助,请参阅排查并修正 Google Chat 错误