本页介绍了如何向卡片添加 widget 和界面元素,以便用户与您的 Google Chat 应用互动,例如点击按钮或提交信息。
Chat 应用可以使用以下 Chat 接口构建交互式卡片:
当用户与卡片互动时,Chat 应用可以使用收到的数据进行处理并做出相应响应。如需了解详情,请参阅收集和处理 Google Chat 用户的信息。
使用卡片构建器设计和预览聊天应用的消息功能和界面:
打开卡片制作工具前提条件
启用了交互功能的 Google Chat 应用。如需创建交互式 Chat 应用,请根据您要使用的应用架构完成以下快速入门之一:
- 将 HTTP 服务与 Google Cloud Functions 搭配使用
- Google Apps 脚本
- Google Cloud Dialogflow CX
- Google Cloud Pub/Sub
添加按钮
ButtonList
widget 会显示一组按钮。按钮可以显示文本和/或图标。每个 Button
都支持一项 OnClick
操作,该操作在用户点击该按钮时发生。例如:
为了方便残障人士使用,按钮支持替代文本。
添加可运行自定义函数的按钮
以下卡片由一个包含两个按钮的 ButtonList
微件组成。只需点击一个按钮,即可在新标签页中打开 Google Chat 开发者文档。另一个按钮会运行一个名为 goToView()
的自定义函数,并传递 viewType="BIRD EYE VIEW"
参数。
添加采用 Material Design 样式的按钮
下面显示了一组采用不同 Material Design 按钮样式的按钮。
如需应用 Material Design 样式,请勿添加“color”属性。
添加一个带有自定义颜色和已停用按钮的按钮
您可以通过设置 "disabled": "true"
来阻止用户点击按钮。
以下代码展示了一个卡片,其中包含一个带有两个按钮的 ButtonList
微件。其中一个按钮使用 Color
字段自定义按钮的背景颜色。另一个按钮通过 Disabled
字段停用,以防止用户点击该按钮并执行函数。
添加带图标的按钮
以下代码会显示一个卡片,其中包含一个 ButtonList
微件和两个图标 Button
微件。一个按钮使用 knownIcon
字段来显示 Google Chat 的内置电子邮件图标。另一个按钮使用 iconUrl
字段来显示自定义图标微件。
添加带有图标和文本的按钮
以下代码显示了一张卡片,其中包含一个提示用户发送电子邮件的 ButtonList
widget。第一个按钮显示电子邮件图标,第二个按钮显示文本。用户可以点击图标或文本按钮来运行 sendEmail
函数。
为可收起的部分自定义按钮
自定义用于收起和展开卡片各个部分的控制按钮。从一系列图标或图片中进行选择,以直观地表示该部分的内容,让用户更轻松地理解和与信息互动。
添加菜单
Overflow menu
可用于聊天卡片,以提供其他选项和操作。它可以让您包含更多选项,而不会使卡片界面杂乱无章,从而确保设计简洁有条理。
添加条状标签列表
ChipList
微件提供了一种多样且视觉上吸引人的方式来显示信息。使用条状标签列表来表示标签、类别或其他相关数据,以便用户更轻松地浏览您的内容并与内容互动。
收集用户信息
本部分介绍了如何添加用于收集信息(例如文本或选择)的微件。
如需了解如何处理用户输入,请参阅收集和处理 Google Chat 用户的信息。
收集文字
TextInput
widget 提供了一个字段,用户可以在其中输入文本。该 widget 支持建议(有助于用户输入统一数据)和更改操作(即 Actions
,在文本输入字段中发生更改时运行,例如用户添加或删除文本)。
当您需要从用户收集抽象数据或未知数据时,请使用此 TextInput
微件。如需从用户收集指定的数据,请改用 SelectionInput
widget。
以下是一个由 TextInput
微件组成的卡片:
收集日期或时间
借助 DateTimePicker
widget,用户可以输入日期和/或时间。或者,用户也可以使用选择器来选择日期和时间。如果用户输入的日期或时间无效,选择器会显示错误消息,提示用户正确输入信息。
下图显示了一张卡片,由三种不同类型的 DateTimePicker
widget 组成:
让用户选择内容
SelectionInput
widget 提供了一组可选择的项,例如复选框、单选按钮、开关或下拉菜单。您可以使用此 widget 从用户那里收集已定义的标准化数据。如需从用户收集未定义的数据,请改用 TextInput
widget。
SelectionInput
微件支持建议(有助于用户输入统一的数据)和更改时执行的操作(即在选择输入字段发生更改时运行的 Actions
,例如用户选择或取消选择某个项)。
Chat 扩展应用可以接收和处理所选项目的值。 如需详细了解如何使用表单输入,请参阅处理用户输入的信息。
本部分提供了使用 SelectionInput
widget 的卡片示例。这些示例使用了不同类型的版块输入:
添加复选框
下方显示了一张卡片,要求用户通过一个使用复选框的 SelectionInput
widget 来指定联系人是职业联系人、个人联系人,还是两者都是:
添加单选按钮
下面显示了一张卡片,要求用户通过使用单选按钮的 SelectionInput
widget 指定联系人是职业联系人还是个人联系人:
添加开关
下面显示了一张卡片,要求用户通过使用开关的 SelectionInput
widget 指定联系人是职业联系人、个人联系人,还是两者都是:
添加下拉菜单
下面显示了一张卡片,要求用户通过一个使用下拉菜单的 SelectionInput
widget 指定某个联系人是职业联系人还是个人联系人:
添加多选菜单
以下代码会显示一个卡片,要求用户从多选菜单中选择联系人:
您可以从 Google Workspace 中的以下数据源为多选菜单填充内容:
- Google Workspace 用户:您只能填充同一 Google Workspace 组织中的用户。
- 聊天室:在多选菜单中输入内容的用户只能查看和选择自己在 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"
}
}
}
以下代码展示了聊天室的多选菜单。如需填充空格,选择输入会指定 hostAppDataSource
字段。多选菜单还会将 defaultToCurrentSpace
设置为 true
,这会将当前聊天室设为菜单中的默认选择:
JSON
{
"selectionInput": {
"name": "spaces",
"type": "MULTI_SELECT",
"label": "Selected contacts",
"multiSelectMaxSelectedItems": 3,
"multiSelectMinQueryLength": 1,
"platformDataSource": {
"hostAppDataSource": {
"chatDataSource": {
"spaceDataSource": {
"defaultToCurrentSpace": true
}
}
}
}
}
}
多选菜单还可以填充来自第三方或外部数据源的项。例如,您可以使用多选菜单来帮助用户从客户关系管理 (CRM) 系统的潜在客户列表中进行选择。
如需使用外部数据源,请使用 externalDataSource
字段指定从数据源返回项的函数。
为了减少对外部数据源的请求,您可以在用户在多选菜单中输入内容之前,在该菜单中显示建议内容。例如,您可以为用户填充最近搜索的联系人。如需从外部数据源填充建议的项,请指定 SelectionItem
对象。
以下代码为用户显示了一个包含外部联系人集的多选菜单。该菜单默认显示一个联系人,并运行函数 getContacts
以从外部数据源检索和填充项:
Node.js
Python
Java
Apps 脚本
对于外部数据源,您还可以为用户在多选菜单中开始输入的项自动补全内容。例如,如果用户开始输入 Atl
来查看一个菜单,该菜单会填充美国的城市,那么您的 Chat 应用可以在用户输入完毕之前自动建议 Atlanta
。您最多可以自动补全 100 项。
如需自动补全项,您可以创建一个函数,用于在用户在多选菜单中输入内容时查询外部数据源并返回项。该函数必须执行以下操作:
- 传递表示用户与菜单的互动的事件对象。
- 确认互动事件的
invokedFunction
值与externalDataSource
字段中的函数匹配。 - 当函数匹配时,返回外部数据源中的建议内容。如需根据用户输入的内容推荐商品,请获取
autocomplete_widget_query
键的值。此值表示用户在菜单中输入的内容。
以下代码会自动补全外部数据资源中的项。在前面的示例中,Chat 应用根据函数 getContacts
的触发时间来建议项:
Node.js
Python
Java
Apps 脚本
验证输入到卡片的数据
本页介绍了如何验证输入到卡片的 action
和 widget 的数据。例如,您可以验证文本输入字段是否包含用户输入的文本,或者它是否包含特定数量的字符。
设置操作所需的微件
在卡片的 action
中,将操作所需的 widget 的名称添加到其 requiredWidgets
列表。
如果此处列出的任何 widget 在调用此方法时都没有值,则会取消表单操作提交。
为操作设置 "all_widgets_are_required": "true"
后,此操作将需要卡片中的所有微件。
在多选模式下设置 all_widgets_are_required
操作
JSON
{
"sections": [
{
"header": "Select contacts",
"widgets": [
{
"selectionInput": {
"type": "MULTI_SELECT",
"label": "Selected contacts",
"name": "contacts",
"multiSelectMaxSelectedItems": 3,
"multiSelectMinQueryLength": 1,
"onChangeAction": {
"all_widgets_are_required": true
},
"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
}
]
}
}
]
}
]
}
在 dateTimePicker 中设置 all_widgets_are_required
操作
JSON
{
"sections": [
{
"widgets": [
{
"textParagraph": {
"text": "A datetime picker widget with both date and time:"
}
},
{
"divider": {}
},
{
"dateTimePicker": {
"name": "date_time_picker_date_and_time",
"label": "meeting",
"type": "DATE_AND_TIME"
}
},
{
"textParagraph": {
"text": "A datetime picker widget with just date:"
}
},
{
"divider": {}
},
{
"dateTimePicker": {
"name": "date_time_picker_date_only",
"label": "Choose a date",
"type": "DATE_ONLY",
"onChangeAction":{
"all_widgets_are_required": true
}
}
},
{
"textParagraph": {
"text": "A datetime picker widget with just time:"
}
},
{
"divider": {}
},
{
"dateTimePicker": {
"name": "date_time_picker_time_only",
"label": "Select a time",
"type": "TIME_ONLY"
}
}
]
}
]
}
在下拉菜单中设置 all_widgets_are_required
操作
JSON
{
"sections": [
{
"header": "Section Header",
"collapsible": true,
"uncollapsibleWidgetsCount": 1,
"widgets": [
{
"selectionInput": {
"name": "location",
"label": "Select Color",
"type": "DROPDOWN",
"onChangeAction": {
"all_widgets_are_required": true
},
"items": [
{
"text": "Red",
"value": "red",
"selected": false
},
{
"text": "Green",
"value": "green",
"selected": false
},
{
"text": "White",
"value": "white",
"selected": false
},
{
"text": "Blue",
"value": "blue",
"selected": false
},
{
"text": "Black",
"value": "black",
"selected": false
}
]
}
}
]
}
]
}
为文本输入微件设置验证
在 textInput
微件的验证字段中,可以为此文本输入微件指定字符数限制和输入类型。
为文本输入微件设置字符数限制
JSON
{
"sections": [
{
"header": "Tell us about yourself",
"collapsible": true,
"uncollapsibleWidgetsCount": 2,
"widgets": [
{
"textInput": {
"name": "favoriteColor",
"label": "Favorite color",
"type": "SINGLE_LINE",
"validation": {"character_limit":15},
"onChangeAction":{
"all_widgets_are_required": true
}
}
}
]
}
]
}
设置文本输入 widget 的输入类型
JSON
{
"sections": [
{
"header": "Validate text inputs by input types",
"collapsible": true,
"uncollapsibleWidgetsCount": 2,
"widgets": [
{
"textInput": {
"name": "mailing_address",
"label": "Please enter a valid email address",
"type": "SINGLE_LINE",
"validation": {
"input_type": "EMAIL"
},
"onChangeAction": {
"all_widgets_are_required": true
}
}
},
{
"textInput": {
"name": "validate_integer",
"label": "Please enter a number",
"type": "SINGLE_LINE",
"validation": {
"input_type": "INTEGER"
}
}
},
{
"textInput": {
"name": "validate_float",
"label": "Please enter a number with a decimal",
"type": "SINGLE_LINE",
"validation": {
"input_type": "FLOAT"
}
}
}
]
}
]
}
问题排查
当 Google Chat 应用或卡片返回错误时,Chat 界面会显示“出了点问题”消息。或“无法处理您的请求”。有时,Chat 界面不显示任何错误消息,但 Chat 应用或卡片会产生意外结果;例如,卡片消息可能不会显示。
虽然 Chat 界面中可能不会显示错误消息,但当 Chat 应用的错误日志记录功能处于开启状态时,描述性错误消息和日志数据可帮助您修正错误。如需查看、调试和修正错误方面的帮助,请参阅排查和修正 Google Chat 错误。