| Bots de conversa | Exemples | Dades pràctiques | Recursos CITCEA | |
| Google Apps Script | Projectes | Interacció | Inici |
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);
}

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