Este guia descreve como os apps do Google Chat podem coletar e processar informações dos usuários criando entradas de formulário em interfaces baseadas em cards.
Os apps de chat solicitam informações dos usuários para realizar ações dentro ou fora do Chat, incluindo as seguintes maneiras:
- Defina as configurações. Por exemplo, para permitir que os usuários personalizem as configurações de notificação ou configurem e adicionem o app do Chat a um ou mais espaços.
- Criar ou atualizar informações em outros aplicativos do Google Workspace. Por exemplo, permitir que os usuários criem um evento do Google Agenda.
- Permitir que os usuários acessem e atualizem recursos em outros apps ou serviços da Web. Por exemplo, um app do Chat pode ajudar os usuários a atualizar o status de um tíquete de suporte diretamente em um espaço do Chat.
Pré-requisitos
HTTP
Um app do Google Chat que recebe e responde a interações do usuário. Para criar um, conclua o guia de início rápido de HTTP.
Apps Script
Um app do Google Chat que recebe e responde a interações do usuário. Para criar um, conclua o guia de início rápido do Apps Script.
Criar formulários usando cards
Para coletar informações, os apps do Chat criam formulários e as entradas deles e os incorporam em cards. Para mostrar cards aos usuários, os apps do Chat podem usar as seguintes interfaces:
- Mensagens que contêm um ou mais cards.
- Páginas iniciais, que são cards que aparecem na guia Início em mensagens diretas com o app do Chat.
- Caixas de diálogo, que são cards abertos em uma nova janela de mensagens e páginas iniciais.
Os apps do Chat podem criar os cards usando os seguintes widgets:
Widgets de entrada de formulário que solicitam informações dos usuários. Se quiser, adicione validação aos widgets de entrada de formulário para garantir que os usuários insiram e formatem as informações corretamente. Os apps do Chat podem usar os seguintes widgets de entrada de formulário:
- Entradas de texto
(
textInput) para formato livre ou texto sugerido. - As entradas de seleção
(
selectionInput) são elementos da interface selecionáveis, como caixas de seleção, botões de opção e menus suspensos. Os widgets de entrada de seleção também podem preencher e sugerir itens de dados do Google Workspace (como um espaço do Chat) ou de uma fonte de dados dinâmica. Para mais detalhes, consulte as seções Adicionar um menu suspenso e Adicionar um menu de seleção múltipla. - Seletores de data e hora
(
dateTimePicker) para entradas de data e hora.
- Entradas de texto
(
Um widget de botão para que os usuários possam enviar os valores inseridos no card. Depois que o usuário clica no botão, o app do Chat pode processar as informações recebidas.
No exemplo a seguir, um card coleta dados de contato usando uma entrada de texto, um seletor de data e hora e uma entrada de seleção:
Para mais exemplos de widgets interativos que podem ser usados para coletar informações, consulte Criar um card ou uma caixa de diálogo interativa.
Adicionar um menu suspenso
Para personalizar itens de seleção ou permitir que os usuários selecionem um único item de uma fonte de dados dinâmica, os apps do Chat podem usar menus suspensos, que são um tipo de widget SelectionInput. Por exemplo, o card a seguir mostra um
menu suspenso em que os usuários podem selecionar dinamicamente em uma lista de contatos:
É possível preencher itens para um menu suspenso usando as seguintes fontes de dados:
- Dados do Google Workspace, que incluem usuários ou espaços do Chat.
- Fontes de dados externas, como um banco de dados relacional.
Preencher itens de uma fonte de dados do Google Workspace
Para preencher itens de fontes de dados do Google Workspace, como
usuários do Google Workspace, especifique o campo platformDataSource em um
objeto
DataSourceConfig. Ao contrário de outros tipos de entrada de seleção, você
omite
objetos
SelectionItem, porque esses itens de seleção são originados dinamicamente do
Google Workspace.
O código a seguir mostra um menu suspenso de usuários do Google Workspace:
JSON
{
"sections": [
{
"header": "Section Header",
"widgets": [
{
"selectionInput": {
"name": "contacts",
"type": "DROPDOWN",
"label": "Select contact from organization",
"dataSourceConfigs": [
{
"platformDataSource": {
"commonDataSource": "USER"
},
"minCharactersTrigger": 1
}
]
}
}
]
}
]
}
Preencher itens de uma fonte de dados externa
Os menus suspensos também podem preencher itens de uma fonte de dados externa ou de terceiros. Para usar uma fonte de dados externa, especifique o campo remoteDataSource em um objeto DataSourceConfig que contém a função que consulta e retorna itens da fonte de dados.
Para reduzir as solicitações para uma fonte de dados externa, inclua
itens sugeridos que aparecem no menu suspenso antes que os usuários digitem
no menu. Para preencher itens sugeridos de uma fonte de dados externa, especifique objetos
SelectionItem
estáticos.
O código a seguir mostra um menu suspenso que consulta e preenche itens de uma fonte de dados 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 um exemplo completo que mostra como retornar itens sugeridos, consulte a seção Sugerir itens de seleção.
Adicionar um menu de seleção múltipla
Para personalizar itens de seleção ou permitir que os usuários selecionem itens de uma fonte de dados dinâmica, os apps do Chat podem usar menus de seleção múltipla, que são um tipo de widget SelectionInput. Por exemplo, o card a seguir mostra um menu de seleção múltipla em que os usuários podem selecionar dinamicamente em uma lista de contatos:
É possível preencher itens para um menu de seleção múltipla usando as seguintes fontes de dados:
- Dados do Google Workspace, que incluem usuários ou espaços do Chat de que o usuário é membro. O menu só preenche itens da mesma organização do Google Workspace.
- Fontes de dados externas, como um banco de dados relacional. Por exemplo, você pode usar menus de seleção múltipla para ajudar um usuário a selecionar em uma lista de leads de vendas de um sistema de gestão de relacionamento com o cliente (CRM).
Preencher itens de uma fonte de dados do Google Workspace
Para usar fontes de dados do Google Workspace, especifique o campo
platformDataSource
no widget SelectionInput. Ao contrário de outros tipos de entrada de seleção, você
omite
objetos
SelectionItem, porque esses itens de seleção são originados dinamicamente do
Google Workspace.
O código a seguir mostra um menu de seleção múltipla de usuários do Google Workspace.
Para preencher os usuários, a entrada de seleção define commonDataSource como USER:
JSON
{
"selectionInput": {
"name": "contacts",
"type": "MULTI_SELECT",
"label": "Selected contacts",
"multiSelectMaxSelectedItems": 5,
"multiSelectMinQueryLength": 1,
"platformDataSource": {
"commonDataSource": "USER"
}
}
}
O código a seguir mostra um menu de seleção múltipla de espaços do Chat. Para preencher os espaços, a entrada de seleção especifica o campo hostAppDataSource. O menu de seleção múltipla também define
defaultToCurrentSpace como true, o que torna o espaço atual a seleção
padrão no menu:
JSON
{
"selectionInput": {
"name": "spaces",
"type": "MULTI_SELECT",
"label": "Selected contacts",
"multiSelectMaxSelectedItems": 3,
"multiSelectMinQueryLength": 1,
"platformDataSource": {
"hostAppDataSource": {
"chatDataSource": {
"spaceDataSource": {
"defaultToCurrentSpace": true
}
}
}
}
}
}
Preencher itens de uma fonte de dados externa
Os menus de seleção múltipla também podem preencher itens de uma fonte de dados externa ou de terceiros. Para usar uma fonte de dados externa, especifique o campo externalDataSource no widget SelectionInput que contém a função que consulta e retorna itens da fonte de dados.
Para reduzir as solicitações para uma fonte de dados externa, inclua
itens sugeridos que aparecem no menu de seleção múltipla antes que os usuários digitem
no menu. Por exemplo, é possível preencher os contatos pesquisados recentemente para o
usuário. Para preencher itens sugeridos de uma fonte de dados externa, especifique objetos
SelectionItem
estáticos.
O exemplo de código a seguir mostra um menu de seleção múltipla que consulta e preenche itens de uma fonte de dados externa:
Node.js
Substitua FUNCTION_URL pelo endpoint HTTP que consulta
a fonte de dados externa.
Python
Substitua FUNCTION_URL pelo endpoint HTTP que consulta
a fonte de dados externa.
Java
Substitua FUNCTION_URL pelo endpoint HTTP que consulta
a fonte de dados externa.
Apps Script
Este exemplo envia uma mensagem de card retornando o JSON do card. Também é possível usar o serviço de cards do Apps Script.
Para ver um exemplo completo que mostra como retornar itens sugeridos, consulte a seção Sugerir itens de seleção.
Receber dados de widgets interativos
Sempre que os usuários clicam em um botão, a
ação
do app do Chat é acionada com informações sobre a interação. No
commonEventObject
do payload do evento, o objeto formInputs contém todos os valores inseridos pelo
usuário.
É possível recuperar os valores do objeto
event.commonEventObject.formInputs.WIDGET_NAME, em que
WIDGET_NAME é o campo name que você especificou para o widget.
Os valores são retornados como um tipo de dados específico para o widget.
Veja a seguir uma parte de um objeto de evento em que um usuário inseriu valores para cada widget:
{
"commonEventObject": { "formInputs": {
"contactName": { "stringInputs": {
"value": ["Kai 0"]
}},
"contactBirthdate": { "dateInput": {
"msSinceEpoch": 1000425600000
}},
"contactType": { "stringInputs": {
"value": ["Personal"]
}}
}}
}
Para receber os dados, o app do Chat processa o objeto de evento para receber os valores que os usuários inserem nos widgets. A tabela a seguir mostra como receber o valor de um determinado widget de entrada de formulário. Para cada widget, a tabela mostra o tipo de dados que o widget aceita, onde o valor é armazenado no objeto de evento e um exemplo de valor.
| Widget de entrada de formulário | Tipo de dados de entrada | Valor de entrada do objeto de evento | Valor de exemplo |
|---|---|---|---|
textInput |
stringInputs |
event.commonEventObject.formInputs.contactName.stringInputs.value[0] |
Kai O |
selectionInput |
stringInputs |
Para receber o primeiro ou único valor, event.commonEventObject.formInputs.contactType.stringInputs.value[0] |
Personal |
dateTimePicker que aceita apenas datas. |
dateInput |
event.commonEventObject.formInputs.contactBirthdate.dateInput.msSinceEpoch. |
1000425600000 |
Depois que o app do Chat recebe os dados, ele pode fazer o seguinte:
- Para cards que contêm um menu de seleção múltipla, preencha ou sugira itens com base no que o usuário digita no menu.
- Transfira os dados para outro card, para que o usuário possa revisar as informações ou continuar para a próxima seção do formulário.
- Responda ao usuário para confirmar que ele preencheu o formulário.
Sugerir itens de seleção
Se um card tiver um menu de seleção múltipla ou um menu suspenso que
preenche itens de uma fonte de dados externa,
o app do Chat poderá retornar itens sugeridos com base no que
os usuários digitam no menu. Por exemplo, se um usuário começar a digitar Atl em um menu
que preenche cidades nos Estados Unidos, seu
app do Chat poderá sugerir automaticamente Atlanta antes que o usuário
termine de digitar. O app do Chat pode sugerir até 100
itens.
Para sugerir e preencher dinamicamente itens em uma entrada de seleção, o
widget SelectionInput no card precisa especificar uma função que consulte a
fonte de dados externa. Para menus de seleção múltipla, especifique o campo
externalDataSource. Para menus suspensos, especifique o campo
remoteDataSource
em um objeto
DataSourceConfig.
Também é possível configurar o número de caracteres que um usuário digita antes que o
menu retorne sugestões. Para menus de seleção múltipla, defina o
campo multiSelectMinQueryLength. Para menus suspensos, defina o campo min_characters_trigger no DataSourceConfig.
Para retornar itens sugeridos, a função precisa fazer o seguinte:
- Processar um objeto de evento, que o app do Chat recebe quando os usuários digitam no menu.
- No objeto de evento, acesse o valor que o usuário digita, que é
representado no campo
event.commonEventObject.parameters["autocomplete_widget_query"]. - Consulte a fonte de dados usando o valor de entrada do usuário para receber um ou mais
SelectionItemspara sugerir ao usuário. - Retorne os itens sugeridos retornando a ação
RenderActionscom um objetomodifyCard.
O exemplo de código a seguir mostra como um app do Chat
sugere itens dinamicamente no menu de seleção múltipla em um card. Quando um usuário digita
no menu, a função ou o endpoint fornecido no campo externalDataSource do widget
consulta uma fonte de dados externa e sugere itens
que o usuário pode selecionar.
Node.js
Substitua FUNCTION_URL pelo endpoint HTTP que consulta
a fonte de dados externa.
Python
Substitua FUNCTION_URL pelo endpoint HTTP que consulta
a fonte de dados externa.
Java
Substitua FUNCTION_URL pelo endpoint HTTP que consulta
a fonte de dados externa.
Apps Script
Este exemplo envia uma mensagem de card retornando o JSON do card. Também é possível usar o serviço de cards do Apps Script.
Transferir dados para outro cartão
Depois que um usuário envia informações de um card, talvez seja necessário retornar outros cards para realizar uma das seguintes ações:
- Crie seções diferentes para ajudar os usuários a preencher formulários mais longos.
- Permita que os usuários visualizem e confirmem as informações do card inicial para que possam revisar as respostas antes de enviar.
- Preencha dinamicamente as partes restantes do formulário. Por exemplo, para pedir que os usuários criem um compromisso, um app do Chat pode mostrar um card inicial que solicita o motivo do compromisso e, em seguida, preencher outro card que fornece os horários disponíveis com base no tipo de compromisso.
Para transferir a entrada de dados do card inicial, crie o widget button
com
actionParameters
que contenham o name do widget e o valor inserido pelo usuário, conforme mostrado
no exemplo a seguir:
Node.js
Substitua FUNCTION_URL pelo endpoint HTTP que processa
os cliques no botão.
Python
Substitua FUNCTION_URL pelo endpoint HTTP que processa
os cliques no botão.
Java
Substitua FUNCTION_URL pelo endpoint HTTP que processa
os cliques no botão.
Apps Script
Este exemplo envia uma mensagem de card retornando o JSON do card. Também é possível usar o serviço de cards do Apps Script.
Quando um usuário clica no botão, o app do Chat recebe um objeto de evento do qual você pode receber dados.
Responder a um envio de formulário
Depois de receber os dados de uma mensagem de card ou caixa de diálogo, o app do Chat responde confirmando o recebimento ou retornando um erro.
No exemplo a seguir, um app do Chat envia uma mensagem de texto para confirmar que recebeu um formulário enviado de uma mensagem de card.
Node.js
Python
Java
Apps Script
Este exemplo envia uma mensagem de card retornando o JSON do card. Também é possível usar o serviço de cards do Apps Script.
Para processar e fechar uma caixa de diálogo, retorne um objeto
RenderActions
que especifique se você quer enviar uma mensagem de confirmação, atualizar
a mensagem ou o card original ou apenas fechar a caixa de diálogo. Para ver as etapas, consulte
Fechar uma caixa de diálogo.
Resolver problemas
Nesta seção, apresentamos as etapas de solução de problemas para códigos de erro específicos e comportamentos de execução ao interagir com caixas de diálogo no Chat.
As interações de caixa de diálogo retornam "Erro não especificado ao invocar o complemento"
Ao interagir com uma caixa de diálogo, se você encontrar registros de erro com a mensagem "Erro não especificado ao invocar o complemento" e o código 13, isso geralmente indica um erro interno ou que o endpoint HTTP do app do Chat não conseguiu processar a solicitação ou retornar uma resposta válida.
Para resolver esse erro:
- Verifique se há exceções não tratadas ou falhas nos registros do endpoint HTTP.
- Verifique se o endpoint responde às solicitações em até 30 segundos. Se o endpoint levar mais de 30 segundos para ser executado, o Chat não poderá processar a resposta, e a interação vai falhar. Para mais detalhes, consulte Limites de taxa e práticas recomendadas.
- Verifique se o endpoint retorna uma resposta válida. Para envios de caixas de diálogo,
o endpoint precisa retornar um objeto
RenderActionsno formato JSON correto. Se a resposta estiver incorreta ou não tiver os campos obrigatórios, a interação da caixa de diálogo poderá falhar.
Quando um app do Google Chat ou card retorna um erro, a interface do Chat mostra a mensagem "Algo deu errado". ou "Não foi possível processar sua solicitação". Às vezes, a interface do Chat não mostra nenhuma mensagem de erro, mas o app do Chat ou card produz um resultado inesperado. Por exemplo, uma mensagem de card pode não aparecer.
Embora uma mensagem de erro possa não aparecer na interface do Chat, mensagens de erro descritivas e dados de registro estão disponíveis para ajudar você a corrigir erros quando o registro de erros para apps do Chat está ativado. Para receber ajuda para visualizar, depurar e corrigir erros, consulte Resolver problemas e corrigir erros do Google Chat.
Temas relacionados
- Confira o exemplo do Gerenciador de contatos, que é um app do Chat que pede aos usuários para preencher um formulário de contato em mensagens de card e caixas de diálogo.
- Abrir caixas de diálogo interativas
Apps do Chat que não são complementos: ler dados de formulários inseridos pelos usuários em cards
A documentação a seguir se aplica a apps do Chat que não são complementos do Google Workspace. Para migrar um app do Chat que não é um complemento, consulte Converter um app do Google Chat em um complemento do Google Workspace.
Criar formulários usando cards
Para ver um exemplo de um app do Chat que não é um complemento e usa um formulário de contato com uma entrada de texto, um seletor de data e hora e uma entrada de seleção, consulte o seguinte código:
Node.js
Python
Java
Apps Script
Receber dados de widgets interativos
Sempre que os usuários clicam em um botão, os apps do Chat que não são complementos recebem um evento de interação que depende do local do botão:
Se o botão estiver em uma mensagem ou caixa de diálogo, os apps do Chat que não são complementos vão receber um evento de interação
CARD_CLICKEDcom informações sobre a interação. O payload dos eventos de interaçãoCARD_CLICKEDcontém um objetocommon.formInputs(event.common.formInputs) com todos os valores inseridos pelo usuário.É possível recuperar os valores do objeto
common.formInputs.WIDGET_NAME, em que WIDGET_NAME é o camponameque você especificou para o widget. Os valores são retornados como um tipo de dados específico para o widget (representado como um objetoInputs).Veja a seguir uma parte de um evento de interação
CARD_CLICKEDem que um usuário inseriu 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"] }}} }} }Se o botão estiver em uma página inicial, os apps do Chat que não são complementos vão receber um evento de interação
SUBMIT_FORM. O payload do evento de interação contém um objetocommonEventObject.formInputs(event.commonEventObject.formInputs) com todos os valores inseridos pelo usuário.É possível recuperar os valores do objeto
commonEventObject.formInputs.WIDGET_NAME, em que WIDGET_NAME é o camponameque você especificou para o widget. Os valores são retornados como um tipo de dados específico para o widget (representado como um objetoInputs).Veja a seguir uma parte de um evento de interação
SUBMIT_FORMem que um usuário inseriu 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 receber os dados, um app do Chat que não é um complemento processa o evento de interação para receber os valores que os usuários inserem nos widgets. A tabela a seguir mostra como receber o valor de um determinado widget de entrada de formulário. Para cada widget, a tabela mostra o tipo de dados que ele aceita, onde o valor é armazenado no evento de interação e um exemplo de valor.
| Widget de entrada de formulário | Tipo de dados de entrada | Valor de entrada do evento de interação | Valor de exemplo |
|---|---|---|---|
textInput |
stringInputs |
event.common.formInputs.contactName.stringInputs.value[0] |
Kai O |
selectionInput |
stringInputs |
Para receber o primeiro ou único valor, event.common.formInputs.contactType.stringInputs.value[0] |
Personal |
dateTimePicker que aceita apenas datas. |
dateInput |
event.common.formInputs.contactBirthdate.dateInput.msSinceEpoch. |
1000425600000 |
Transferir dados para outro cartão
Para transferir a entrada de dados do card inicial em um
app do Chat que não é um complemento,
crie o widget button com
actionParameters
que contenham o name do widget e o valor inserido pelo usuário, conforme mostrado
no exemplo a seguir:
Node.js
Python
Java
Apps Script
Quando um usuário clica no botão, o app do Chat que não é um complemento recebe um evento de interação CARD_CLICKED do qual você pode receber dados.
Responder a um envio de formulário
No exemplo a seguir, um app do Chat que não é um complemento envia uma mensagem de texto para confirmar que recebeu um formulário enviado de uma mensagem de caixa de diálogo ou de card:
Node.js
Python
Java
Apps Script
Para processar e fechar uma caixa de diálogo em um app do Chat que não seja
um complemento,
retorne um objeto
ActionResponse
que especifique se você quer enviar uma mensagem de confirmação, atualizar
a mensagem ou o card original ou apenas fechar a caixa de diálogo. Para ver as etapas, consulte
Fechar uma caixa de diálogo.