Raccogliere e gestire i contatti in Google Chat

Questo tutorial mostra come creare un'app Google Chat che aiuti gli utenti di Google Chat a gestire i loro contatti personali e aziendali. Per raccogliere informazioni, l'app Chat chiede agli utenti di compilare un modulo di contatto nei messaggi e nelle finestre di dialogo delle schede.

Guarda l'app Chat in azione:

  • Modulo di contatto dal comando slash.
    Figura 1. L'app Chat risponde al comando barra /about con un messaggio e un pulsante che aprono un modulo di contatto.
  • Modulo di contatto in una finestra di dialogo.
    Figura 2. L'app Chat apre una finestra di dialogo in cui gli utenti possono inserire informazioni su un contatto.
  • Finestra di dialogo di conferma e revisione.
    Figura 3. L'app Chat restituisce una finestra di dialogo di conferma in modo che gli utenti possano rivedere e confermare le informazioni prima di inviarle.
  • Un messaggio che conferma il nuovo contatto.
    Figura 4. Dopo che l'utente ha inviato il modulo, l'app Chat invia un messaggio privato per confermare l'invio.
  • Modulo di contatto da un messaggio della scheda.
    Figura 5. Inoltre, l'app Chat chiede agli utenti di aggiungere un contatto da una scheda in un messaggio.

Prerequisiti

Obiettivi

Architettura

L'app Chat è integrata in Google Apps Script e utilizza eventi di interazione per elaborare e rispondere agli utenti di Chat.

Di seguito è mostrato in che modo un utente potrebbe interagire in genere con l'app Chat:

  1. Un utente apre un messaggio diretto con l'app Chat o aggiunge l'app Chat a uno spazio esistente.

  2. L'app Chat chiede all'utente di aggiungere un contatto tramite la creazione e la visualizzazione di un modulo di contatto come oggetto card. Per presentare il modulo di contatto, l'app Chat risponde agli utenti nei seguenti modi:

    • Risponde alle @menzioni e ai messaggi diretti con un messaggio della scheda che contiene il modulo di contatto.
    • Risponde al comando barra /addContact aprendo una finestra di dialogo con il modulo di contatto.
    • Risponde al comando slash /about con un messaggio che contiene un pulsante Aggiungi un contatto su cui gli utenti possono fare clic per aprire una finestra di dialogo con il modulo di contatto.
  3. Quando viene visualizzato il modulo di contatto, l'utente inserisce i dati di contatto nei seguenti campi e widget:

    • Nome e cognome: un textInput widget che accetta stringhe.
    • Data di nascita: un dateTimePicker widget che accetta solo date.
    • Tipo di contatto: un selectionInput widget di pulsanti di opzione che consente agli utenti di selezionare e inviare un singolo valore di stringa (Personal o Work).
    • Pulsante Esamina e invia: un array buttonList con widget button su cui l'utente fa clic per inviare i valori inseriti.
  4. L'app Google Chat gestisce un evento di interazione CARD_CLICKED per elaborare i valori inseriti dall'utente e li mostra in una scheda di conferma.

  5. L'utente esamina la scheda di conferma e fa clic sul pulsante Invia per finalizzare i dati di contatto.

  6. L'app Google Chat invia un messaggio di testo privato che conferma l'invio.

Prepara l'ambiente

Questa sezione mostra come creare e configurare un progetto Google Cloud per l'app Chat.

Crea un progetto Google Cloud

Console Google Cloud

  1. Nella console Google Cloud, vai a Menu > IAM e amministrazione > Crea un progetto.

    Vai a Crea un progetto

  2. Nel campo Nome progetto, inserisci un nome descrittivo per il progetto.

    (Facoltativo) Per modificare l'ID progetto, fai clic su Modifica. L'ID progetto non può essere modificato dopo la creazione del progetto, quindi scegli un ID che soddisfi le tue esigenze per tutta la durata del progetto.

  3. Nel campo Località, fai clic su Sfoglia per visualizzare le località potenziali per il progetto. Quindi, fai clic su Seleziona.
  4. Fai clic su Crea. La console Google Cloud passa alla pagina Dashboard e il progetto viene creato entro pochi minuti.

Interfaccia a riga di comando gcloud

In uno dei seguenti ambienti di sviluppo, accedi a Google Cloud CLI (gcloud):

  • Cloud Shell: per utilizzare un terminale online con gcloud CLI già configurato, attiva Cloud Shell.
    Attiva Cloud Shell
  • Shell locale: per utilizzare un ambiente di sviluppo locale, installa e inizializza gcloud CLI.
    Per creare un progetto Cloud, utilizza il comando gcloud projects create:
    gcloud projects create PROJECT_ID
    Sostituisci PROJECT_ID impostando l'ID del progetto che vuoi creare.

Configura autenticazione e autorizzazione

Le app Google Chat richiedono la configurazione di una schermata per il consenso OAuth in modo che gli utenti possano autorizzare la tua app nelle applicazioni Google Workspace, tra cui Google Chat.

In questo tutorial eseguirai il deployment di un'app di Chat riservata ai test e all'uso interno, quindi puoi utilizzare informazioni segnaposto per la schermata di consenso. Prima di pubblicare l'app Chat, sostituisci le informazioni segnaposto con informazioni reali.

  1. Nella console Google Cloud, vai a Menu > API e servizi > Schermata del consenso OAuth.

    Vai alla schermata per il consenso OAuth

  2. In Tipo di utente, seleziona Interno e poi fai clic su Crea.

  3. In Nome app, digita Contact Manager.

  4. In Indirizzo email dell'assistenza utente, seleziona il tuo indirizzo email o un gruppo Google appropriato.

  5. In Dati di contatto dello sviluppatore, inserisci il tuo indirizzo email.

  6. Fai clic su Salva e continua.

  7. Nella pagina Ambiti, fai clic su Salva e continua. L'app Chat non richiede ambiti OAuth.

  8. Esamina il riepilogo e fai clic su Torna alla dashboard.

Creare e implementare l'app Chat

Nella sezione seguente, copierai e aggiorni un intero progetto Apps Script che contiene tutto il codice dell'applicazione richiesto per la tua app di Chat, quindi non è necessario copiare e incollare ogni file.

Se vuoi, puoi visualizzare l'intero progetto su GitHub.

Visualizza su GitHub

Ecco una panoramica di ogni file:

main.gs

Gestisce tutta la logica dell'app, inclusi gli eventi di interazione relativi a quando gli utenti inviano messaggi all'app Chat, fanno clic sui pulsanti di un messaggio dell'app Chat o aprono e chiudono le finestre di dialogo.

Visualizza il codice 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

Contiene i widget che ricevono i dati dei moduli dagli utenti. Questi widget di input dei moduli vengono visualizzati in schede che vengono visualizzate in messaggi e finestre di dialogo.

Visualizza il codice di 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

Il manifest di Apps Script che definisce e configura il progetto Apps Script per l'app Chat.

Visualizza il codice di appsscript.json

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

Trovare il numero e l'ID del progetto Cloud

  1. Nella console Google Cloud, vai al tuo progetto Cloud.

    Vai alla console Google Cloud

  2. Fai clic su Impostazioni e utilità > Impostazioni progetto.

  3. Prendi nota dei valori nei campi Numero progetto e ID progetto. Puoi usarli nelle sezioni seguenti.

Crea il progetto Apps Script

Per creare un progetto Apps Script e collegarlo al tuo progetto Cloud:

  1. Fai clic sul pulsante seguente per aprire il progetto Apps Script Gestisci contatti in Google Chat.
    Apri il progetto
  2. Fai clic su Panoramica.
  3. Nella pagina Panoramica, fai clic su L&#39;icona per creare una copia Crea una copia.
  4. Assegna un nome alla copia del progetto Apps Script:

    1. Fai clic su Copia di Gestisci i contatti in Google Chat.

    2. In Titolo del progetto, digita Contact Manager - Google Chat app

    3. Fai clic su Rinomina.

Imposta il progetto cloud del progetto Apps Script

  1. Nel progetto Apps Script, fai clic su L&#39;icona per le impostazioni del progetto Impostazioni progetto.
  2. In Progetto Google Cloud (Google Cloud), fai clic su Cambia progetto.
  3. In Numero progetto Google Cloud, incolla il numero del tuo progetto Cloud.
  4. Fai clic su Imposta progetto. Il progetto Cloud e il progetto Apps Script ora sono connessi.

Creare un deployment di Apps Script

Ora che il codice è completo, esegui il deployment del progetto Apps Script. L'ID di deployment viene utilizzato per configurare l'app Chat in Google Cloud.

  1. In Apps Script, apri il progetto dell'app Chat.

    Vai ad Apps Script

  2. Fai clic su Esegui il deployment > Nuovo deployment.

  3. Se Componente aggiuntivo non è già selezionato, accanto a Seleziona tipo, fai clic sui tipi di implementazione L&#39;icona per le impostazioni del progetto e seleziona Componente aggiuntivo.

  4. In Descrizione, inserisci una descrizione per questa versione, ad esempio Test of Contact Manager.

  5. Fai clic su Esegui il deployment. Apps Script segnala il deployment riuscito e fornisce un ID deployment.

  6. Fai clic su Copia per copiare l'ID deployment e poi su Fine.

Configurare l'app Chat nella console Google Cloud

Questa sezione mostra come configurare l'API Google Chat nella console Google Cloud con informazioni sulla tua app di chat, incluso l'ID del deployment che hai appena creato dal progetto Apps Script.

  1. Nella console Google Cloud, fai clic su Menu > Altri prodotti > Google Workspace > Raccolta di prodotti > API Google Chat > Gestisci > Configurazione.

    Vai alla configurazione dell'API Chat

  2. In Nome app, digita Contact Manager.

  3. In URL avatar, digita https://developers.google.com/chat/images/contact-icon.png.

  4. In Descrizione, digita Manage your personal and business contacts.

  5. Fai clic sull'opzione Attiva funzionalità interattive per attivarla.

  6. In Funzionalità, seleziona le caselle di controllo Ricevi messaggi 1:1 e Partecipa a spazi e conversazioni di gruppo.

  7. In Impostazioni di connessione, seleziona Apps Script.

  8. In Deployment ID (ID deployment), incolla l'ID deployment di Apps Script che hai copiato nella sezione precedente quando hai creato il deployment di Apps Script.

  9. In Comandi slash, configura i comandi slash /about e /addContact:

    1. Fai clic su Aggiungi un comando slash per configurare il primo comando slash.
    2. In Nome, digita /about.
    3. In ID comando, digita 1.
    4. In Descrizione, digita Learn how to use this Chat app to manage your contacts.
    5. Seleziona Apre una finestra di dialogo.
    6. Fai clic su Fine.
    7. Fai clic su Aggiungi un comando slash per configurare un altro comando slash.
    8. In Nome, digita /addContact
    9. In ID comando, digita 2.
    10. In Descrizione, digita Submit information about a contact.
    11. Seleziona Apre una finestra di dialogo.
    12. Fai clic su Fine.
  10. In Visibilità, seleziona la cassella di controllo Rendi disponibile l'app di chat a utenti e gruppi specifici in YOUR DOMAIN e inserisci il tuo indirizzo email.

  11. In Log, seleziona Log errori in Logging.

  12. Fai clic su Salva. Viene visualizzato un messaggio che indica che la configurazione è stata salvata.

L'app Chat è pronta per essere installata e testata in Chat.

Testare l'app Chat

Per testare l'app Chat, apri uno spazio di messaggi diretti con l'app Chat e invia un messaggio:

  1. Apri Google Chat utilizzando l'account Google Workspace fornito quando hai aggiunto te stesso come tester attendibile.

    Vai a Google Chat

  2. Fai clic su Nuova chat.
  3. Nel campo Aggiungi 1 o più persone, digita il nome della tua app Chat.
  4. Seleziona l'app Chat dai risultati. Si apre un messaggio diretto.

  1. Nel nuovo messaggio diretto con l'app Chat, digita /addContact e premi Invio.

  2. Nella finestra di dialogo che si apre, inserisci i dati di contatto:

    1. Nel campo di testo Nome e cognome, inserisci un nome.
    2. Nel selettore della data Data di nascita, seleziona una data.
    3. In Tipo di contatto, seleziona il pulsante di opzione Lavoro o Personale.
  3. Fai clic su Rivedi e invia.

  4. Nella finestra di dialogo di conferma, controlla le informazioni inviate e fai clic su Invia. L'app Chat risponde con un messaggio di testo che dice CONTACT NAME has been added to your contacts..

  5. Facoltativamente, puoi anche testare e inviare il modulo di contatto nei seguenti modi:

    • Utilizza il comando slash /about. L'app Chat risponde con un messaggio e un pulsante del widget dell'accessorio con il messaggio Add a contact. Puoi fare clic sul pulsante per aprire una finestra di dialogo con il modulo di contatto.
    • Invia all'app Chat un messaggio diretto senza un comando slash, ad esempio Hello. L'app Chat risponde con un testo e una scheda che contiene il modulo di contatto.

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, ti consigliamo di eliminare il progetto Cloud.

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse. Fai clic su Menu > IAM e amministrazione > Gestisci risorse.

    Vai a Resource Manager

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare e fai clic su Elimina .
  3. Nella finestra di dialogo, digita l'ID progetto e fai clic su Chiudi per eliminare il progetto.