En esta guía, se describe cómo las apps de Google Chat pueden recopilar y procesar información de los usuarios creando entradas de formulario en interfaces basadas en tarjetas.
Las apps de Chat solicitan información a los usuarios para realizar acciones dentro o fuera de Chat, incluidas las siguientes:
- Establece la configuración. Por ejemplo, para permitir que los usuarios personalicen la configuración de notificaciones o configuren y agreguen la app de Chat a uno o más espacios.
- Crear o actualizar información en otras aplicaciones de Google Workspace Por ejemplo, permite que los usuarios creen un evento de Calendario de Google.
- Permitir que los usuarios accedan a recursos en otras apps o servicios web, y los actualicen Por ejemplo, una app de Chat puede ayudar a los usuarios a actualizar el estado de un ticket de asistencia directamente desde un espacio de Chat.
Requisitos previos
HTTP
Una app de Google Chat que recibe interacciones de los usuarios y responde a ellas Para compilar una, completa la guía de inicio rápido de HTTP.
Apps Script
Una app de Google Chat que recibe interacciones de los usuarios y responde a ellas Para compilar uno, completa la guía de inicio rápido de Apps Script.
Crea formularios con tarjetas
Para recopilar información, las apps de Chat diseñan formularios y sus entradas, y los incorporan en tarjetas. Para mostrar tarjetas a los usuarios, las apps de Chat pueden usar las siguientes interfaces de Chat:
- Mensajes que contienen una o más tarjetas
- Páginas principales, que es una tarjeta que aparece en la pestaña Página principal en los mensajes directos con la app de Chat.
- Diálogos, que son tarjetas que se abren en una ventana nueva desde mensajes y páginas principales
Las apps de Chat pueden compilar las tarjetas con los siguientes widgets:
Widgets de entrada de formularios que solicitan información a los usuarios De manera opcional, puedes agregar validación a los widgets de entrada de formularios para asegurarte de que los usuarios ingresen y den formato a la información correctamente. Las apps de Chat pueden usar los siguientes widgets de entrada de formulario:
- Entradas de texto
(
textInput) para texto de formato libre o sugerido. - Las entradas de selección (
selectionInput) son elementos de la IU que se pueden seleccionar, como casillas de verificación, botones de selección y menús desplegables. Los widgets de entrada de selección también pueden completar y sugerir elementos de los datos de Google Workspace (como un espacio de Chat) o una fuente de datos dinámica. Para obtener más detalles, consulta las siguientes secciones: Cómo agregar un menú desplegable y Cómo agregar un menú de selección múltiple. - Selectores de fecha y hora
(
dateTimePicker) para las entradas de fecha y hora
- Entradas de texto
(
Un widget de botón para que los usuarios puedan enviar los valores que ingresaron en la tarjeta Después de que un usuario hace clic en el botón, la app de Chat puede procesar la información que recibe.
En el siguiente ejemplo, una tarjeta recopila información de contacto con una entrada de texto, un selector de fecha y hora, y una entrada de selección:
Para ver más ejemplos de widgets interactivos que puedes usar para recopilar información, consulta Diseña una tarjeta o un diálogo interactivo.
Cómo agregar un menú desplegable
Para personalizar los elementos de selección o permitir que los usuarios seleccionen un solo elemento de una fuente de datos dinámica, las apps de Chat pueden usar menús desplegables, que son un tipo de widget SelectionInput. Por ejemplo, la siguiente tarjeta muestra un
menú desplegable en el que los usuarios pueden seleccionar de forma dinámica de una lista de contactos:
Puedes propagar elementos para un menú desplegable desde las siguientes fuentes de datos:
- Datos de Google Workspace, que incluyen usuarios o espacios de Chat
- Fuentes de datos externas, como una base de datos relacional
Cómo propagar elementos desde una fuente de datos de Google Workspace
Para propagar elementos de fuentes de datos de Google Workspace, como
usuarios de Google Workspace, especifica el campo platformDataSource dentro de un
objeto
DataSourceConfig. A diferencia de otros tipos de entradas de selección, omites los objetos SelectionItem, ya que estos elementos de selección se obtienen de forma dinámica de Google Workspace.
En el siguiente código, se muestra un menú desplegable de usuarios de Google Workspace:
JSON
{
"sections": [
{
"header": "Section Header",
"widgets": [
{
"selectionInput": {
"name": "contacts",
"type": "DROPDOWN",
"label": "Select contact from organization",
"dataSourceConfigs": [
{
"platformDataSource": {
"commonDataSource": "USER"
},
"minCharactersTrigger": 1
}
]
}
}
]
}
]
}
Propaga elementos desde una fuente de datos externa
Los menús desplegables también pueden propagar elementos de una fuente de datos externa o de terceros. Para usar una fuente de datos externa, especifica el campo remoteDataSource dentro de un objeto DataSourceConfig que contenga la función que consulta y devuelve elementos de la fuente de datos.
Para reducir las solicitudes a una fuente de datos externa, puedes incluir
elementos sugeridos que aparezcan en el menú desplegable antes de que los usuarios escriban en
el menú. Para propagar elementos sugeridos de una fuente de datos externa, especifica objetos SelectionItem estáticos.
En el siguiente código, se muestra un menú desplegable que consulta y propaga elementos de una fuente de datos externa:
JSON
{
"sections": [
{
"header": "Section Header",
"widgets": [
{
"selectionInput": {
"name": "crm_leads",
"type": "DROPDOWN",
"label": "Select CRM Lead",
"dataSourceConfigs": [
{
"remoteDataSource": {
"function": "getCrmLeads"
},
"minCharactersTrigger": 2
}
],
"items": [
{
"text": "Suggested Lead 1",
"value": "lead-1"
}
]
}
}
]
}
]
}
Para ver un ejemplo completo que muestra cómo devolver elementos sugeridos, consulta la sección Cómo sugerir elementos de selección.
Cómo agregar un menú de selección múltiple
Para personalizar los elementos de selección o permitir que los usuarios seleccionen elementos de una fuente de datos dinámica, las apps de Chat pueden usar menús de selección múltiple, que son un tipo de widget de SelectionInput. Por ejemplo, la siguiente tarjeta muestra un menú de selección múltiple en el que los usuarios pueden seleccionar de forma dinámica de una lista de contactos:
Puedes propagar elementos para un menú de selección múltiple desde las siguientes fuentes de datos:
- Datos de Google Workspace, que incluyen usuarios o espacios de Chat de los que el usuario es miembro. En el menú, solo se completan los elementos de la misma organización de Google Workspace.
- Fuentes de datos externas, como una base de datos relacional Por ejemplo, puedes usar menús de selección múltiple para ayudar a un usuario a seleccionar de una lista de leads comerciales de un sistema de administración de relaciones con clientes (CRM).
Cómo propagar elementos desde una fuente de datos de Google Workspace
Para usar fuentes de datos de Google Workspace, especifica el campo
platformDataSource
en el widget SelectionInput. A diferencia de otros tipos de entradas de selección, omites los objetos SelectionItem, ya que estos elementos de selección se obtienen de forma dinámica de Google Workspace.
En el siguiente código, se muestra un menú de selección múltiple de usuarios de Google Workspace.
Para propagar usuarios, la entrada de selección establece commonDataSource en USER:
JSON
{
"selectionInput": {
"name": "contacts",
"type": "MULTI_SELECT",
"label": "Selected contacts",
"multiSelectMaxSelectedItems": 5,
"multiSelectMinQueryLength": 1,
"platformDataSource": {
"commonDataSource": "USER"
}
}
}
En el siguiente código, se muestra un menú de selección múltiple de espacios de Chat. Para propagar espacios, la entrada de selección especifica el campo hostAppDataSource. El menú de selección múltiple también establece defaultToCurrentSpace en true, lo que hace que el espacio actual sea la selección predeterminada en el menú:
JSON
{
"selectionInput": {
"name": "spaces",
"type": "MULTI_SELECT",
"label": "Selected contacts",
"multiSelectMaxSelectedItems": 3,
"multiSelectMinQueryLength": 1,
"platformDataSource": {
"hostAppDataSource": {
"chatDataSource": {
"spaceDataSource": {
"defaultToCurrentSpace": true
}
}
}
}
}
}
Propaga elementos desde una fuente de datos externa
Los menús de selección múltiple también pueden propagar elementos de una fuente de datos externa o de terceros. Para usar una fuente de datos externa, especifica el campo
externalDataSource
en el widget SelectionInput que contiene la función que consulta
y devuelve elementos de la fuente de datos.
Para reducir las solicitudes a una fuente de datos externa, puedes incluir
elementos sugeridos que aparecen en el menú de selección múltiple antes de que los usuarios escriban en
el menú. Por ejemplo, puedes propagar los contactos que el usuario buscó recientemente. Para propagar elementos sugeridos de una fuente de datos externa, especifica objetos SelectionItem estáticos.
En la siguiente muestra de código, se indica un menú de selección múltiple que consulta y propaga elementos de una fuente de datos externa:
Node.js
Reemplaza FUNCTION_URL por el extremo HTTP que consulta
la fuente de datos externa.
Python
Reemplaza FUNCTION_URL por el extremo HTTP que consulta
la fuente de datos externa.
Java
Reemplaza FUNCTION_URL por el extremo HTTP que consulta
la fuente de datos externa.
Apps Script
En este ejemplo, se envía un mensaje de tarjeta con la devolución del JSON de la tarjeta. También puedes usar el servicio de tarjetas de Apps Script.
Para ver un ejemplo completo que muestra cómo devolver elementos sugeridos, consulta la sección Cómo sugerir elementos de selección.
Cómo recibir datos de widgets interactivos
Cada vez que los usuarios hacen clic en un botón, se activa su acción de la app de Chat con información sobre la interacción. En el campo
commonEventObject
de la carga útil del evento, el objeto formInputs contiene los valores que ingresa el
usuario.
Puedes recuperar los valores del objeto
event.commonEventObject.formInputs.WIDGET_NAME, en el que
WIDGET_NAME es el campo name que especificaste para el widget.
Los valores se devuelven como un tipo de datos específico para el widget.
A continuación, se muestra una parte de un objeto de evento en el que un usuario ingresó valores para cada widget:
{
"commonEventObject": { "formInputs": {
"contactName": { "stringInputs": {
"value": ["Kai 0"]
}},
"contactBirthdate": { "dateInput": {
"msSinceEpoch": 1000425600000
}},
"contactType": { "stringInputs": {
"value": ["Personal"]
}}
}}
}
Para recibir los datos, tu app de Chat controla el objeto de evento para obtener los valores que los usuarios ingresan en los widgets. En la siguiente tabla, se muestra cómo obtener el valor de un widget de entrada de formulario determinado. Para cada widget, la tabla muestra el tipo de datos que acepta el widget, dónde se almacena el valor en el objeto de evento y un valor de ejemplo.
| Widget de entrada de formulario | Tipo de datos de entrada | Es el valor de entrada del objeto de evento. | Valor de ejemplo |
|---|---|---|---|
textInput |
stringInputs |
event.commonEventObject.formInputs.contactName.stringInputs.value[0] |
Kai O |
selectionInput |
stringInputs |
Para obtener el primer o único valor, event.commonEventObject.formInputs.contactType.stringInputs.value[0] |
Personal |
dateTimePicker que solo acepta fechas. |
dateInput |
event.commonEventObject.formInputs.contactBirthdate.dateInput.msSinceEpoch. |
1000425600000 |
Después de que la app de Chat recibe datos, puede realizar cualquiera de las siguientes acciones:
- En el caso de las tarjetas que contienen un menú de selección múltiple, completa o sugiere elementos según lo que el usuario escriba en el menú.
- Transfiere los datos a otra tarjeta para que el usuario pueda revisar su información o continuar con la siguiente sección del formulario.
- Respóndele al usuario para confirmar que completó el formulario correctamente.
Sugerir elementos de selección
Si una tarjeta contiene un menú de selección múltiple o un menú desplegable que
propaga elementos de una fuente de datos externa,
la app de Chat puede devolver elementos sugeridos en función de lo que
los usuarios escriban en el menú. Por ejemplo, si un usuario comienza a escribir Atl en un menú
que completa ciudades de Estados Unidos, tu
app de Chat puede sugerir automáticamente Atlanta antes de que el usuario
termine de escribir. La app de Chat puede sugerir hasta 100 elementos.
Para sugerir y propagar elementos de forma dinámica en una entrada de selección, el widget SelectionInput de la tarjeta debe especificar una función que consulte la fuente de datos externa. Para los menús de selección múltiple, debes especificar el campo externalDataSource. Para los menús desplegables, debes especificar el campo remoteDataSource dentro de un objeto DataSourceConfig.
También puedes configurar la cantidad de caracteres que un usuario escribe antes de que
el menú devuelva sugerencias. En el caso de los menús de selección múltiple, configura el campo multiSelectMinQueryLength. Para los menús desplegables, configura el campo min_characters_trigger dentro de DataSourceConfig.
Para devolver los elementos sugeridos, la función debe hacer lo siguiente:
- Controlar un objeto de evento, que la app de Chat recibe cuando los usuarios escriben en el menú
- En el objeto de evento, obtén el valor que escribe el usuario, que se representa en el campo
event.commonEventObject.parameters["autocomplete_widget_query"]. - Consulta la fuente de datos con el valor de entrada del usuario para obtener uno o más objetos
SelectionItemsque se le sugerirán al usuario. - Devuelve los elementos sugeridos con la acción
RenderActionscon un objetomodifyCard.
En la siguiente muestra de código, se indica cómo una app de Chat
sugiere elementos de forma dinámica en el menú de selección múltiple de una tarjeta. Cuando un usuario escribe
en el menú, la función o el extremo proporcionados en el campo
externalDataSource del widget consulta una fuente de datos externa y sugiere elementos
que el usuario puede seleccionar.
Node.js
Reemplaza FUNCTION_URL por el extremo HTTP que consulta
la fuente de datos externa.
Python
Reemplaza FUNCTION_URL por el extremo HTTP que consulta
la fuente de datos externa.
Java
Reemplaza FUNCTION_URL por el extremo HTTP que consulta
la fuente de datos externa.
Apps Script
En este ejemplo, se envía un mensaje de tarjeta con la devolución del JSON de la tarjeta. También puedes usar el servicio de tarjetas de Apps Script.
Transfiere datos a otra tarjeta
Después de que un usuario envíe información de una tarjeta, es posible que debas devolver tarjetas adicionales para realizar cualquiera de las siguientes acciones:
- Ayuda a los usuarios a completar formularios más largos creando secciones distintas.
- Permite que los usuarios obtengan una vista previa de la información de la tarjeta inicial y la confirmen para que puedan revisar sus respuestas antes de enviarlas.
- Completa de forma dinámica las partes restantes del formulario. Por ejemplo, para pedirles a los usuarios que creen una cita, una app de Chat podría mostrar una tarjeta inicial en la que se solicite el motivo de la cita y, luego, completar otra tarjeta en la que se proporcionen los horarios disponibles según el tipo de cita.
Para transferir la entrada de datos de la tarjeta inicial, puedes compilar el widget button con actionParameters que contengan el name del widget y el valor que ingresa el usuario, como se muestra en el siguiente ejemplo:
Node.js
Reemplaza FUNCTION_URL por el extremo HTTP que controla
los clics en el botón.
Python
Reemplaza FUNCTION_URL por el extremo HTTP que controla
los clics en el botón.
Java
Reemplaza FUNCTION_URL por el extremo HTTP que controla
los clics en el botón.
Apps Script
En este ejemplo, se envía un mensaje de tarjeta con la devolución del JSON de la tarjeta. También puedes usar el servicio de tarjetas de Apps Script.
Cuando un usuario hace clic en el botón, tu app de Chat recibe un objeto de evento del que puedes recibir datos.
Cómo responder un envío de formulario
Después de recibir los datos de un mensaje de tarjeta o un diálogo, la app de Chat responde confirmando la recepción o devolviendo un error.
En el siguiente ejemplo, una app de Chat envía un mensaje de texto para confirmar que recibió correctamente un formulario enviado desde un mensaje de tarjeta.
Node.js
Python
Java
Apps Script
En este ejemplo, se envía un mensaje de tarjeta con la devolución del JSON de la tarjeta. También puedes usar el servicio de tarjetas de Apps Script.
Para procesar y cerrar un diálogo, debes devolver un objeto RenderActions que especifique si deseas enviar un mensaje de confirmación, actualizar el mensaje o la tarjeta original, o simplemente cerrar el diálogo. Para conocer los pasos, consulta
Cómo cerrar un diálogo.
Solucionar problemas
En esta sección, se proporcionan pasos para solucionar problemas relacionados con códigos de error y comportamientos de entorno de ejecución específicos cuando se interactúa con diálogos en Chat.
Las interacciones de diálogo devuelven el mensaje "Error no especificado al invocar el complemento"
Cuando interactúas con un diálogo, si ves registros de errores con el mensaje "Error no especificado al invocar el complemento" y el código 13, por lo general, indica un error interno o que el extremo HTTP de la app de Chat no pudo procesar la solicitud o devolver una respuesta válida.
Para solucionar este error, haz lo siguiente:
- Revisa los registros de tu extremo HTTP para ver si hay excepciones no controladas o fallas.
- Verifica que tu extremo responda a las solicitudes en un plazo de 30 segundos. Si el extremo tarda más de 30 segundos en ejecutarse, Chat no puede procesar la respuesta y la interacción falla. Para obtener más detalles, consulta Límites de frecuencia y prácticas recomendadas.
- Asegúrate de que tu extremo devuelva una respuesta válida. Para los envíos de diálogos,
el extremo debe devolver un objeto
RenderActionsen el formato JSON correcto. Si la respuesta tiene un formato incorrecto o no contiene los campos obligatorios, es posible que falle la interacción del diálogo.
Cuando una app de Google Chat o una tarjeta devuelven un error, la interfaz de Chat muestra el mensaje "Se produjo un error". o "No se puede procesar tu solicitud". A veces, la IU de Chat no muestra ningún mensaje de error, pero la app o tarjeta de Chat produce un resultado inesperado; por ejemplo, es posible que no aparezca un mensaje de tarjeta.
Aunque es posible que no se muestre un mensaje de error en la IU de Chat, hay mensajes de error descriptivos y datos de registro disponibles para ayudarte a corregir errores cuando se activa el registro de errores para las apps de Chat. Para obtener ayuda con la visualización, la depuración y la corrección de errores, consulta Cómo solucionar y corregir errores de Google Chat.
Temas relacionados
- Consulta el ejemplo de Contact Manager, que es una app de Chat que solicita a los usuarios que completen un formulario de contacto desde mensajes de tarjeta y diálogos.
- Cómo abrir diálogos interactivos
Apps de Chat que no son complementos: Lee los datos de formularios que ingresan los usuarios en las tarjetas
La siguiente documentación se aplica a las apps de Chat que no son complementos de Google Workspace. Para migrar una app de Chat que no sea un complemento, consulta Cómo convertir una app de Google Chat en un complemento de Google Workspace.
Crea formularios con tarjetas
Para ver un ejemplo de una app de Chat que no es un complemento y que usa un formulario de contacto con una entrada de texto, un selector de fecha y hora, y una entrada de selección, consulta el siguiente código:
Node.js
Python
Java
Apps Script
Cómo recibir datos de widgets interactivos
Cada vez que los usuarios hacen clic en un botón, las apps de Chat que no son complementos reciben un evento de interacción que depende de la ubicación del botón:
Si el botón está en un mensaje o diálogo, las apps de Chat que no son complementos reciben un evento de interacción
CARD_CLICKEDque contiene información sobre la interacción. La carga útil de los eventos de interacciónCARD_CLICKEDcontiene un objetocommon.formInputs(event.common.formInputs) con los valores que ingresa el usuario.Puedes recuperar los valores del objeto
common.formInputs.WIDGET_NAME, en el que WIDGET_NAME es el camponameque especificaste para el widget. Los valores se devuelven como un tipo de datos específico para el widget (representado como un objetoInputs).A continuación, se muestra una parte de un evento de interacción de
CARD_CLICKEDen el que un usuario ingresó valores para cada widget:HTTP
{ "type": "CARD_CLICKED", "common": { "formInputs": { "contactName": { "stringInputs": { "value": ["Kai 0"] }}, "contactBirthdate": { "dateInput": { "msSinceEpoch": 1000425600000 }}, "contactType": { "stringInputs": { "value": ["Personal"] }} }} }Apps Script
{ "type": "CARD_CLICKED", "common": { "formInputs": { "contactName": { "": { "stringInputs": { "value": ["Kai 0"] }}}, "contactBirthdate": { "": { "dateInput": { "msSinceEpoch": 1000425600000 }}}, "contactType": { "": { "stringInputs": { "value": ["Personal"] }}} }} }Si el botón está en una página principal, las apps de Chat que no son complementos reciben un evento de interacción
SUBMIT_FORM. La carga útil del evento de interacción contiene un objetocommonEventObject.formInputs(event.commonEventObject.formInputs) con los valores que ingresa el usuario.Puedes recuperar los valores del objeto
commonEventObject.formInputs.WIDGET_NAME, en el que WIDGET_NAME es el camponameque especificaste para el widget. Los valores se devuelven como un tipo de datos específico para el widget (representado como un objetoInputs).A continuación, se muestra una parte de un evento de interacción de
SUBMIT_FORMen el que un usuario ingresó valores para cada widget:HTTP
{ "type": "SUBMIT_FORM", "commonEventObject": { "formInputs": { "contactName": { "stringInputs": { "value": ["Kai 0"] }}, "contactBirthdate": { "dateInput": { "msSinceEpoch": 1000425600000 }}, "contactType": { "stringInputs": { "value": ["Personal"] }} }} }Apps Script
{ "type": "SUBMIT_FORM", "commonEventObject": { "formInputs": { "contactName": { "": { "stringInputs": { "value": ["Kai 0"] }}}, "contactBirthdate": { "": { "dateInput": { "msSinceEpoch": 1000425600000 }}}, "contactType": { "": { "stringInputs": { "value": ["Personal"] }}} }} }
Para recibir los datos, una app de Chat que no sea un complemento controla el evento de interacción para obtener los valores que los usuarios ingresan en los widgets. En la siguiente tabla, se muestra cómo obtener el valor de un widget de entrada de formulario determinado. Para cada widget, la tabla muestra el tipo de datos que acepta el widget, dónde se almacena el valor en el evento de interacción y un valor de ejemplo.
| Widget de entrada de formulario | Tipo de datos de entrada | Es el valor de entrada del evento de interacción. | Valor de ejemplo |
|---|---|---|---|
textInput |
stringInputs |
event.common.formInputs.contactName.stringInputs.value[0] |
Kai O |
selectionInput |
stringInputs |
Para obtener el primer o único valor, event.common.formInputs.contactType.stringInputs.value[0] |
Personal |
dateTimePicker que solo acepta fechas. |
dateInput |
event.common.formInputs.contactBirthdate.dateInput.msSinceEpoch. |
1000425600000 |
Transfiere datos a otra tarjeta
Para transferir la entrada de datos de la tarjeta inicial en una app de Chat que no sea un complemento, compila el widget button con actionParameters que contengan el name del widget y el valor que ingresa el usuario, como se muestra en el siguiente ejemplo:
Node.js
Python
Java
Apps Script
Cuando un usuario hace clic en el botón, la app de Chat que no es un complemento recibe un evento de interacción CARD_CLICKED del que puedes recibir datos.
Cómo responder un envío de formulario
En el siguiente ejemplo, una app de Chat que no es un complemento envía un mensaje de texto para confirmar que recibió correctamente un formulario enviado desde un mensaje de diálogo o de tarjeta:
Node.js
Python
Java
Apps Script
Para procesar y cerrar un diálogo en una app de Chat que no sea un complemento, devuelve un objeto ActionResponse que especifique si quieres enviar un mensaje de confirmación, actualizar el mensaje o la tarjeta original, o simplemente cerrar el diálogo. Para conocer los pasos, consulta
Cómo cerrar un diálogo.