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.
No Google Chat, os complementos aparecem para os usuários como apps do Google Chat. Para saber mais, consulte a Visão geral do Extend Google Chat.
Os apps de chat solicitam informações dos usuários para realizar ações dentro ou fora do Chat, incluindo as seguintes:
- 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 Chat a um ou mais espaços.
- Crie ou atualize informações em outros aplicativos do Google Workspace. Por exemplo, permita 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 de 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
Node.js
Um complemento do Google Workspace que funciona no Google Chat. Para criar um, conclua o Guia de início rápido do HTTP.
Apps Script
Um complemento do Google Workspace que funciona no Google Chat. 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 projetam formulários e entradas e os criam em cards. Para mostrar cards aos usuários, os apps do Chat podem usar as seguintes interfaces:
- Mensagens de chat que contêm um ou mais cards.
- Diálogos, que são cards que são abertos em uma nova janela de mensagens e páginas iniciais.
Os apps de chat podem criar os cards usando os seguintes widgets:
Widgets de entrada de formulário que solicitam informações dos usuários. Opcionalmente, você pode adicionar validação a widgets de entrada de formulário para garantir que os usuários insiram e formatem as informações corretamente. Os apps de chat podem usar os seguintes widgets de entrada de formulário:
- Entradas de texto
(
textInput
) para texto livre ou sugerido. - As entradas de seleção
(
selectionInput
) são elementos de 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 itens de fontes de dados estáticas ou dinâmicas. Por exemplo, os usuários podem selecionar uma lista de espaços do Chat em que são participantes.
- 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 valores inseridos no card. Depois que um usuário clica no botão, o app de chat pode processar as informações recebidas.
No exemplo abaixo, um card coleta informações de contato usando um campo de texto, um seletor de data e hora e um campo de seleção:
Para mais exemplos de widgets interativos que podem ser usados para coletar informações, consulte Projetar um card ou caixa de diálogo interativo na documentação da API Google Chat.
Receber dados de widgets interativos
Sempre que os usuários clicam em um botão, a
ação
dos apps de chat é acionada com informações sobre a interação. No
commonEventObject
do payload do evento, o objeto formInputs
contém todos os valores que o
usuário insere.
É possível recuperar os valores do objeto
commonEventObject.formInputs.WIDGET_NAME
, em que
WIDGET_NAME é o campo name
especificado para o widget.
Os valores são retornados como um tipo de dados específico para o widget.
A seguir, mostramos 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 widget de entrada de formulário. Para cada widget, a tabela mostra o tipo de dados aceito pelo widget, onde o valor é armazenado no objeto de evento e um valor de exemplo.
Widget de entrada de formulário | Tipo de dados de entrada | Valor de entrada do objeto do 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 só aceita datas. |
dateInput |
event.commonEventObject.formInputs.contactBirthdate.dateInput.msSinceEpoch . |
1000425600000 |
Transferir dados para outro cartão
Depois que um usuário envia informações de um cartão, talvez seja necessário retornar outros cartões para fazer o seguinte:
- Crie seções distintas para ajudar os usuários a preencher formulários mais longos.
- Permita que os usuários visualizem e confirmem as informações do cartão inicial para que eles possam revisar as respostas antes de enviar.
- Preencha dinamicamente as partes restantes do formulário. Por exemplo, para solicitar que os usuários criem um horário, um app de chat pode mostrar um card inicial que solicita o motivo do horário e, em seguida, preenche outro card que mostra os horários disponíveis com base no tipo de horário.
Para transferir a entrada de dados do card inicial, crie o widget button
com
actionParameters
que contém o name
do widget e o valor que o usuário insere, conforme mostrado
neste exemplo:
{
"buttonList": { "buttons": [{
"text": "Submit",
"onClick": { "action": {
"function": "submitForm",
"parameters": [
{
"key": "WIDGET_NAME",
"value": "USER_INPUT_VALUE"
},
// Can specify multiple parameters
]
}}
}]}
}
Em que WIDGET_NAME é o name
do widget e o
USER_INPUT_VALUE é o que o usuário insere. Por exemplo, para um campo de texto
que coleta o nome de uma pessoa, o nome do widget é contactName
, e um
valor de exemplo é Kai O
.
Quando um usuário clica no botão, o app 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 ou caixa de diálogo do cartão, o app de chat responde confirmando o recebimento ou retornando um erro.
No exemplo abaixo, um app de chat envia uma mensagem de texto para confirmar que recebeu um formulário enviado de uma mensagem de cartão.
Node.js
/**
* Google Cloud Function that handles all Google Workspace Add On events for
* the contact manager app.
*
* @param {Object} req Request sent from Google Chat space
* @param {Object} res Response to send back
*/
exports.contactManager = function contactManager(req, res) {
const chatEvent = req.body.chat;
const chatMessage = chatEvent.messagePayload.message;
// Handle MESSAGE events
if(chatEvent.messagePayload) {
return res.send(handleMessage(chatMessage, chatEvent.user));
// Handle CARD_CLICKED events
} else if(chatEvent.buttonClickedPayload) {
switch(req.body.commonEventObject.parameters.actionName) {
case "openDialog":
return res.send(openDialog());
case "openNextCard":
return res.send(openNextCard(req.body));
case "submitForm":
return res.send(submitForm(req.body));
}
}
};
/**
* Submits information from a dialog or card message.
*
* @param {Object} event the interactive event with form inputs.
* @return {Object} a message response that posts a private message.
*/
function submitForm(event) {
const chatUser = event.chat.user;
const contactName = event.commonEventObject.parameters["contactName"];
return { hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
privateMessageViewer: chatUser,
text: "✅ " + contactName + " has been added to your contacts."
}}}}};
}
Apps Script
/**
* Sends private text message that confirms submission.
*
* @param {Object} event the interactive event with form inputs.
* @return {Object} a message response that posts a private message.
*/
function submitForm(event) {
const chatUser = event.chat.user;
const contactName = event.commonEventObject.parameters["contactName"];
return { hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
privateMessageViewer: chatUser,
text: "✅ " + contactName + " has been added to your contacts."
}}}}};
}
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 conferir as etapas, consulte
Fechar uma caixa de diálogo.
Resolver problemas
Quando um app do Google Chat ou um card retorna um erro, a interface do Chat mostra uma mensagem informando que "Ocorreu um erro". 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 ou o card do Chat 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 a corrigir erros quando o registro de erros para apps de chat estiver ativado. Para saber como visualizar, depurar e corrigir erros, consulte Resolver e corrigir erros do Google Chat.