本页介绍了如何向卡片添加 widget 和界面元素,以便用户可以与您的 Google Chat 应用互动,例如点击按钮或提交信息。
Chat 应用可以使用以下 Chat 接口构建交互式卡片:
当用户与卡片互动时,Chat 应用可以使用收到的数据进行处理并做出相应响应。如需了解详情,请参阅收集和处理 Google Chat 用户的信息。
使用卡片制作工具设计和预览 Chat 应用的消息和界面:
打开卡片制作工具前提条件
启用了交互功能的 Google Chat 应用。如需创建交互式 Chat 应用,请根据您要使用的应用架构完成以下任一快速入门:
- 使用 Google Cloud Functions 的 HTTP 服务
- Google Apps 脚本
- Google Cloud Dialogflow CX
- Google Cloud Pub/Sub
添加按钮
ButtonList
微件会显示一组按钮。按钮可以显示文本和/或图标。每个 Button
都支持在用户点击按钮时发生的 OnClick
操作。例如:
为了方便残障人士使用,按钮支持替代文本。
添加用于运行自定义函数的按钮
以下卡片由一个包含两个按钮的 ButtonList
微件组成。只需点击一个按钮,即可在新标签页中打开 Google Chat 开发者文档。另一个按钮会运行名为 goToView()
的自定义函数,并传递 viewType="BIRD EYE VIEW"
参数。
添加采用 Material Design 样式的按钮
以下显示了采用不同 Material Design 按钮样式的一组按钮。
如需应用 Material Design 样式,请勿添加“color”属性。
添加一个自定义颜色的按钮和一个已停用的按钮
您可以通过设置 "disabled": "true"
禁止用户点击按钮。
以下代码展示了一个卡片,其中包含一个带有两个按钮的 ButtonList
微件。其中一个按钮使用 Color
字段自定义该按钮的背景颜色。另一个按钮通过 Disabled
字段停用,以防止用户点击该按钮并执行函数。
添加带图标的按钮
以下代码显示了一张卡片,该卡片由一个 ButtonList
widget 和两个图标 Button
widget 组成。一个按钮使用 knownIcon
字段来显示 Google Chat 的内置电子邮件图标。另一个按钮使用 iconUrl
字段来显示自定义图标微件。
添加带有图标和文本的按钮
以下代码会显示一个卡片,其中包含一个 ButtonList
微件,用于提示用户发送电子邮件。第一个按钮显示电子邮件图标,第二个按钮显示文本。用户可以点击图标或文本按钮来运行 sendEmail
函数。
为可收起的部分自定义按钮
自定义用于收起和展开卡片中各个部分的控件按钮。从一系列图标或图片中进行选择,以直观地表示该部分的内容,让用户更轻松地理解和与信息互动。
添加菜单
Overflow menu
可用于 Chat 卡片,以提供其他选项和操作。借助此功能,您可以添加更多选项,而不会杂乱卡片的界面,从而确保设计整洁有序。
添加条状标签列表
ChipList
widget 提供了一种功能多样且具有视觉吸引力的信息显示方式。使用条状标签列表来表示标签、类别或其他相关数据,让用户更轻松地浏览和与您的内容互动。
收集用户信息
本部分介绍了如何添加用于收集信息(例如文本或选择)的微件。
如需了解如何处理用户输入的内容,请参阅收集和处理 Google Chat 用户的信息。
收集文本
TextInput
widget 提供了一个字段,用户可以在其中输入文本。该 widget 支持建议(可帮助用户输入统一的数据)和更改时执行的操作(即在文本输入字段发生更改时运行的 Actions
,例如用户添加或删除文本)。
当您需要从用户收集抽象数据或未知数据时,请使用此 TextInput
微件。如需从用户那里收集定义的数据,请改用 SelectionInput
widget。
以下是一个由 TextInput
微件组成的卡片:
收集日期或时间
借助 DateTimePicker
微件,用户可以输入日期、时间或日期和时间。或者,用户也可以使用选择器来选择日期和时间。如果用户输入的日期或时间无效,选择器会显示错误消息,提示用户正确输入信息。
下图显示了一张卡片,由三种不同类型的 DateTimePicker
widget 组成:
让用户选择内容
SelectionInput
微件提供了一组可选择的项,例如复选框、单选按钮、开关或下拉菜单。您可以使用此 widget 从用户收集已定义且标准化的数据。如需从用户收集未定义的数据,请改用 TextInput
widget。
SelectionInput
微件支持建议(有助于用户输入统一的数据)和更改时执行的操作(即在选择输入字段发生更改时运行的 Actions
,例如用户选择或取消选择某个项)。
Chat 应用可以接收和处理所选项的值。如需详细了解如何使用表单输入,请参阅处理用户输入的信息。
本部分提供了使用 SelectionInput
微件的卡片示例。这些示例使用了不同类型的版块输入:
添加复选框
以下代码会显示一个卡片,其中使用使用复选框的 SelectionInput
微件,要求用户指定联系人是专业联系人、个人联系人还是两者兼有:
添加单选按钮
以下代码会显示一个卡片,其中使用使用单选按钮的 SelectionInput
微件,要求用户指定联系人是专业还是个人:
添加开关
以下代码会显示一个卡片,其中使用使用开关的 SelectionInput
微件,要求用户指定联系人是专业联系人、个人联系人还是两者兼有:
添加下拉菜单
以下代码会显示一个卡片,其中使用使用下拉菜单的 SelectionInput
微件,要求用户指定联系人是专业还是个人:
添加多选菜单
以下代码会显示一个卡片,要求用户从多选菜单中选择联系人:
您可以从 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 中的数据。例如,您可以验证文本输入字段是否包含用户输入的文本,或者其中包含特定数量的字符。
为操作设置所需的 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 错误。