# Tableau de bord

C'est la premiÚre page sur laquelle vous arrivez quand vous accédez à votre application.

Vous y retrouverez l'ensemble des statistiques de votre chatbot. Voici en dĂ©tails les Ă©lĂ©ments que vous retrouvez 👇👇

# Stats d'usage

# Nouveaux utilisateurs

C'est le nombre de nouvelles personnes qui ont entamé la conversation avec le chatbot au cours de la période de temps sélectionnée.

# Utilisateurs actifs

C'est le nombre total de personnes différentes qui ont parlé au chatbot dans la période de temps sélectionnée. Il est toujours au moins égal au nombre de nouveaux utilisateurs.

# Nombre de messages

C'est le nombre de messages que le bot a reçus dans la période de temps sélectionnée.

Par exemple sur l'image ci-dessous nous avons:

  • 307 nouveaux utilisateurs du 16/06/2021 au 22/06/2021
  • 314 utilisateurs actifs sur la mĂȘme pĂ©riode
  • 1033 messages reçus par le chatbot

image

# Contenus

Vous souhaitez savoir quelles ressources sont le plus consultées par vos utilisateurs ? Nous avons rajouté un onglet contenus dans le dashboard qui vous permet de voir la liste des 15 sujets les plus consultés par les utilisateurs.

Nous allons amĂ©liorer progressivement cet onglet donc n'hĂ©sitez pas Ă  revenir vers nous avec les donnĂ©es que vous souhaiteriez voir dans cet onglet đŸ€

# Stats de NLU

Les statistiques de compréhension sont utiles pour analyser l'efficacité de votre paramétrage NLU.

Cette rubrique contient les statistiques suivantes :

  • Nombre de requĂȘtes traitĂ©es
  • Nombre de requĂȘtes comprises
  • Nombre de requĂȘtes non comprises
  • Nombre de requĂȘtes notĂ©es positivement
  • Nombre de requĂȘtes notĂ©es nĂ©gativement
  • Un tableau classant les couples intention/entitĂ©s par nombre de requĂȘtes comprises dĂ©croissant

En haut à gauche de votre écran vous pouvez sélectionner une période de temps. Toutes les statistiques mises à disposition seront calculées sur cette période.

Je vais maintenant décrire chacune de ces statistiques :

# Nombre de requĂȘtes traitĂ©es

Il s'agit du nombre de messages tapés par l'ensemble des utilisateurs du chatbot en langage naturel (en écrivant dans la bar de chat).

# Nombre de requĂȘtes comprises (Ă  revoir)

Il s'agit du nombre de messages tapĂ©s par l'ensemble des utilisateurs du chatbot en langage naturel qui ont Ă©tĂ© redirigĂ©s vers la bonne ressource (oĂč le chatbot a rĂ©pondu le message escomptĂ©, correspondant Ă  la requĂȘte de l'utilisateur).

# Nombre de requĂȘtes non comprises (Ă  revoir)

Il s'agit du nombre de messages tapés par l'ensemble des utilisateurs du chatbot en langage naturel qui n'ont pas été comprises...

# Nombre de requĂȘtes notĂ©es positivement

Il s'agit du nombre de fois oĂč le pouce vert a Ă©tĂ© utilisĂ© pour noter positivement un message du chatbot.

# Nombre de requĂȘtes notĂ©es nĂ©gativement

Il s'agit du nombre de fois oĂč le pouce rouge a Ă©tĂ© utilisĂ© pour noter nĂ©gativement un message du chatbot.

# Liste des requĂȘtes mal comprise par le chatbot

Ce tableau liste toutes les requĂȘtes utilisateurs qui ont Ă©tĂ© mal perçues par le chatbot.

# Couples intention/identité les plus utilisés

Vous retrouverez ici les combinaisons intention + entités les plus trouvées par l'algorithme.
En face de chaque combinaison, nous affichons les éventuelles notes positives et négatives données par vos utilisateurs. Cela vous permet d'identifier des éventuelles combinaisons défaillantes.

# Stats personnalisées

Les statistiques personnalisées vont vous permettre de suivre let KPI de votre chatbot en créant des graphiques personnalisés. Ces statistiques sont basées sur les valeurs stockées dans les attributs de la mémoire du chatbot.

Vous avez le choix entre trois types de graphique :

  • Valeur simple : affiche le nombre de rĂ©ponses enregistrĂ©es sous un attribut (ex: nombre de personnes ayant rĂ©pondu Ă  la premiĂšre question)
  • RĂ©partition : affiche la rĂ©partition des rĂ©ponses Ă  un attribut donnĂ©e (ex: sur quel bouton ont le plus cliquĂ© mes utilisateurs Ă  l'introduction)
  • Graphique : affiche le nombre de rĂ©ponses enregistrĂ©es sous un attribut dans le temps (ex: Ă©volution du nombre de personnes ayant rĂ©pondu Ă  la premiĂšre question)

# Ajouter une nouvelle statistique

Commencez par vous rendre dans le Menu "Tableau de bord" de votre chatbot. Puis sélectionnez l'onglet "Statistiques personnalisées". Vous avez désormais la possibilité de créer des statistiques en cliquant sur le bouton "Créer un graphe" en haut à droite de votre écran.

La premiĂšre Ă©tape est de choisir un nom et une description pour votre graphe.

Ensuite, vous pouvez choisir trois types de graphes :

  • Valeur simple : affichage d'une simple valeur calculĂ©e
  • RĂ©partition : affichage de proportions numĂ©riques
  • Graphique : affichage de graphes

# Valeur simple

Vous devez choisir l'attribut sur lequel le calcul de la valeur finale sera basé.

Dans mon cas, je cherche à savoir combien de personnes ont cliqué ou écrit Wifi à la ressource Menu FAQ.

Optionnel : Il est possible d'afficher cette valeur en fonction d'un autre attribut. Dans mon cas, j'affiche ma valeur uniquement pour les utilisateurs ayant préalablement cliqué ou écrit FAQ dans la ressource intro.

Vous pouvez désormais admirer votre nouvelle statistique de type Valeur simple !

# RĂ©partition (camembert)

Vous devez dans un premier temps choisir sur quel critÚre vous allez regrouper les utilisateurs. Dans mon cas, je souhaite différencier les utilisateurs selon leurs réponses à la ressource Menu FAQ.

Puis, vous pouvez choisir d'ajouter un critÚre pour filtrer la donnée. Dans mon cas, je souhaite comprendre la répartition des réponses utilisateurs à la ressource Menu FAQ seulement pour les utilisateurs qui ont répondu "FAQ" à la ressource intro.

A présent vous pouvez profiter de votre graphe de répartition !

PS : Pour comprendre à quoi correspond chaque part du camembert, il suffit de passer le curseur de votre souris dessus 😉

Attention, le graphique montre les requĂȘtes en langage naturel ET les clics de boutons. Il peut donc y avoir beaucoup de parts au camembert. Nous travaillons actuellement sur cette problĂ©matique.

# Graphique

Cette fonctionnalitĂ© n'est pas encore disponible, bientĂŽt dans les bacs 😉

Contactez-nous via le chat en bas Ă  droite si vous en avez besoin rapidement.

Comment sont comptabilisées les réponses ?

Nous comptons une rĂ©ponse par process. C'est Ă  dire que si un utilisateur a rĂ©pondu 3 fois Ă  la mĂȘme compĂ©tence action (crĂ©ation de ticket par exemple). Nous allons comptabiliser 3 rĂ©ponses Ă  l'attribut qui correspond. (voir l'exemple d'un processus ci-dessous pour plus d'explication)
Si l'utilisateur modifie une de ses réponse, nous comptabilisons que la derniÚre réponse donnée.

On peut utiliser les selecteurs de date du haut de l'écran pour choisir la période de temps qui nous correspond.

DANGER

Nous ressortons ici toutes les réponses pour un attribut qui ont été donné dans la période de temps sélectionnée.

# Exemple d'un processus

Exemple: Je réponds compétence action qui comprend 2 attributs: nom, prénom.

Que souhaitez vous faire?

Me présenter
Créer un ticket

Me présenter

Quel est votre nom?

Benoit

Bonjour, Quel est votre prénom?

Benoit

Merci, validez vous les informations ci-dessous ?

Modifier nom
Modifer prénom
Valider

Valider

Merci Benoit Benoit, que souhaitez vous faire maintenant ?

Me présenter
Créer un ticket

Me présenter

Quel est votre nom?

Vizir

Bonjour, Quel est votre prénom?

Benoit

Merci, validez vous les informations ci-dessous ?

Modifier nom
Modifer prénom
Valider

Valider

Merci Benoit Vizir, que souhaitez vous faire maintenant ?

Me présenter
Créer un ticket

TIP

Dans ce cas, nous aurons 2 répondants à l'attribut "nom" et 2 répondants à l'attribut "prénom".
Par contre nous aurons 1 seul utilisateur.

# Stats de notation

Avant de mettre en place des statistiques de notation, vous devez activer l'option de notation du chatbot. 👉 Retrouvez la documentation ici

Une fois le module activé (et qu'au moins une note a été collectée) alors les données s'affiche tout simplement ici.

Vous retrouverez le nombre de note reçues :

Ainsi que les commentaires des utilisateurs :

Nous travaillons actuellement à la lisibilité de ce tableau qui est pour l'instant au format JSON.

Pour toute question concernant cet article, n'hésitez pas à utiliser le chat en bas à droite de votre écran.

# Visualiser et exporter les statistiques d'usage du bot

Sur la page d'accueil (section Tableau de bord), rendez-vous sur l'onglet "Export". Le champ "Vision" vous permet de choisir la présentation des données d'usage :

  • Vision Uilisateurs : Une ligne par rĂ©pondant. C'est une vue synthĂ©tique.
  • Vision RĂ©ponses : Une ligne par rĂ©ponse. Un rĂ©pondant appraitra autant de fois qu'il a rĂ©pondu ou interaggi avec le bot. RĂ©flĂšte l'exhaustivitĂ© des donnĂ©es.

Quelle que soit la "Vision" choisie, vous pouvez aussi renseigner les champs suivants :

Filtres sur les attributs : en saisissant vos filtres sous la forme filtre_un:valeur_un,filtre_deux:valeur_deux,....

Sélection des champs : Définit les "colonnes" du résultas retourné. Vous permet de ne sélectionner que les champs/attributs des répondants/ qui vous intéressent. Pour récupérer tous les champs/attributs, désélectionner tout.

â„č A part les champs prĂ©fixĂ©s par "[Global]" qui sont des donnĂ©es "racines" Ă  chaque ligne de stats, toutes les autres valeurs proposĂ©es sont simplement les attributs de votre bot.

â„č Pour sĂ©lectionner/dĂ©selectionner tous les attributs d'une compĂ©tence, cliquez sur le nom de la compĂ©tence (sur fond gris) dans la liste de choix.

Le sĂ©lecteur "Stats Server" indique que les donnĂ©es sont rĂ©cupĂ©rĂ©es depuis notre serveur dĂ©diĂ© aux statistiques (⚠ Ă  laisser tel quel, sauf si les donnĂ©es Ă  rĂ©cupĂ©rer sont antĂ©rieureurs au 16 mars 2022, dans ce cas dĂ©selectionner cette option, mais sachez que vous ne pourrez rĂ©cupĂ©rer que des donnĂ©es antĂ©rieures Ă  dĂ©but juin 2022)

# Spécificités de la "Vision Réponses"

Lorsque "Vision Réponses" est sélectionnée, deux nouveaux paramÚtres sont disponibles :

  • SĂ©lection types de dĂ©clencheurs : vous permet d'affiner votre export en fonction du type d'interaction. Les interactions les plus courantes sont de types "answers" (saisie textuelle ou clic sur une suggestion de rĂ©ponses). Voici la liste de toutes les interactions disponibles (en fonction des plateformes de chat) :
    • widget_open_click : Le widget a Ă©tĂ© ouvert via un clic de l'utilisateur (web ; ⚠ aprĂšs que la conversation ait Ă©tĂ© initialisĂ©e)
    • quick_reply_url_click : Clic sur un bouton de type URL (web)
    • carousel_item_url_click : Clic sur le lien associĂ© Ă  un item de carousel (web)
    • carousel_button_click : Clic sur un bouton de carousel (web, Facebook/Workplace, Teams)
    • carousel_button_url_click : Clic sur un bouton de carousel de type URL (web)
    • carousel_button_download_click : Clic sur un bouton de carousel de type "Download" (web)
    • burger_entry_url_click : Clic sur un item du Burger Menu de type URL (web)
    • burger_entry_postback_click : Clic sur un item du Burger Meny de type "postback" (web)
    • result_list_item_select : Clic sur un item d'une liste de rĂ©sultats (Teams)
    • restart_button_click : Clic sur le bouton "RedĂ©marrer" (web)
    • process_start : DĂ©marrage d'une compĂ©tence Action (tous)
    • process_end : Fin d'une compĂ©tence Action (tous)
    • create_issue_button_click: Clic sur le bouton de crĂ©ation de ticket
    • issue_resolved_button_click: Clic sur le bouton "ProblĂšme rĂ©solu"
    • widget_redirection: RequĂȘte envoyĂ©e automatiquement suite Ă  une redirection depuis un autre site (via l'utilisation du paramĂštre d'url "chatbot")

â„č Ces deux derniers "dĂ©clencheurs" sont prĂ©sĂ©lectionnĂ©s par dĂ©faut, mais sachez qu'ils mĂšnent Ă  une duplication du nombre de "RĂ©ponses". En effet, lorsqu'un rĂ©pondant dĂ©marre une compĂ©tence Action, sont crĂ©Ă©s une rĂ©ponse avec pour dĂ©clencheur "process_start" et valeur "Nom_compĂ©tence" et une autre avec pour dĂ©clencheur "process_end" et valeur "true". Elles ne correspondent Ă  aucune interaction rĂ©elle du rĂ©pondant, mais peuvent s'avĂ©rer utile pour compter le nombre d'Actions dĂ©marĂ©es et/ou terminĂ©es.

  • Filtrage sur la resource/attribut et/ou sur une valeur de rĂ©ponse donnĂ©e par les rĂ©pondants. Permet de rĂ©cupĂ©rer seulement les RĂ©ponses Ă  une certaine Ressource (dĂ©signĂ©e par le nom d'un de ses attributs correspondants) et/ou avec une certaine valeur donnĂ©e.

# Exporter via Google Sheets

DANGER

Les données des exports sont stockées avec la date de la réponse du répondant, donc vous pourrez avoir des différentiels entre les données d'un répondant (dans l'onglet conversation) et vos exports.

DANGER

Nous stockons tout le temps le payload de la réponse (boutons, carousel, Burger Menu).

TIP

Nous avons mis à jour le fichier d'export des statistiques en Avril 2021. Si vous utilisez l'ancienne version (disponible jusqu'en décembre 2021), veuillez vous reporter à cette page ancienne doc

Vous pouvez exporter les données directement dans Spreadsheet pour ensuite faire votre propre analyse.

Voici le fichier de base: ouvrir (opens new window)

Il a 2 onglets:

  • convStatistics: exporter les donnĂ©es de conversation
  • attributeStatistics: exporter les donnĂ©es des attributs et des compĂ©tences

Voici comment faire:

  • Dupliquez la feuille de calcul dont vous avez besoin pour l'insĂ©rer dans le fichier de votre choix.
  • Ouvrez l'Ă©diteur de script >Outils>Editeur de scripts
  • Coller le script ci-dessous
  • Remplacer la ligne 2 avec votre token que vous rĂ©cupĂ©rez dans le dashboard Vizir (mon compte > token)
  • Lancer initScript pour valider les droit Vizir sur ce fichier. Run script
  • ComplĂ©ter le tableau de chaque onglet (que vous pouvez renommer)
    • ChatbotId: A rĂ©cupĂ©rer directement dans l'url de votre dashboard comme ci dessous chatbotId

    • Environnement ID: A rĂ©cupĂ©rer dans les paramĂštres d'Environnement de votre chatbot envID

    • apikey et apisecret: A rĂ©cupĂ©rer dans votre compte account token

    • URL data: A rĂ©cupĂ©rer sur le dashboard dans Exporter les donnĂ©es, copiez le lien et collez le dans la cellule export_dashboard

TIP

Si vous souhaitez utiliser un couple (apikey, apisecret) différent aprÚs l'initialisation c'est possible. Veuillez à remplir la case token avec comme ceci: apikey:apisecret

# Script Google Sheet

/* Variables to modify */
var token = undefined;
var apikey = 'LKwu8L6f****'
var apisecret = 'Htfam2Y30SEa408Jb********';
var dataSheets = {
  conversationStatistics: ['convStatistics'],
  attributeData: [],
  resourceStatistics: ['resourcesStatistics']
}


/* Fixed variables */
var dataTypes = ['attributeData', 'conversationStatistics', 'resourceStatistics']
var baseUrl = 'https://developers.vizir.co'
var functionCell = 'D5';
var cells = {
  conversationStatistics: {
    chatbotIdCell: 'D6',
    envIdCell: 'D7',
    tokenCell: 'D8',
    weekNumberCell: 'D9',
    overwriteCell: 'D10',
    addHeaders: 'D11',
    firstRowData: 13
  },
  attributeData: {
    chatbotIdCell: 'D6',
    envIdCell: 'D6',
    tokenCell: 'D6',
    startingDate: 'D7',
    endingDate: 'D8',
    urlApiCell: 'D9',
    overwriteCell: 'D10',
    addHeaders: 'D11',
    firstRowData: 13
  },
  resourceStatistics: {
    chatbotIdCell: 'D6',
    envIdCell: 'D7',
    tokenCell: 'D7',
    weekNumberCell: 'D8',
    overwriteCell: 'D9',
    addHeaders: 'D10',
    firstRowData: 14
  }
}



/**********************************************************
                        AUTOMATION
/**********************************************************/
function automateGetStatistics () {
  // Goal: Write the week number and new date boundaries in order to launch the script


  let today = new Date();
  let endOfWeek = new Date(new Date().setDate(new Date().getDate() + 7))
  let weekNumber = getWeekNumber(today)
  for (let d = 0; d< dataTypes.length; d++) {
    let type = dataTypes[d]
    for (let i=0; i< dataSheets[type].length; i++) {
      if (type === 'attributeData') {
        writeValuesSheetName(today, cells[type].startingDate, dataSheets[type][i])
        writeValuesSheetName(endOfWeek, cells[type].endingDate, dataSheets[type][i]);
      } else if (type === 'conversationStatistics') {
        writeValuesSheetName(weekNumber[1], cells[type].weekNumberCell, dataSheets[type][i])
      }
      getFunctionsValues(true, dataSheets[type][i]);
    }
  }


}

function getWeekNumber(d) {
    // Copy date so don't modify original
    d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
    // Set to nearest Thursday: current date + 4 - current day number
    // Make Sunday's day number 7
    d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay()||7));
    // Get first day of year
    var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
    // Calculate full weeks to nearest Thursday
    var weekNo = Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7);
    // Return array of year and week number
    return [d.getUTCFullYear(), weekNo];
}



/**********************************************************
                        SCRIPT
/**********************************************************/

function getFunctionsValues(forceAddValues = false, sheetName = undefined) {
  if (!sheetName) {
    // Case click on button
    sheetName = SpreadsheetApp.getActiveSheet().getName();
  }
  var func = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(functionCell).getValue();
  var chatbotId = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(cells[func].chatbotIdCell).getValue();
  var envId = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(cells[func].envIdCell).getValue();
  var token = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(cells[func].tokenCell).getValue();
  var overwriteValues = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(cells[func].overwriteCell).getValue();
  var addHeaders = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(cells[func].addHeaders).getValue();
  Logger.log(chatbotId)
  if (forceAddValues) {
    // Add line based on cron job
    overwriteValues = false;
    addHeaders = false;
  }
  var values;
  var headers;
  if (func == 'conversationStatistics') {
    [headers, values] = getConversationStatistics_(sheetName, chatbotId, envId, token)
  } else if (func == 'attributeData') {
    [headers, values] = getAttributeStatistics_(sheetName, token)
  } else if (func === 'resourceStatistics') {
    [headers, values] = getResourceStatistics_(sheetName, chatbotId, envId)
  }

  if (!values || values.length == 0) {
    // Set empty values
    values = [['']]
  }

  if (overwriteValues) {
    resetValues(sheetName, cells[func].firstRowData);
  }
  firstRowData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getLastRow();
  if (addHeaders && headers && headers.length>0) {
    writeValues(headers, firstRowData, sheetName);
  }
  firstRowData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getLastRow();
  writeValues(values, firstRowData, sheetName);
}


/*
  G sheet functions
  get and reset Values
*/
function resetValues(sheetName, firstRowData) {
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(firstRowData + 1, 1,SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getLastRow(), SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getLastColumn()).clearContent();
}

function writeValuesResources (values, startingLine, sheetName) {
   var range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(startingLine+1,1,values.length,values[0].length);
  range.setValues(values);
  return;
}

function writeValues (values, startingLine, sheetName) {
  var range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(startingLine+1,1,values.length,values[0].length);
  range.setValues(values);
  return;
}

function writeValuesSheetName (value, cell, sheetName) {
  var range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(cell);
  range.setValue(value);
  return;
}

/*
  Internal Functions
*/
function ImportJSONAdvanced_(url, fetchOptions, query) {
  if (query) {
    for (let key in query) {
      if (url.indexOf('?') === -1) {
        url= url + '?'+key+'=' + query[key]
      } else {
        url= url + '&'+key+'=' + query[key]
      }
    }
  }
  var jsondata = UrlFetchApp.fetch(url, fetchOptions);
  var object   = JSON.parse(jsondata.getContentText());
  return object;
}

function ImportJSONBearerAuth_(url, token, query) {
  var header = {headers: {Authorization: "Bearer " + token}};
  return ImportJSONAdvanced_(url, header, query);
}

function ImportJSONApiKeyAuth_(url,token, query) {
  if (apikey == '' || apikey == '') {
    [apikey, apisecret] = token.split(':')
  }
  var header = {headers: {apikey: apikey, apisecret: apisecret}};
  return ImportJSONAdvanced_(url, header, query);
}


/*
  Vizir Functions
*/
function getConversationStatistics_(sheetName, chatbotId, envId, token) {
  var weeknumber = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(cells.conversationStatistics.weekNumberCell).getValue();
  var url = baseUrl + '/chatbots/'+chatbotId+ '/environments/'+ envId +'/statistics/sheets';
  var query = {
    week_number: weeknumber
  }
  let columns = ['Week Number','from', 'nb_users', 'new_users', 'nb_messages', 'nb_live_messages', 'total_request', 'understood', 'notunderstood']
  var data;
  if (token && token.indexOf('ey') > -1 ) {
    data = ImportJSONBearerAuth_(url, token, query)
  } else {
    data = ImportJSONApiKeyAuth_(url, token, query)
  }
  if (data && data.arrayPerso) {
    for (let d=0; d< data.arrayPerso.length; d++) {
      columns.push(data.arrayPerso[d]);
    }
  }
  let returnData = [weeknumber]
  for (let i=1; i< columns.length; i++) {
    returnData.push(data[columns[i]])
  }
  return [[columns], [returnData]];
}
function getDateOfISOWeek(w, y) {
    var simple = new Date(y, 0, 1 + (w - 1) * 7);
    var dow = simple.getDay();
    var ISOweekStart = simple;
    if (dow <= 4)
        ISOweekStart.setDate(simple.getDate() - simple.getDay() + 1);
    else
        ISOweekStart.setDate(simple.getDate() + 8 - simple.getDay());
    return ISOweekStart;
}

function getStartingAndEndingWeek(date) {
  return [new Date(date).getTime(), new Date(date).getTime() + 7*24*60*60*1000]
}


function getAttributeStatistics_(sheetName, token) {
  var url = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(cells.attributeData.urlApiCell).getValue();
  var startingDate = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(cells.attributeData.startingDate).getValue();
  var endingDate = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(cells.attributeData.endingDate).getValue();
  url = url + '&from='+ startingDate.getTime() + '&to=' + endingDate.getTime()  
  var data;
  if (token && token.indexOf('ey') > -1 ) {
    data = ImportJSONBearerAuth_(url, token, {})
  } else {
    data = ImportJSONApiKeyAuth_(url, token, {})
  }
  if (Array.isArray(data.data[0])) {
    // Old function that return arrays
    headers = data.data[0];
    result = data.data.splice(0,1)
  } else {
    // New function that return json
    [headers, emptyLine] = getHeaders(data.data)
    result = getValues(data.data, headers, emptyLine)
  }
  return [[headers], result];
}

function getResourceStatistics_(sheetName, chatbotId, envId) {
  var weeknumber = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange(cells.resourceStatistics.weekNumberCell).getValue();
  var year = new Date().getFullYear();
  var date = getDateOfISOWeek(weeknumber, year);
  var startingDates = getStartingAndEndingWeek(date)
  var url = baseUrl + '/chatbots/'+chatbotId+ '/environments/'+ envId +'/statistics/resources?page=1&from='+ startingDates[0] + '&to=' + startingDates[1];
  var query = {
    week_number: weeknumber
  }
  let columns = ['Week Number','from', 'Resource Title', 'Nombre de vues']
  var data;
  data = ImportJSONApiKeyAuth_(url, token, query)
  let result = data.data.map(line => ["", weeknumber,new Date(startingDates[0]), line.title, line.nb_users])
  return [[columns], result]
}

function getHeaders (data) {
  var headers = [];
  var emptyLine = [];
  data.map(line => {
    for (key in line) {
      if (headers.indexOf(key) === -1) {
        headers.push(key);
        emptyLine.push('')
      }
    }
  })
  return [headers, emptyLine];
}
function getValues (data, headers, emptyLine) {
  var values = [];
  data.map(line => {
    var lineValues = JSON.parse(JSON.stringify(emptyLine));
    for (key in line) {
      var index = headers.indexOf(key);
      lineValues[index] = line[key];
    }
    values.push(lineValues);
  })
  return values;
}
/*
  Initiation Script
*/
function initScript () {
  var url = baseUrl + '/chatbots';
  var data;
  var query = {};
  if (token && token.indexOf('ey') > -1 ) {
    data = ImportJSONBearerAuth_(url, token, query)
  } else {
    data = ImportJSONApiKeyAuth_(url, token, query)
  }
  return data.data;
}

/*
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Vizir')
    .addSubMenu(ui.createMenu('Data')
          .addItem('Conversation Statistics Template', 'importConversationStatisticsTemplate')
          .addItem('Attribute Data Template', 'importGetAttributeStatisticsTemplate'))
    .addToUi();
}
*/

# Bonus automatiser la récupération des statistiques

Avec cette nouvelle version disponible depuis le 15 avril 2021, vous pouvez facilement automatiser la récupération des statistiques à intervals réguliers.

Voici comment le faire:

# DĂ©clarer les Feuilles de calcul

Dans le script que vous avez collez dans google Script vous pouvez voir en ligne 3 la déclaration suivante:

var dataSheets = {
  conversationStatistics: ['convStatistics'],
  attributeData: []
}

Le script que nous allons lancer de maniÚre automatique tous les lundi (ou tout autre jour de la semaine), va récupérer la liste de toutes les feuilles de calculs présentes dans cette liste.

Ajouter le nom de vos feuilles de calcul dans la liste qui correspond.

DANGER

Il est indispensable de bien respecter le type de données qu'on récupÚre. Indiquez bien dans conversationStatistics la liste des feuilles de calculs qui récupÚrent des données de conversation et dans attributeData la liste des feuilles de calculs qui récupÚrent les données d'attributs.

# Automatiser le lancement du script

  • Cliquez sur la gauche de l'Ă©cran sur DĂ©clencheurs (comme ci dessous)
  • En bas Ă  droite, cliquez sur ajouter un dĂ©clencheur
  • Choisissez la fonction automateGetStatistics et Choisissez les paramĂštres comme vous le souhaitez

Et voilà ✹✹✹!!

Tous les lundi entre 7h et 8h vous aurez vos statistiques qui seront remontées dans votre Excel.