Bots de conversa de Telegram amb Google Apps Script

Bots de conversa Exemples Dades pràctiques   Recursos CITCEA
Google Apps Script Projectes Interacció   Inici

Assessor gastronòmic

Aquest bot de Telegram permet calcular la propina que correspondria deixar a un restaurant en funció del servei rebut. També permet saber la valoració d'un restaurant a partir de les opinions d'altres clients que hi han menjat abans.

La informació entrada pels usuaris es guarda en un full de càlcul.

El programa de l'script és el següent:

var token = "^^60512424:AAFFnK2p4CapGkG4EL5gnugb4kfZJ9_enb4"; // API Token de Telegram
var telegramUrl = "https://api.telegram.org/bot" + token; // URL que comunica el bot amb Telegram
var webAppUrl = "https://script.google.com/macros/s/^^fycbzXXqhlN8rzkm_bvFLuXqVuCatEU6Hm02zWg5pUNbgBmohtOVSzJ8jl9LW9JUCboESLjQ/exec";
var spreadsheetId = '^^dg2aYBjhNq_V9sEs-7Bj3n2LDdoCPMI7nunlODO5vw'; // URL del full de càlcul
var missatges = new Array(3);  // Missatges que enviarem a l'usuari amb les preguntes 
missatges[0] = "Quin és el nom del restaurant?\nEscriu el nom igual que surt escrit a la retolació del local.";
missatges[1]="Quin ha estat el preu? \nEscriu l'import amb tan sols el valor numèric."
missatges[2]='Prem /valoracio per començar amb les preguntes de satisfacció sobre el restaurant.'
function doPost(e) {
  var data = JSON.parse(e.postData.contents);
  if (data.message) { // Mirem si es un misssatge escrit al xat
    var text = data.message.text; // Guardem el text
    var id = data.message.chat.id; // Guardem el id el usuari
    if (text == '/start') { 
      var keyboard = {
        'inline_keyboard': [
          [{
            'text': 'Ajuda',
            'callback_data': 'Ajuda'
          }],
          [{
            'text': "Informació d'un restaurant",
            'callback_data': 'Restaurant'
          }],
          [{
            'text': 'Càlcul de propina',
            'callback_data': 'Propina'
          }]
        ]
      };
      sendText(id, 'Benvingut!', JSON.stringify(keyboard));
    }
    if (text == '/help') {
      var help = "Hola! Soc el teu assessor gastronòmic. Les meves funcions són ";
      help = help + "ajudar-te a determinar la quantitat adequada de propina segons les teves ";
      help = help + "valoracions i oferir-te valoracions d'alguns restaurants valorats per altres ";
      help = help + "usuaris. Per començar, prem /start al menú de comandes.";
      sendText(id,help)
    }
    if (text.startsWith('-')) {
      var query = text.slice(1).trim();
      var sh = SpreadsheetApp.openById(spreadsheetId).getSheetByName("Fulll");  
      var dades = sh.getDataRange().getValues();  
      var dar_fil = sh.getLastRow();  
      var fila = 0;
      var n=0;
      for(var i = 0; i < dar_fil; i++){  
        var row = dades[i];  
        var restaurantexcel = row[2]; 
        var mitjanaexcel = row[10] 
        if(restaurantexcel.toLowerCase() == query.toLowerCase()){
          // Mirem si el restaurant té alguna valoració
          n++;
          fila += mitjanaexcel;  
        }
      }
      if (n==0){ // Si no hi ha valoracions
        var tt = "No s'han trobat valoracions d'aquest restaurant, o bé no has escrit el nom correctament";
        sendText(id,tt);
      } else{
        var mitjanaglobal = Math.round(fila/n); // Calculem la mitjana de les valoracions del restaurant
        var tt = 'La mitjana de les valoracions enregistrades és de ' + mitjanaglobal;
		tt = tt + + " sobre 10, d'un total de " + n + " valoracions diferents valorant el menjar, ";
		tt = tt + + "el servei, l'espai, la localització i la relació qualitat-preu.";
        sendText(id, tt);
      }
    }
    if (text == '/valoracio') {
      var keyboard = {
        'inline_keyboard': [
          [{
            'text': 'Dolent',
            'callback_data': 'menjar&1'
          },
          {
            'text': 'Regular',
            'callback_data': 'menjar&2'
          }],
          [{
            'text': 'Bo',
            'callback_data': 'menjar&3'
          },
          {
            'text': 'Excel·lent',
            'callback_data': 'menjar&4'
          }]
        ]
      };
      sendText(id, 'Puntuació del menjar', JSON.stringify(keyboard));
    } else {  // Si no comença per / potser és un paràmetre
      param(id, text);
    }
  } else if (data.callback_query) { // Mirem si és la resposta d'un teclat
    var callbackData = data.callback_query.data;
    var id = data.callback_query.message.chat.id;
    if (callbackData == 'Ajuda'){
      var help = "Hola! Soc el teu assessor gastronòmic. Les meves funcions són ";
      help = help + "ajudar-te a determinar la quantitat adequada de propina segons les teves ";
      help = help + "valoracions i oferir-te valoracions d'alguns restaurants valorats per altres ";
      help = help + "usuaris. Per començar, prem /start al menú de comandes.";
      return sendText(id,help)
    }
  }
  if (callbackData == 'Propina'){
    iniParam(id);
  }
  if (callbackData == 'Restaurant'){
    var tt = "Escriu seguit del símbol - el nom del restaurant (el que pots trobar ";
    tt = tt + "a Google Maps) sense cap espai, del qual necessites informació.\n";
    tt = tt + "Exemple: -El celler de Can Roca";
    sendText(id,tt);
  }
  if(callbackData == 'menjar&1'|| callbackData == 'menjar&2' || callbackData == 'menjar&3' || callbackData == 'menjar&4'){
    // Si és una valoració de la qualitat del menjar
    var sh = SpreadsheetApp.openById(spreadsheetId).getSheetByName("Fulll");
    var dades = sh.getDataRange().getValues();  // Agafem el contingut
    var fila = 0; 
    var dar_fil = sh.getLastRow();  // Índex de la darrera filera
    for(var i = 0; i < dar_fil; i++){
      // Mirem totes les dades per a buscar l'últim lloc on apareix l'usuari actual al full de càlcul
      var row = dades[i];  // Agafem una filera
      var num_usuari = row[0];  // Agafem el número d'usuari de la filera
      if(num_usuari == id){  // Mira si és l'usuari aactual
        fila = i+1;  // Sumem 1 al index del usuari actual
      }
    }  
    var valmenjar = callbackData.split('&'); // Separem
    var rang = sh.getRange(fila,6); // Agafem la casella on volem guardar l'informació
    rang.setValue(valmenjar[1]); // Col·loquem el valor a la casella
    var keyboard = {
      'inline_keyboard': [
        [{
          'text': 'Dolent',
          'callback_data': 'servei&1'
        },
        {
          'text': 'Regular',
          'callback_data': 'servei&2'
        }],
        [{
          'text': 'Bo',
          'callback_data': 'servei&3'
        },
        {
          'text': 'Excel·lent',
          'callback_data': 'servei&4'
        }]
      ]
    };
    sendText(id, 'Puntuació del servei', JSON.stringify(keyboard));
  } 
  if(callbackData == 'servei&1'|| callbackData == 'servei&2' || callbackData == 'servei&3' || callbackData == 'servei&4'){
    // Si és una valoració de la qualitat del servei
    var sh = SpreadsheetApp.openById(spreadsheetId).getSheetByName("Fulll");
    var dades = sh.getDataRange().getValues();  // Agafem el contingut
    var fila = 0;
    var dar_fil = sh.getLastRow();  // Índex de la darrera filera
    for(var i = 0; i < dar_fil; i++){
      // Mirem totes les dades per a buscar l'últim lloc on apareix l'usuari actual al full de càlcul
      var row = dades[i];  // Agafem una filera
      var num_usuari = row[0];  // Agafem el número d'usuari de la filera
      if(num_usuari == id){  // Mira si és l'usuari actual
        fila = i+1;  // Sumem 1 al index on s'ha trobat a l'usuari
      }
    } 
    var valservei = callbackData.split('&'); // Separem
    var rang = sh.getRange(fila,7); // Agafem la casella on volem guardar l'informació
    rang.setValue(valservei[1]); // Col·loquem el valor a la casella
    var keyboard = {
      'inline_keyboard': [
        [{
          'text': 'Dolent',
          'callback_data': 'espai&1'
        },
        {
          'text': 'Regular',
          'callback_data': 'espai&2'
        }],
        [{
          'text': 'Bo',
          'callback_data': 'espai&3'
        },
        {
          'text': 'Excel·lent',
          'callback_data': 'espai&4'
        }]
      ]
    };
    sendText(id, "Puntuació de l'espai", JSON.stringify(keyboard));
  }
  if(callbackData == 'espai&1'|| callbackData == 'espai&2' || callbackData == 'espai&3' || callbackData == 'espai&4'){
    // Si és una valoració de la qualitat de l'espai
    var sh = SpreadsheetApp.openById(spreadsheetId).getSheetByName("Fulll");
    var dades = sh.getDataRange().getValues();  // Agafem el contingut
    var fila = 0;
    var dar_fil = sh.getLastRow();  // Índex de la darrera filera
    for(var i = 0; i < dar_fil; i++){  // Mirem totes les dades
      var row = dades[i];  // Agafa una filera
      var num_usuari = row[0];  // Agafa el número d'usuari de la filera
      if(num_usuari == id){  // Mira si és l'usuari actual
        fila = i+1;  // Sumem 1 al index on s'ha trobat a l'usuari
      }
    }  
    var valespai = callbackData.split('&'); // Separem
    var rang = sh.getRange(fila,8); // Agafem la casella on volem guardar l'informació
    rang.setValue(valespai[1]); // Col·loquem el valor a la casella
    var keyboard = {
      'inline_keyboard': [
        [{
          'text': 'Dolent',
          'callback_data': 'local&1'
        },
        {
          'text': 'Regular',
          'callback_data': 'local&2'
        }],
        [{
          'text': 'Bo',
          'callback_data': 'local&3'
        },
        {
          'text': 'Excel·lent',
          'callback_data': 'local&4'
        }]
      ]
    };
    sendText(id, 'Puntuació de la localització', JSON.stringify(keyboard));
  }
  if(callbackData == 'local&1'|| callbackData == 'local&2' || callbackData == 'local&3' || callbackData == 'local&4'){
    // Si és una valoració de la localització
    var sh = SpreadsheetApp.openById(spreadsheetId).getSheetByName("Fulll");
    var dades = sh.getDataRange().getValues();  // Agafem el contingut
    var fila = 0;
    var dar_fil = sh.getLastRow();  // Índex de la darrera filera
    for(var i = 0; i < dar_fil; i++){
      // Mirem totes les dades per a buscar l'últim lloc on apareix l'usuari actual al full de càlcul
      var row = dades[i];  // Agafem una filera
      var num_usuari = row[0];  // Agafem el número d'usuari de la filera
      if(num_usuari == id){  // Mira si és l'usuari actual
        fila = i+1;  // No sumem 1 perquè al vector es compta a partir de 0
      }
    }  
    var vallocal = callbackData.split('&'); // Separem
    var rang = sh.getRange(fila,9); // Agafem la casella on volem guardar l'informació
    rang.setValue(vallocal[1]); // Col·loquem el valor a la casella
    var keyboard = {
      'inline_keyboard': [
        [{
          'text': 'Dolenta',
          'callback_data': 'preu&1'
        },
        {
          'text': 'Regular',
          'callback_data': 'preu&2'
        }],
        [{
          'text': 'Bona',
          'callback_data': 'preu&3'
        },
        {
          'text': 'Excel·lent',
          'callback_data': 'preu&4'
        }]
      ]
    };
    sendText(id, 'Relació qualitat-preu', JSON.stringify(keyboard));
  }
  if(callbackData == 'preu&1'|| callbackData == 'preu&2' || callbackData == 'preu&3' || callbackData == 'preu&4'){
    // Si és una valoració de la relació qualitat-preu
    var sh = SpreadsheetApp.openById(spreadsheetId).getSheetByName("Fulll");
    var dades = sh.getDataRange().getValues();  // Agafem el contingut
    var fila = 0;
    var dar_fil = sh.getLastRow();  // Índex de la darrera filera
    for(var i = 0; i < dar_fil; i++){  // Mirem totes les dades
      var row = dades[i];  // Agafa una filera
      var num_usuari = row[0];  // Agafa el número d'usuari de la filera
      if(num_usuari == id){  // Mira si és l'usuari actual
        fila = i+1;  // Sumem 1 al index on s'ha trobat a l'usuari
      }
    } 
    var valpreu = callbackData.split('&'); // Separem
    var rang = sh.getRange(fila,10); // Agafem la casella on volem guardar l'informació
    rang.setValue(valpreu[1]); // Col·loquem el valor a la casella
    var preu = sh.getRange(fila,4).getValues(); // Agafem els valors necessaris del full de càlcul
    var n6 = sh.getRange(fila,6).getValues();
    var n7 = sh.getRange(fila,7).getValues();
    var n8 = sh.getRange(fila,8).getValues();
    var n9 = sh.getRange(fila,9).getValues();
    var n10 = sh.getRange(fila,10).getValues();
    var notamitj= (parseFloat(2*n6)+parseFloat(1.75*n7)+parseFloat(1.25*n10))/5;
	  // Mitjana de les valoracions que depenen de la propina
    var notamitjtotal=(parseFloat(n6)+parseFloat(n7)+parseFloat(n8)+parseFloat(n9)+parseFloat(n10))*10/20;
      // Mitjana de totes les valoracions
    var rnotamitj=sh.getRange(fila,11); // Agafem la casella on volem guardar la informació
    rnotamitj.setValue(notamitjtotal); // Col·loquem el valor a la casella
    if (notamitj < 1.8){
      // Si les valoracions han estat molt baixes, el bot no recomanarà cap import de propina
	  var tt = "Les valoracions han estat molt baixes, la recomanació és no deixar propina. ";
	  tt = tt + "El preu a pagar hauria de ser " + preu + " €.";
      sendText(id,tt);
    } else{ // Quan la mitjana és superior a 1.8/4 calculem els valors que el bot recomana a l'usuari
      var preufinal = Math.round(parseFloat(preu)+parseFloat(preu)*notamitj/16); 
      var propinafinal = Math.round(preufinal-preu,2);
      var percent = Math.round((notamitj/16)*100);
	  var tt = "El preu final a pagar hauria de ser " + preufinal + " €.\nAixò suposa ";
	  tt = tt + "una propina de " + propinafinal + " €, és a dir, un " + percent + " % del preu base.";
      sendText(id, tt);
    } 
  }
}
function param(id_usr, comand){  
  var sh = SpreadsheetApp.openById(spreadsheetId).getSheetByName("Fulll");  
  var dades = sh.getDataRange().getValues();  
  var dar_fil = sh.getLastRow();  
  var fila = 0;
  for(var i = 0; i < dar_fil; i++){  
    var row = dades[i];  
    var num_usuari = row[0];  
    if(num_usuari == id_usr){  
      fila = i;  
    }
  }
  var row = dades[fila];  
  var estat = row[1];
  if (estat < 3){  
    var rang = sh.getRange(fila+1, 2);  
    rang.setValue(estat + 1);  
    var rang = sh.getRange(fila+1, estat+3);  
    rang.setValue(comand);  
  }
  if (estat == 2){  
    row[6] = comand;  
    for (var i = 2; i < row.length; i++){
      row[i] = row[i].replace("^","");
    }
  } else {
    sendText(id_usr,missatges[estat + 1]);
  }
}
function iniParam(id_usr){  // Es prepara per rebre paràmetres
  var sh = SpreadsheetApp.openById(spreadsheetId).getSheetByName("Fulll");  // Agafa el full de càlcul
  var dades = sh.getDataRange().getValues();  // Agafa els valors
  var dar_fil = sh.getLastRow();  // Índex de la darrera filera
  // Mirem si l'usuari ja consta a la llista
  var fila = 0;
  for(var i = 0; i < dar_fil; i++){  // Recorrem les dades
    var row = dades[i];  // Llegim una filera    
  }
  var camps = new Array(7);  // Contindrà els valors per guardar a la taula
  camps[0] = id_usr;  // Identificador de l'usuari
  camps[1] = 0;  // Encara no tenim cap paràmetre
  for(var i = 2; i < 7; i++){
    camps[i] = "";  // No hi ha paràmetres
  }
  var valu = new Array(1);  // Matriu de dades a escriure
  valu[0] = camps;  // Converteix el vector en una matriu d'una filera i dues columnes
  if(fila == 0){  // Si l'usuari és nou
    sh.appendRow(camps);   // Afegeix una filera amb les dades 
  } 
  sendText(id_usr,missatges[0]);  
}
function sendText(chatId, text_env, keyboard) {
  var data = {
    method: 'post',
    payload: {
      method: 'sendMessage',
      chat_id: String(chatId),
      text: text_env,
      reply_markup: keyboard
    }
  };
  UrlFetchApp.fetch(telegramUrl + '/sendMessage', data);
}

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.