Coletar e gerenciar contatos no Google Chat

Este tutorial mostra como criar um app do Google Chat que ajuda os usuários a gerenciar contatos pessoais e comerciais. Para coletar informações, o app do Chat pede que os usuários preencham um formulário de contato em mensagens de cards e caixas de diálogo.

Confira o app Chat em ação:

  • Formulário de contato usando o comando de barra.
    Figura 1. O app do Chat responde ao comando de barra /about com uma mensagem de texto e um botão que abre um formulário de contato.
  • Formulário de contato em uma caixa de diálogo.
    Figura 2. O app de chat abre uma caixa de diálogo em que os usuários podem inserir informações sobre um contato.
  • Caixa de diálogo de confirmação e análise.
    Figura 3. O app do Chat retorna uma caixa de diálogo de confirmação para que os usuários possam revisar e confirmar as informações antes do envio.
  • Uma mensagem de texto que confirma o novo contato.
    Figura 4. Depois que o usuário envia o formulário, o app do Chat envia uma mensagem de texto particular para confirmar o envio.
  • Formulário de contato de uma mensagem de cartão.
    Figura 5. O app Chat também solicita que os usuários adicionem um contato de um card em uma mensagem.

Pré-requisitos

Objetivos

Arquitetura

O app Chat é criado no Google Apps Script e usa eventos de interação para processar e responder aos usuários do Chat.

Confira a seguir como um usuário pode interagir com o app Chat:

  1. Um usuário abre uma mensagem direta com o app Chat ou adiciona o app Chat a um espaço.

  2. O app de chat pede ao usuário para adicionar um contato criando e mostrando um formulário de contato como um objeto card. Para apresentar o formulário de contato, o app Chat responde aos usuários das seguintes maneiras:

    • Responde a @menções e mensagens diretas com uma mensagem em um card que contém o formulário de contato.
    • Responde ao comando de barra /addContact abrindo uma caixa de diálogo com o formulário de contato.
    • responde ao comando de barra /about com uma mensagem de texto que tem um botão Adicionar um contato em que os usuários podem clicar para abrir uma caixa de diálogo com o formulário de contato.
  3. Quando o formulário de contato é apresentado, o usuário insere as informações de contato nos seguintes campos e widgets:

    • Nome e sobrenome: um widget textInput que aceita strings.
    • Data de nascimento: um widget dateTimePicker que aceita apenas datas.
    • Tipo de contato: um widget de selectionInput botões de opção que permite que os usuários selecionem e enviem um único valor de string (Personal ou Work).
    • Botão Review and submit: uma matriz buttonList com widget button em que o usuário clica para enviar os valores que foram inseridos.
  4. O app Google Chat processa um evento de interação CARD_CLICKED para processar os valores inseridos pelo usuário e os exibe em um card de confirmação.

  5. O usuário analisa o card de confirmação e clica no botão Enviar para finalizar os dados de contato.

  6. O app Google Chat envia uma mensagem de texto particular que confirma o envio.

Prepare o ambiente

Esta seção mostra como criar e configurar um projeto do Google Cloud para o app Chat.

Criar um projeto do Google Cloud

Console do Google Cloud

  1. No console do Google Cloud, acesse Menu > IAM e administrador > Criar um projeto.

    Acessar "Criar um projeto"

  2. No campo Nome do projeto, insira um nome descritivo.

    Opcional: para editar o ID do projeto, clique em Editar. O ID do projeto não pode ser alterado após a criação do projeto. Portanto, escolha um ID que atenda às suas necessidades durante a vida útil do projeto.

  3. No campo Local, clique em Procurar para mostrar possíveis locais para seu projeto. Em seguida, clique em Selecionar.
  4. Clique em Criar. O console do Google Cloud navega até a página "Painel", e seu projeto é criado em alguns minutos.

CLI da gcloud

Em um dos seguintes ambientes de desenvolvimento, acesse a CLI do Google Cloud (gcloud):

  • Cloud Shell: para usar um terminal on-line com a CLI gcloud já configurada, ative o Cloud Shell.
    Ativar o Cloud Shell
  • Shell local: para usar um ambiente de desenvolvimento local, instale e inicialize a CLI gcloud.
    Para criar um projeto do Cloud, use o comando gcloud projects create:
    gcloud projects create PROJECT_ID
    Substitua PROJECT_ID definindo o ID do projeto que você quer criar.

Configurar a autenticação e a autorização

Os apps do Google Chat exigem que você configure uma tela de consentimento do OAuth para que os usuários possam autorizar seu app nos aplicativos do Google Workspace, incluindo o Google Chat.

Neste tutorial, você implantará um app do Chat destinado apenas a testes e uso interno, então não há problema em usar informações de marcadores de posição para a tela de consentimento. Antes de publicar o app Chat, substitua as informações de marcador de posição por informações reais.

  1. No console do Google Cloud, acesse Menu > APIs e serviços > Tela de permissão OAuth.

    Acessar a tela de permissão OAuth

  2. Em Tipo de usuário, selecione Interno e clique em Criar.

  3. Em Nome do app, digite Contact Manager.

  4. Em E-mail para suporte do usuário, selecione seu endereço de e-mail ou um Grupo do Google apropriado.

  5. Em Dados de contato do desenvolvedor, insira seu endereço de e-mail.

  6. Clique em Salvar e continuar.

  7. Na página Escopos, clique em Salvar e continuar. O app do Chat não requer escopos do OAuth.

  8. Leia o resumo e clique em Voltar ao painel.

Criar e implantar o app do Chat

Na próxima seção, você vai copiar e atualizar um projeto inteiro do Apps Script que contém todo o código de aplicativo necessário para o app de chat. Assim, não é necessário copiar e colar cada arquivo.

Você também pode conferir o projeto inteiro no GitHub.

Ver no GitHub

Confira uma visão geral de cada arquivo:

main.gs

Processa toda a lógica do app, incluindo eventos de interação sobre quando os usuários enviam mensagens para o app Chat, clicam em botões de uma mensagem do app Chat ou abrem e fecham caixas de diálogo.

Mostrar código main.gs

apps-script/contact-form-app/main.gs
/**
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * Responds to a MESSAGE interaction event in Google Chat.
 *
 * @param {Object} event the MESSAGE interaction event from Chat API.
 * @return {Object} message response that opens a dialog or sends private
 *                          message with text and card.
 */
function onMessage(event) {
  if (event.message.slashCommand) {
    switch (event.message.slashCommand.commandId) {
      case 1:
        // If the slash command is "/about", responds with a text message and button
        // that opens a dialog.
        return {
          text: "Manage your personal and business contacts 📇. To add a " +
                  "contact, use the slash command `/addContact`.",
          accessoryWidgets: [{
            buttonList: { buttons: [{
              text: "Add Contact",
              onClick: { action: {
                function: "openInitialDialog",
                interaction: "OPEN_DIALOG"
              }}
            }]}
          }]
        }
      case 2:
        // If the slash command is "/addContact", opens a dialog.
        return openInitialDialog();
    }
  }

  // If user sends the Chat app a message without a slash command, the app responds
  // privately with a text and card to add a contact.
  return {
    privateMessageViewer: event.user,
    text: "To add a contact, try `/addContact` or complete the form below:",
    cardsV2: [{
      cardId: "addContactForm",
      card: {
        header: { title: "Add a contact" },
        sections:[{ widgets: CONTACT_FORM_WIDGETS.concat([{
          buttonList: { buttons: [{
            text: "Review and submit",
            onClick: { action: { function : "openConfirmation" }}
          }]}
        }])}]
      }
    }]
  };
}

/**
 * Responds to CARD_CLICKED interaction events in Google Chat.
 *
 * @param {Object} event the CARD_CLICKED interaction event from Google Chat.
 * @return {Object} message responses specific to the dialog handling.
 */
function onCardClick(event) {
  // Initial dialog form page
  if (event.common.invokedFunction === "openInitialDialog") {
    return openInitialDialog();
  // Confirmation dialog form page
  } else if (event.common.invokedFunction === "openConfirmation") {
    return openConfirmation(event);
  // Submission dialog form page
  } else if (event.common.invokedFunction === "submitForm") {
    return submitForm(event);
  }
}

/**
 * Opens the initial step of the dialog that lets users add contact details.
 *
 * @return {Object} a message with an action response to open a dialog.
 */
function openInitialDialog() {
  return { actionResponse: {
    type: "DIALOG",
    dialogAction: { dialog: { body: { sections: [{
      header: "Add new contact",
      widgets: CONTACT_FORM_WIDGETS.concat([{
        buttonList: { buttons: [{
          text: "Review and submit",
          onClick: { action: { function: "openConfirmation" }}
        }]}
      }])
    }]}}}
  }};
}

/**
 * Returns the second step as a dialog or card message that lets users confirm details.
 *
 * @param {Object} event the interactive event with form inputs.
 * @return {Object} returns a dialog or private card message.
 */
function openConfirmation(event) {
  const name = fetchFormValue(event, "contactName") ?? "";
  const birthdate = fetchFormValue(event, "contactBirthdate") ?? "";
  const type = fetchFormValue(event, "contactType") ?? "";
  const cardConfirmation = {
    header: "Your contact",
    widgets: [{
      textParagraph: { text: "Confirm contact information and submit:" }}, {
      textParagraph: { text: "<b>Name:</b> " + name }}, {
      textParagraph: {
        text: "<b>Birthday:</b> " + convertMillisToDateString(birthdate)
      }}, {
      textParagraph: { text: "<b>Type:</b> " + type }}, {
      buttonList: { buttons: [{
        text: "Submit",
        onClick: { action: {
          function: "submitForm",
          parameters: [{
            key: "contactName", value: name }, {
            key: "contactBirthdate", value: birthdate }, {
            key: "contactType", value: type
          }]
        }}
      }]}
    }]
  };

  // Returns a dialog with contact information that the user input.
  if (event.isDialogEvent) {
    return { action_response: {
      type: "DIALOG",
      dialogAction: { dialog: { body: { sections: [ cardConfirmation ]}}}
    }};
  }

  // Updates existing card message with contact information that the user input.
  return {
    actionResponse: { type: "UPDATE_MESSAGE" },
    privateMessageViewer: event.user,
    cardsV2: [{
      card: { sections: [cardConfirmation]}
    }]
  }
}

/**
  * Validates and submits information from a dialog or card message
  * and notifies status.
  *
  * @param {Object} event the interactive event with parameters.
  * @return {Object} a message response that opens a dialog or posts a private
  *                  message.
  */
function submitForm(event) {
  const contactName = event.common.parameters["contactName"];
  // Checks to make sure the user entered a contact name.
  // If no name value detected, returns an error message.
  if (!contactName) {
    const errorMessage = "Don't forget to name your new contact!";
    if (event.dialogEventType === "SUBMIT_DIALOG") {
      return { actionResponse: {
        type: "DIALOG",
        dialogAction: { actionStatus: {
          statusCode: "INVALID_ARGUMENT",
          userFacingMessage: errorMessage
        }}
      }};
    } else {
      return {
        privateMessageViewer: event.user,
        text: errorMessage
      };
    }
  }

  // The Chat app indicates that it received form data from the dialog or card.
  // Sends private text message that confirms submission.
  const confirmationMessage = "✅ " + contactName + " has been added to your contacts.";
  if (event.dialogEventType === "SUBMIT_DIALOG") {
    return {
      actionResponse: {
        type: "DIALOG",
        dialogAction: { actionStatus: {
          statusCode: "OK",
          userFacingMessage: "Success " + contactName
        }}
      }
    }
  } else {
    return {
      actionResponse: { type: "NEW_MESSAGE" },
      privateMessageViewer: event.user,
      text: confirmationMessage
    };
  }
}

/**
 * Extracts form input value for a given widget.
 *
 * @param {Object} event the CARD_CLICKED interaction event from Google Chat.
 * @param {String} widgetName a unique ID for the widget, specified in the widget's name field.
 * @returns the value inputted by the user, null if no value can be found.
 */
function fetchFormValue(event, widgetName) {
  const formItem = event.common.formInputs[widgetName][""];
  // For widgets that receive StringInputs data, the value input by the user.
  if (formItem.hasOwnProperty("stringInputs")) {
    const stringInput = event.common.formInputs[widgetName][""].stringInputs.value[0];
    if (stringInput != null) {
      return stringInput;
    }
  // For widgets that receive dateInput data, the value input by the user.
  } else if (formItem.hasOwnProperty("dateInput")) {
    const dateInput = event.common.formInputs[widgetName][""].dateInput.msSinceEpoch;
     if (dateInput != null) {
       return dateInput;
     }
  }

  return null;
}

/**
 * Converts date in milliseconds since epoch to user-friendly string.
 *
 * @param {Object} millis the milliseconds since epoch time.
 * @return {string} Display-friend date (English US).
 */
function convertMillisToDateString(millis) {
  const date = new Date(millis);
  const options = { year: 'numeric', month: 'long', day: 'numeric' };
  return date.toLocaleDateString('en-US', options);
}
contactForm.gs

Contém os widgets que recebem dados de formulário dos usuários. Esses widgets de entrada de formulário são exibidos em cards que aparecem em mensagens e caixas de diálogo.

Mostrar código contactForm.gs

apps-script/contact-form-app/contactForm.gs
/**
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * The section of the contact card that contains the form input widgets. Used in a dialog and card message.
 * To add and preview widgets, use the Card Builder: https://addons.gsuite.google.com/uikit/builder
 */
const CONTACT_FORM_WIDGETS = [
  {
    "textInput": {
      "name": "contactName",
      "label": "First and last name",
      "type": "SINGLE_LINE"
    }
  },
  {
    "dateTimePicker": {
      "name": "contactBirthdate",
      "label": "Birthdate",
      "type": "DATE_ONLY"
    }
  },
  {
    "selectionInput": {
      "name": "contactType",
      "label": "Contact type",
      "type": "RADIO_BUTTON",
      "items": [
        {
          "text": "Work",
          "value": "Work",
          "selected": false
        },
        {
          "text": "Personal",
          "value": "Personal",
          "selected": false
        }
      ]
    }
  }
];
appsscript.json

O manifesto do Apps Script que define e configura o projeto do Apps Script para o app Chat.

Mostrar código appsscript.json

apps-script/contact-form-app/appsscript.json
{
  "timeZone": "America/Los_Angeles",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "chat": {}
}

Encontre o número e o ID do projeto do Cloud

  1. No console do Google Cloud, acesse seu projeto do Cloud.

    Acessar o Console do Google Cloud

  2. Clique em Configurações e utilitários > Configurações do projeto.

  3. Anote os valores nos campos Número do projeto e ID do projeto. Você vai usá-los nas seções a seguir.

Criar o projeto do Apps Script

Para criar um projeto do Apps Script e conectá-lo ao seu projeto do Cloud:

  1. Clique no botão a seguir para abrir o projeto do Apps Script Gerenciar contatos no Google Chat.
    Abrir o projeto
  2. Clique em Visão geral.
  3. Na página de visão geral, clique em O ícone para fazer uma cópia Fazer uma cópia.
  4. Nomeie sua cópia do projeto do Apps Script:

    1. Clique em Cópia de "Gerenciar contatos no Google Chat".

    2. Em Título do projeto, digite Contact Manager - Google Chat app.

    3. Clique em Renomear.

Definir o projeto do Cloud do Apps Script

  1. No projeto do Apps Script, clique em Ícone das configurações do projeto Project Settings.
  2. Em Projeto do Google Cloud Platform (GCP), clique em Mudar projeto.
  3. Em Número do projeto do GCP, cole o número do seu projeto do Cloud.
  4. Clique em Configurar projeto. O projeto do Cloud e do Apps Script agora estão conectados.

Criar uma implantação do Apps Script

Agora que todo o código está em vigor, implante o projeto do Apps Script. Use o ID de implantação ao configurar o app do Chat no Google Cloud.

  1. No Apps Script, abra o projeto do app Chat.

    Acessar o Apps Script

  2. Clique em Implantar > Nova implantação.

  3. Se a opção Complemento ainda não estiver selecionada, ao lado de Selecionar tipo, clique em tipos de implantação Ícone das configurações do projeto e selecione Complemento.

  4. Em Descrição, insira uma descrição para essa versão, como Test of Contact Manager.

  5. Clique em Implantar. O Apps Script informa a implantação bem-sucedida e fornece um ID de implantação.

  6. Clique em Copiar para copiar o ID da implantação e clique em Concluído.

Configurar o app Chat no console do Google Cloud

Esta seção mostra como configurar a API Google Chat no console do Google Cloud com informações sobre seu app do Chat, incluindo o ID da implantação que você acabou de criar no projeto do Apps Script.

  1. No console do Google Cloud, clique em Menu > Mais produtos > Google Workspace > Biblioteca de produtos > API Google Chat > Gerenciar > Configuração.

    Acessar a configuração da API Chat

  2. Em Nome do app, digite Contact Manager.

  3. No URL do avatar, digite https://developers.google.com/chat/images/contact-icon.png.

  4. Em Descrição, digite Manage your personal and business contacts.

  5. Clique no botão Ativar recursos interativos para ativar a opção.

  6. Em Funcionalidade, marque as caixas de seleção Receber mensagens individuais e Participar de espaços e conversas em grupo.

  7. Em Configurações de conexão, selecione Apps Script.

  8. Em ID da implantação, cole o ID de implantação do Apps Script copiado na seção anterior ao criar a implantação do Apps Script.

  9. Em Comandos de barra, configure os comandos de barra /about e /addContact:

    1. Clique em Adicionar um comando de barra para configurar o primeiro comando de barra.
    2. Em Nome, digite /about.
    3. Em ID do comando, digite 1.
    4. Em Descrição, digite Learn how to use this Chat app to manage your contacts.
    5. Selecione Abre uma caixa de diálogo.
    6. Clique em Concluído.
    7. Clique em Adicionar um comando de barra para configurar outro comando de barra.
    8. Em Nome, digite /addContact.
    9. Em ID do comando, digite 2.
    10. Em Descrição, digite Submit information about a contact.
    11. Selecione Abre uma caixa de diálogo.
    12. Clique em Concluído.
  10. Em Visibilidade, marque a caixa de seleção Disponibilizar este app do Chat para pessoas e grupos específicos em YOUR DOMAIN e digite seu endereço de e-mail.

  11. Em Registros, selecione Registrar erros no Logging.

  12. Clique em Salvar. Uma mensagem de configuração salva vai aparecer.

O app de chat está pronto para ser instalado e testado no Chat.

Teste o app do Chat

Para testar seu app do Chat, abra um espaço de mensagem direta com o app do Chat e envie uma mensagem:

  1. Abra o Google Chat usando a conta do Google Workspace que você informou ao se adicionar como um testador confiável.

    Acessar o Google Chat

  2. Clique em Nova conversa.
  3. No campo Adicionar uma ou mais pessoas, digite o nome do seu app do Chat.
  4. Selecione o app Chat nos resultados. Uma mensagem direta é aberta.

  1. Na nova mensagem direta com o app Chat, digite /addContact e pressione Enter.

  2. Na caixa de diálogo exibida, insira os dados de contato:

    1. No campo de texto Nome e sobrenome, insira um nome.
    2. No seletor de data Data de nascimento, selecione uma data.
    3. Em Tipo de contato, selecione o botão de opção Trabalho ou Pessoal.
  3. Clique em Revisar e enviar.

  4. Na caixa de diálogo de confirmação, revise as informações enviadas e clique em Enviar. O app do Chat responde com uma mensagem de texto que diz CONTACT NAME has been added to your contacts..

  5. Também é possível testar e enviar o formulário de contato das seguintes maneiras:

    • Use o comando de barra /about. O app de chat responde com uma mensagem de texto e um botão de widget de acessório que diz Add a contact. Clique no botão para abrir uma caixa de diálogo com o formulário de contato.
    • Envie uma mensagem direta ao app do Chat sem um comando de barra, como Hello. O app de chat responde com um texto e um card que contém o formulário de contato.

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste tutorial, recomendamos que você exclua o projeto do Cloud.

  1. No console do Google Cloud, acesse a página Gerenciar recursos. Clique em Menu &gt; IAM e administrador &gt; Gerenciar recursos.

    Acesse o Resource Manager

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluir o projeto.