Collecter et traiter les informations des utilisateurs de Google Chat

suivant suivant suivant

Ce guide explique comment les applications Google Chat peuvent collecter et traiter les informations des utilisateurs en créant des entrées de formulaire dans des interfaces basées sur des fiches.

Dans Google Chat, les modules complémentaires apparaissent aux utilisateurs comme des applications Google Chat. Pour en savoir plus, consultez la présentation de l'extension Google Chat.

Boîte de dialogue avec différents widgets
Figure 1: Application Chat qui ouvre une boîte de dialogue pour collecter des informations de contact

Les applications Chat demandent des informations aux utilisateurs pour effectuer des actions dans ou en dehors de Chat, y compris de la manière suivante:

  • Configurez les paramètres. Par exemple, pour permettre aux utilisateurs de personnaliser les paramètres de notification ou de configurer et d'ajouter l'application Chat à un ou plusieurs espaces.
  • Créer ou modifier des informations dans d'autres applications Google Workspace Par exemple, autorisez les utilisateurs à créer un événement Google Agenda.
  • Autorisez les utilisateurs à accéder aux ressources d'autres applications ou services Web et à les mettre à jour. Par exemple, une application Chat peut aider les utilisateurs à mettre à jour l'état d'une demande d'assistance directement depuis un espace Chat.

Prérequis

Node.js

Un module complémentaire Google Workspace qui fonctionne dans Google Chat. Pour en créer un, suivez le guide de démarrage rapide HTTP.

Apps Script

Un module complémentaire Google Workspace qui fonctionne dans Google Chat. Pour en créer un, suivez le guide de démarrage rapide Apps Script.

Créer des formulaires à l'aide de fiches

Pour collecter des informations, les applications Chat conçoivent des formulaires et leurs entrées, puis les intègrent à des fiches. Pour afficher des fiches aux utilisateurs, les applications Chat peuvent utiliser les interfaces Chat suivantes:

  • Messages de chat contenant une ou plusieurs cartes
  • Boîtes de dialogue, qui sont des fiches qui s'ouvrent dans une nouvelle fenêtre à partir des messages et des pages d'accueil.

Les applications Chat peuvent créer des fiches à l'aide des widgets suivants:

  • Widgets de saisie de formulaire qui demandent des informations aux utilisateurs. Vous pouvez également ajouter une validation aux widgets de saisie de formulaires pour vous assurer que les utilisateurs saisissent et formatent correctement les informations. Les applications Chat peuvent utiliser les widgets de saisie de formulaire suivants:

    • Saisie de texte (textInput) pour le texte libre ou suggéré.
    • Les entrées de sélection (selectionInput) sont des éléments d'interface utilisateur sélectionnables tels que des cases à cocher, des cases d'option et des menus déroulants. Les widgets de saisie de sélection peuvent également renseigner et suggérer des éléments à partir de données Google Workspace (telles qu'un espace Chat) ou d'une source de données dynamique. Pour en savoir plus, consultez la section suivante Ajouter un menu à sélection multiple.

    • Sélecteurs de date et d'heure (dateTimePicker) pour les entrées de date et d'heure.

  • Un widget de bouton pour que les utilisateurs puissent envoyer les valeurs qu'ils ont saisies dans la fiche. Une fois qu'un utilisateur a cliqué sur le bouton, l'application Chat peut traiter les informations qu'elle reçoit.

Dans l'exemple suivant, une fiche collecte des coordonnées à l'aide d'une zone de saisie de texte, d'un sélecteur de date et d'heure, et d'une zone de sélection:

Pour voir d'autres exemples de widgets interactifs que vous pouvez utiliser pour collecter des informations, consultez la section Concevoir une fiche ou une boîte de dialogue interactive dans la documentation de l'API Google Chat.

Ajouter un menu multisélection

Pour personnaliser les éléments de sélection ou permettre aux utilisateurs de sélectionner des éléments à partir d'une source de données dynamique, les applications Chat peuvent utiliser des menus à sélection multiple, qui sont un type de widget SelectionInput. Par exemple, la fiche suivante affiche un menu à sélection multiple dans lequel les utilisateurs peuvent choisir de manière dynamique parmi une liste de contacts:

Vous pouvez renseigner les éléments d'un menu à sélection multiple à partir des sources de données suivantes:

  • Données Google Workspace, y compris les utilisateurs ou les espaces Chat auxquels l'utilisateur est membre. Le menu ne contient que des éléments de la même organisation Google Workspace.
  • Sources de données externes, telles qu'une base de données relationnelle Par exemple, vous pouvez utiliser des menus à sélection multiple pour aider un utilisateur à choisir parmi une liste de prospects commerciaux à partir d'un système de gestion de la relation client (CRM).

Renseigner des éléments à partir d'une source de données Google Workspace

Pour utiliser des sources de données Google Workspace, spécifiez le champ platformDataSource dans le widget SelectionInput. Contrairement aux autres types de saisie de sélection, vous omettez les objets SelectionItem, car ces éléments de sélection sont issus de Google Workspace de manière dynamique.

Le code suivant affiche un menu à sélection multiple d'utilisateurs Google Workspace. Pour renseigner les utilisateurs, la saisie de sélection définit commonDataSource sur USER:

JSON

{
  "selectionInput": {
    "name": "contacts",
    "type": "MULTI_SELECT",
    "label": "Selected contacts",
    "multiSelectMaxSelectedItems": 5,
    "multiSelectMinQueryLength": 1,
    "platformDataSource": {
      "commonDataSource": "USER"
    }
  }
}

Le code suivant affiche un menu de sélection multiple d'espaces Chat. Pour renseigner les espaces, la saisie de sélection spécifie le champ hostAppDataSource. Le menu de sélection multiple définit également defaultToCurrentSpace sur true, ce qui fait de l'espace actuel la sélection par défaut dans le menu:

JSON

{
  "selectionInput": {
    "name": "spaces",
    "type": "MULTI_SELECT",
    "label": "Selected contacts",
    "multiSelectMaxSelectedItems": 3,
    "multiSelectMinQueryLength": 1,
    "platformDataSource": {
      "hostAppDataSource": {
        "chatDataSource": {
          "spaceDataSource": {
            "defaultToCurrentSpace": true
          }
        }
      }
    }
  }
}

Insérer des éléments à partir d'une source de données externe

Les menus à sélection multiple peuvent également renseigner des éléments à partir d'une source de données tierce ou externe. Pour utiliser une source de données externe, vous devez spécifier le champ externalDataSource dans le widget SelectionInput qui contient la fonction qui interroge et renvoie les éléments de la source de données.

Pour réduire les requêtes envoyées à une source de données externe, vous pouvez inclure des suggestions d'éléments qui s'affichent dans le menu à sélection multiple avant que les utilisateurs ne saisissent du texte dans le menu. Par exemple, vous pouvez renseigner les contacts récemment recherchés par l'utilisateur. Pour insérer des suggestions d'articles à partir d'une source de données externe, spécifiez des objets SelectionItem statiques.

Le code suivant montre un menu à sélection multiple qui interroge et renseigne des éléments à partir d'une source de données externe:

JSON

{
  "selectionInput": {
    "name": "contacts",
    "type": "MULTI_SELECT",
    "label": "Selected contacts",
    "multiSelectMaxSelectedItems": 3,
    "multiSelectMinQueryLength": 1,
    "externalDataSource": { "function": "FUNCTION" },
    // Suggested items loaded by default.
    // The list is static here but it could be dynamic.
    "items": [FUNCTION]
  }
}

Remplacez FUNCTION par l'URL HTTP ou le nom de la fonction Apps Script qui interroge la base de données externe. Pour obtenir un exemple complet illustrant comment renvoyer des éléments suggérés, consultez la section Suggérer des éléments à sélectionner.

Recevoir des données à partir de widgets interactifs

Chaque fois qu'un utilisateur clique sur un bouton, l'action de l'application Chat est déclenchée avec des informations sur l'interaction. Dans la section commonEventObject de la charge utile de l'événement, l'objet formInputs contient toutes les valeurs saisies par l'utilisateur.

Vous pouvez récupérer les valeurs de l'objet commonEventObject.formInputs.WIDGET_NAME, où WIDGET_NAME est le champ name que vous avez spécifié pour le widget. Les valeurs sont renvoyées sous la forme d'un type de données spécifique pour le widget.

Voici une partie d'un objet d'événement dans lequel un utilisateur a saisi des valeurs pour chaque widget:

{
  "commonEventObject": { "formInputs": {
    "contactName": { "stringInputs": {
      "value": ["Kai 0"]
    }},
    "contactBirthdate": { "dateInput": {
      "msSinceEpoch": 1000425600000
    }},
    "contactType": { "stringInputs": {
      "value": ["Personal"]
    }}
  }}
}

Pour recevoir les données, votre application Chat gère l'objet d'événement afin d'obtenir les valeurs que les utilisateurs saisissent dans les widgets. Le tableau suivant montre comment obtenir la valeur d'un widget de saisie de formulaire donné. Pour chaque widget, le tableau indique le type de données accepté par le widget, l'emplacement où la valeur est stockée dans l'objet d'événement et un exemple de valeur.

Widget de saisie de formulaire Type de données d'entrée Valeur saisie à partir de l'objet événement Exemple de valeur
textInput stringInputs event.commonEventObject.formInputs.contactName.stringInputs.value[0] Kai O
selectionInput stringInputs Pour obtenir la première ou la seule valeur, event.commonEventObject.formInputs.contactType.stringInputs.value[0] Personal
dateTimePicker qui n'accepte que des dates. dateInput event.commonEventObject.formInputs.contactBirthdate.dateInput.msSinceEpoch. 1000425600000

Une fois que l'application Chat a reçu des données, elle peut effectuer l'une des opérations suivantes:

Suggérer des éléments à sélectionner

Si une fiche contient un menu à sélection multiple qui remplit des éléments à partir d'une source de données externe, l'application Chat peut renvoyer des suggestions d'éléments en fonction de ce que les utilisateurs saisissent dans le menu. Par exemple, si un utilisateur commence à saisir Atl pour un menu qui affiche les villes des États-Unis, votre application Chat peut suggérer automatiquement Atlanta avant que l'utilisateur ait terminé de saisir. L'application Chat peut suggérer jusqu'à 100 éléments.

Pour suggérer et renseigner dynamiquement des éléments dans un menu à sélection multiple, le widget SelectionInput de la fiche doit spécifier une fonction qui interroge la source de données externe. Pour renvoyer des éléments suggérés, la fonction doit effectuer les opérations suivantes:

  1. Gérez un objet d'événement, que l'application Chat reçoit lorsque les utilisateurs saisissent du texte dans le menu.
  2. À partir de l'objet d'événement, obtenez la valeur que l'utilisateur saisit, qui est représentée dans le champ event.commonEventObject.parameters["autocomplete_widget_query"].
  3. Interrogez la source de données à l'aide de la valeur saisie par l'utilisateur pour obtenir une ou plusieurs SelectionItems à suggérer à l'utilisateur.
  4. Renvoyez des éléments suggérés en renvoyant l'action RenderActions avec un objet modifyCard.

L'exemple de code suivant montre comment une application Chat suggère dynamiquement des éléments dans le menu de sélection multiple d'une carte. Lorsqu'un utilisateur saisit du texte dans le menu, la fonction ou le point de terminaison fournis dans le champ externalDataSource du widget interroge une source de données externe et suggère des éléments que l'utilisateur peut sélectionner.

Node.js

/**
 * Google Cloud Function that responds to events sent from a
 * Google Chat space.
 *
 * @param {Object} req Request sent from Google Chat space
 * @param {Object} res Response to send back
 */
exports.selectionInput = function selectionInput(req, res) {
  if (req.method === 'GET' || !req.body.chat) {
    return res.send('Hello! This function is meant to be used ' +
        'in a Google Chat Space.');
  }
  // Stores the Google Chat event
  const chatEvent = req.body.chat;

  // Handle user interaction with multiselect.
  if(chatEvent.widgetUpdatedPayload) {
    return res.send(queryContacts(req.body));
  }
  // Replies with a card that contains the multiselect menu.
  return res.send({ hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
    cardsV2: [{
      cardId: "contactSelector",
      card: { sections:[{ widgets: [{
        selectionInput: {
          name: "contacts",
          type: "MULTI_SELECT",
          label: "Selected contacts",
          multiSelectMaxSelectedItems: 3,
          multiSelectMinQueryLength: 1,
          externalDataSource: { function: "FUNCTION_URL" },
          // Suggested items loaded by default.
          // The list is static here but it could be dynamic.
          items: [getSuggestedContact("3")]
        }
      }]}]}
    }]
  }}}}});
};

/**
* Get contact suggestions based on text typed by users.
*
* @param {Object} event the event object that contains the user's query
* @return {Object} suggestions
*/
function queryContacts(event) {
  const query = event.commonEventObject.parameters["autocomplete_widget_query"];
  return { action: { modifyOperations: [{ updateWidget: { selectionInputWidgetSuggestions: { suggestions: [
    // The list is static here but it could be dynamic.
    getSuggestedContact("1"), getSuggestedContact("2"), getSuggestedContact("3"), getSuggestedContact("4"), getSuggestedContact("5")
  // Only return items based on the query from the user.
  ].filter(e => !query || e.text.includes(query)) }}}]}};
}

/**
 * Generate a suggested contact given an ID.
 *
 * @param {String} id The ID of the contact to return.
 * @return {Object} The contact formatted as a selection item in the menu.
 */
function getSuggestedContact(id) {
  return {
    value: id,
    startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
    text: "Contact " + id
  };
}

Remplacez FUNCTION_URL par le point de terminaison HTTP qui interroge la source de données externe.

Apps Script

/**
* Responds to a Message trigger in Google Chat.
*
* @param {Object} event the event object from Google Chat
* @return {Object} Response from the Chat app.
*/
function onMessage(event) {
  // Replies with a card that contains the multiselect menu.
  return { hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
    cardsV2: [{
      cardId: "contactSelector",
      card: { sections:[{ widgets: [{
        selectionInput: {
          name: "contacts",
          type: "MULTI_SELECT",
          label: "Selected contacts",
          multiSelectMaxSelectedItems: 3,
          multiSelectMinQueryLength: 1,
          externalDataSource: { function: "queryContacts" },
          // Suggested items loaded by default.
          // The list is static here but it could be dynamic.
          items: [getSuggestedContact"3")]
        }
      }]}]}
    }]
  }}}}};
}

/**
* Get contact suggestions based on text typed by users.
*
* @param {Object} event the interactive event.
* @return {Object} suggestions
*/
function queryContacts(event) {
  const query = event.commonEventObject.parameters["autocomplete_widget_query"];
  return { action: { modifyOperations: [{ updateWidget: { selectionInputWidgetSuggestions: { suggestions: [
    // The list is static here but it could be dynamic.
    getSuggestedContact("1"), getSuggestedContact("2"), getSuggestedContact("3"), getSuggestedContact("4"), getSuggestedContact("5")
  // Only return items based on the query from the user.
  ].filter(e => !query || e.text.includes(query)) }}}]}};
}

/**
* Generate a suggested contact given an ID.
*
* @param {String} id The ID of the contact to return.
* @return {Object} The contact formatted as a selection item in the menu.
*/
function getSuggestedContact(id) {
  return {
    value: id,
    startIconUri: "https://www.gstatic.com/images/branding/product/2x/contacts_48dp.png",
    text: "Contact " + id
  };
}

Transférer des données vers une autre carte

Une fois qu'un utilisateur a envoyé les informations d'une fiche, vous devrez peut-être renvoyer des fiches supplémentaires pour effectuer l'une des opérations suivantes:

  • Aidez les utilisateurs à remplir des formulaires plus longs en créant des sections distinctes.
  • Permettez aux utilisateurs de prévisualiser et de confirmer les informations de la fiche initiale afin qu'ils puissent vérifier leurs réponses avant de les envoyer.
  • Renseignez dynamiquement les autres parties du formulaire. Par exemple, pour inviter les utilisateurs à créer un rendez-vous, une application Chat peut afficher une fiche initiale qui demande le motif du rendez-vous, puis renseigner une autre fiche qui indique les heures disponibles en fonction du type de rendez-vous.

Pour transférer les données saisies à partir de la fiche initiale, vous pouvez créer le widget button avec des actionParameters contenant le name du widget et la valeur saisie par l'utilisateur, comme illustré dans l'exemple suivant:

{
  "buttonList": { "buttons": [{
    "text": "Submit",
    "onClick": { "action": {
      "function": "submitForm",
      "parameters": [
        {
          "key": "WIDGET_NAME",
          "value": "USER_INPUT_VALUE"
        },
        // Can specify multiple parameters
      ]
    }}
  }]}
}

WIDGET_NAME est le name du widget et USER_INPUT_VALUE est ce que l'utilisateur saisit. Par exemple, pour une saisie de texte qui collecte le nom d'une personne, le nom du widget est contactName et un exemple de valeur est Kai O.

Lorsqu'un utilisateur clique sur le bouton, votre application Chat reçoit un objet d'événement à partir duquel vous pouvez recevoir des données.

Répondre à l'envoi d'un formulaire

Après avoir reçu les données d'un message ou d'une boîte de dialogue de carte, l'application Chat répond en confirmant la réception ou en renvoyant une erreur.

Dans l'exemple suivant, une application Chat envoie un message texte pour confirmer qu'elle a bien reçu un formulaire envoyé à partir d'un message de carte.

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 payloads in the event object
  if(chatEvent.messagePayload) {
    return res.send(handleMessage(chatMessage, chatEvent.user));
  // Handle button clicks on the card
  } 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."
  }}}}};
}

Pour traiter et fermer une boîte de dialogue, vous renvoyez un objet RenderActions qui spécifie si vous souhaitez envoyer un message de confirmation, mettre à jour le message ou la fiche d'origine, ou simplement fermer la boîte de dialogue. Pour connaître la procédure à suivre, consultez la section Fermer une boîte de dialogue.

Résoudre les problèmes

Lorsqu'une application ou une fiche Google Chat renvoie une erreur, l'interface Chat affiche le message "Un problème s'est produit". ou "Impossible de traiter votre demande". Il arrive que l'interface utilisateur de Chat n'affiche aucun message d'erreur, mais que l'application ou la fiche Chat produise un résultat inattendu. Par exemple, un message de fiche peut ne pas s'afficher.

Bien qu'un message d'erreur ne s'affiche pas dans l'interface utilisateur de Chat, des messages d'erreur descriptifs et des données de journal sont disponibles pour vous aider à corriger les erreurs lorsque la journalisation des erreurs pour les applications Chat est activée. Pour savoir comment afficher, déboguer et corriger les erreurs, consultez Résoudre et corriger les erreurs Google Chat.