| Bots de conversa | Exemples | Dades pràctiques | Recursos CITCEA | |
| Google Apps Script | Projectes | Interacció | Inici |
Aquest bot de Telegram permet gestionar el pressupost mensual dels usuaris. Aquests poden entrar la quantitat de la qual disposen aquell mes i anar introduïnt les despeses en quatre categories: menjar, roba, lleure i altres. En tot moment es pot consultar el pressupost restant.
La informació entrada pels usuaris es guarda en un full de càlcul.
El programa de l'script és el següent:
var token = '^^77855498:AAH38Of6BsI5q_zdIKJVv_j_sP1sjg-AQgo';
var telegramUrl = "https://api.telegram.org/bot" + token;
var webAppUrl = "https://script.google.com/macros/s/^^fycbyjn2cLH9dJZUpnSHKWgXJiM8fS91QksiawOvqf3g3MEQTobezDMMn2XSfUjQfci9z7cg/exec";
var spreadsheetId = '^^C4x0hM8G9raCqTTN5q3lAIVXv3P3iaMiTyjZVrk2Kc';
var filausuari=-1;
var ssId = spreadsheetId;
function sendText(chatId, text, keyBoard) {
var data = {
method: "post",
payload: {
method: "sendMessage",
chat_id: String(chatId),
text: text,
parse_mode: "HTML",
reply_markup: JSON.stringify(keyBoard)
}
};
UrlFetchApp.fetch('https://api.telegram.org/bot' + token + '/', data);
}
function doPost(e) {
//parse user data
var contents = JSON.parse(e.postData.contents);
//set spreadsheet
var ssId = spreadsheetId;
var expenseSheet = SpreadsheetApp.openById(ssId).getSheetByName("Full 1");
for (var i = 1; i <=expenseSheet.getDataRange().getLastRow(); i++){
if (id_message == expenseSheet.getRange(i,1).getValue()){
filausuari=i;
}
}
var keyBoard = {
"inline_keyboard": [
[{
"text": "Pressupost",
'callback_data': 'pressupost'
}],
[{
"text": "Total",
'callback_data': 'total'
}],
[{
"text": "Restant",
'callback_data': 'restant'
}],
[{
"text": "Consultar despeses",
'callback_data': 'consulta'
}],
[{
"text": "Afegir despeses",
'callback_data': 'afegir'
}],
[{"text": "Resum mensual",
'callback_data': 'resum'
}]
]
}
if (contents.callback_query) {
var id_callback = contents.callback_query.from.id;
var data = contents.callback_query.data;
for (var i = 1; i <=expenseSheet.getDataRange().getLastRow(); i++){
if (id_callback == expenseSheet.getRange(i,1).getValue()){
filausuari=i;
}
}
if (data == 'pressupost') {
var pres = expenseSheet.getRange(filausuari, 3).getValue();
sendText(id_callback, pres + ' ' + "és el pressupost fixat per aquest mes." );
} else if (data == 'total') {
var total = expenseSheet.getRange(filausuari, 4).getValue();
sendText(id_callback, total + ' ' + "és el total d'euros acumulats en despeses." );
} else if (data == 'restant') {
var restant = expenseSheet.getRange(filausuari, 5).getValue();
sendText(id_callback, restant + ' ' + "euros son els diners que li queden de pressupost." );
} else if (data == 'consulta') {
var keyBoard3 = {
"inline_keyboard":[
[{
"text": "Menjar",
'callback_data':'menjar'
},
{
"text": "Roba",
'callback_data':'roba'
}],
[{
"text": "Lleure",
'callback_data':'lleure'
},
{
"text": "Altres",
'callback_data':'altres'
}],
]
}
sendText(id_callback, "Despesa a consultar.", keyBoard3);
} else if (data == 'afegir') {
var keyBoard4 = {
"inline_keyboard":[
[{
"text": "Menjar",
'callback_data':'menjar2'
},
{
"text": "Roba",
'callback_data':'roba2'
}],
[{
"text": "Lleure",
'callback_data':'lleure2'
},
{
"text": "Altres",
'callback_data':'altres2'
}],
]
}
sendText(id_callback, "Despesa a afegir.", keyBoard4);
} else if (data == 'resum') {
var pressupost = expenseSheet.getRange(filausuari, 3).getValue();
var restan = expenseSheet.getRange(filausuari, 5).getValue();
var menjar = expenseSheet.getRange(filausuari, 6).getValue();
var roba = expenseSheet.getRange(filausuari, 7).getValue();
var lleure = expenseSheet.getRange(filausuari, 8).getValue();
var altres = expenseSheet.getRange(filausuari, 9).getValue();
var pmenjar = (menjar/pressupost)*100;
var proba = (roba/pressupost)*100;
var plleure = ((lleure/pressupost)*100);
var paltres = (altres/pressupost)*100;
var prestan = (restan/pressupost)*100;
var tt = 'El resum mensual fins ara és el següent:\n'+'-'+pmenjar.toFixed(2);
tt = tt + '% en menjar\n'+'-'+proba.toFixed(2)+'% en roba\n'+'-'+plleure.toFixed(2)+'% en lleure\n'
tt = tt + '-'+paltres.toFixed(2)+'% en altres\n'+'-'+prestan.toFixed(2)+'% estalviats\n'
sendText(id_callback, tt);
}
if (contents.callback_query) {
var id_callback = contents.callback_query.from.id;
var data = contents.callback_query.data;
if (data == 'menjar') {
var pres = expenseSheet.getRange(filausuari, 6).getValue();
sendText(id_callback, pres + ' ' + "són els diners gastats en menjar." );
} else if (data == 'roba') {
var pres = expenseSheet.getRange(filausuari, 7).getValue();
sendText(id_callback, pres + ' ' + "són els diners gastats en roba." );
} else if (data == 'lleure') {
var pres = expenseSheet.getRange(filausuari, 8).getValue();
sendText(id_callback, pres + ' ' + "són els diners gastats en lleure." );
} else if (data == 'altres') {
var pres = expenseSheet.getRange(filausuari, 9).getValue();
sendText(id_callback, pres + ' ' + "són els diners gastats en altres." );
} else if (data == 'menjar2') {
expenseSheet.getRange(filausuari,10).setValue(Number(6));
sendText(id_callback, 'Introdueixi el número de la despesa en menjar a continuació.' );
} else if (data == 'roba2') {
expenseSheet.getRange(filausuari,10).setValue(Number(7));
sendText(id_callback, 'Introdueixi el número de la despesa en roba a continuació.' );
} else if (data == 'lleure2') {
expenseSheet.getRange(filausuari,10).setValue(Number(8));
sendText(id_callback, 'Introdueixi el número de la despesa en lleure a continuació.' );
} else if (data == 'altres2') {
expenseSheet.getRange(filausuari,10).setValue(Number(9));
sendText(id_callback, 'Introdueixi el número de la despesa en altres a continuació.' );
}
}
}
if (contents.message) {
var id_message = contents.message.from.id;
var text = contents.message.text;
var item = text.split("=");
var a = item[0].toLowerCase();
var firstName = contents.message.from.first_name;
}
for (var i = 1; i <=expenseSheet.getDataRange().getLastRow(); i++){
if (id_message == expenseSheet.getRange(i,1).getValue()){
filausuari=i;
}
}
if (filausuari ==-1){
if (text.indexOf("=") != -1 ) {
if (a.indexOf("pressupost") != -1){
var nowDate = new Date();
var date = nowDate.getMonth()+1+'/'+nowDate.getDate();
expenseSheet.appendRow([id_message,date, item[1],0,item[1],0,0,0,0]);
sendText(id_message,"El pressupost s'ha guardat correctament");
}
} else if(text != -1){
var tt = "Hola " + firstName + ", en aquest bot l'ajudarem a gestionar les seves ";
tt = tt + "despeses, per començar haurà d'afegir el pressupost amb aquest ";
tt = tt + "format: 'presssupost' = 'numero'.\nAmb la resta de botons podrà afegir ";
tt = tt + "i consultar les despeses tant en comput global com dividides en àmbits.\n";
tt = tt + "També pot borrar totes les dades donades a final de mes amb la següent ";
tt = tt + "comanda: /borrar\n"
sendText(id_message, tt, keyBoard);
}
} else if (filausuari != -1){
if (text == '/borrar'){
expenseSheet.deleteRow(filausuari);
sendText(id_message, "Les dades s'han borrat");
}
if (text.indexOf("=") != -1 ){
if(a.indexOf("pressupost") != -1){
var numpress = expenseSheet.getRange(filausuari,3).getValue();
var numdespeses = expenseSheet.getRange(filausuari,4).getValue();
numpress = Number(item[1]);
numrestant= Number(numpress) - Number(numdespeses);
expenseSheet.getRange(filausuari,3).setValue(Number(numpress));
expenseSheet.getRange(filausuari,5).setValue(Number(numrestant));
sendText(id_message,"Perfecte! Canviat el pressupost!");
} else if (a.indexOf("menjar") != -1){
var nummenjar = expenseSheet.getRange(filausuari,6).getValue();
var numrestant = expenseSheet.getRange(filausuari,5).getValue();
var numdespeses = expenseSheet.getRange(filausuari,4).getValue();
nummenjar = Number(nummenjar) + Number(item[1]);
numrestant= Number(numrestant) - Number(item[1]);
numdespeses=Number(numdespeses)+ Number(item[1]);
expenseSheet.getRange(filausuari,6).setValue(Number(nummenjar));
expenseSheet.getRange(filausuari,5).setValue(Number(numrestant));
expenseSheet.getRange(filausuari,4).setValue(Number(numdespeses));
sendText(id_message,"La despesa s'ha guardat correctament");
} else if(a.indexOf("roba") != -1){
var numroba = expenseSheet.getRange(filausuari,7).getValue();
var numrestant = expenseSheet.getRange(filausuari,5).getValue();
var numdespeses = expenseSheet.getRange(filausuari,4).getValue();
numroba = Number(numroba) + Number(item[1]);
numrestant= Number(numrestant) - Number(item[1]);
numdespeses=Number(numdespeses)+ Number(item[1]);
expenseSheet.getRange(filausuari,7).setValue(Number(numroba));
expenseSheet.getRange(filausuari,5).setValue(Number(numrestant));
expenseSheet.getRange(filausuari,4).setValue(Number(numdespeses));
sendText(id_message,"La despesa s'ha guardat correctament");
} else if(a.indexOf("lleure") != -1){
var numoci = expenseSheet.getRange(filausuari,8).getValue();
var numrestant = expenseSheet.getRange(filausuari,5).getValue();
var numdespeses = expenseSheet.getRange(filausuari,4).getValue();
numoci = Number(numoci) + Number(item[1]);
numrestant= Number(numrestant) - Number(item[1]);
numdespeses=Number(numdespeses)+ Number(item[1]);
expenseSheet.getRange(filausuari,8).setValue(Number(numoci));
expenseSheet.getRange(filausuari,5).setValue(Number(numrestant));
expenseSheet.getRange(filausuari,4).setValue(Number(numdespeses));
sendText(id_message,"La despesa s'ha guardat correctament");
} else if(a.indexOf("altres") != -1){
var numaltres = expenseSheet.getRange(filausuari,9).getValue();
var numrestant = expenseSheet.getRange(filausuari,5).getValue();
var numdespeses = expenseSheet.getRange(filausuari,4).getValue();
numaltres = Number(numaltres) + Number(item[1]);
numrestant= Number(numrestant) - Number(item[1]);
numdespeses=Number(numdespeses)+ Number(item[1]);
expenseSheet.getRange(filausuari,9).setValue(Number(numaltres));
expenseSheet.getRange(filausuari,5).setValue(Number(numrestant));
expenseSheet.getRange(filausuari,4).setValue(Number(numdespeses));
sendText(id_message,"La despesa s'ha guardat correctament");
}
}
}
if (text.indexOf("=")==-1){
var esNumero = /^-?\d+(\.\d+)?$/.test(text);
var numid = expenseSheet.getRange(filausuari,10).getValue()
if (esNumero && !isNaN(parseFloat(text))) {
if (numid != 0){
if (numid == 6){
var nummenjar = expenseSheet.getRange(filausuari,6).getValue();
var numrestant = expenseSheet.getRange(filausuari,5).getValue();
var numdespeses = expenseSheet.getRange(filausuari,4).getValue();
nummenjar = Number(nummenjar) + Number(text);
numrestant= Number(numrestant) - Number(text);
numdespeses=Number(numdespeses)+ Number(text);
expenseSheet.getRange(filausuari,6).setValue(Number(nummenjar));
expenseSheet.getRange(filausuari,5).setValue(Number(numrestant));
expenseSheet.getRange(filausuari,4).setValue(Number(numdespeses));
expenseSheet.getRange(filausuari,10).setValue(Number(0));
sendText(id_message,"La despesa s'ha guardat correctament.");
} else if (numid == 7){
var numroba = expenseSheet.getRange(filausuari,7).getValue();
var numrestant = expenseSheet.getRange(filausuari,5).getValue();
var numdespeses = expenseSheet.getRange(filausuari,4).getValue();
numroba = Number(numroba) + Number(text);
numrestant= Number(numrestant) - Number(text);
numdespeses=Number(numdespeses)+ Number(text);
expenseSheet.getRange(filausuari,7).setValue(Number(numroba));
expenseSheet.getRange(filausuari,5).setValue(Number(numrestant));
expenseSheet.getRange(filausuari,4).setValue(Number(numdespeses));
expenseSheet.getRange(filausuari,10).setValue(Number(0));
sendText(id_message,"La despesa s'ha guardat correctament.");
} else if (numid == 8){
var numlleure = expenseSheet.getRange(filausuari,8).getValue();
var numrestant = expenseSheet.getRange(filausuari,5).getValue();
var numdespeses = expenseSheet.getRange(filausuari,4).getValue();
numlleure = Number(numlleure) + Number(text);
numrestant= Number(numrestant) - Number(text);
numdespeses=Number(numdespeses)+ Number(text);
expenseSheet.getRange(filausuari,8).setValue(Number(numlleure));
expenseSheet.getRange(filausuari,5).setValue(Number(numrestant));
expenseSheet.getRange(filausuari,4).setValue(Number(numdespeses));
expenseSheet.getRange(filausuari,10).setValue(Number(0));
sendText(id_message,"La despesa s'ha guardat correctament.");
} else if (numid == 9){
var numaltres = expenseSheet.getRange(filausuari,9).getValue();
var numrestant = expenseSheet.getRange(filausuari,5).getValue();
var numdespeses = expenseSheet.getRange(filausuari,4).getValue();
numaltres = Number(numaltres) + Number(text);
numrestant= Number(numrestant) - Number(text);
numdespeses=Number(numdespeses)+ Number(text);
expenseSheet.getRange(filausuari,9).setValue(Number(numaltres));
expenseSheet.getRange(filausuari,5).setValue(Number(numrestant));
expenseSheet.getRange(filausuari,4).setValue(Number(numdespeses));
expenseSheet.getRange(filausuari,10).setValue(Number(0));
sendText(id_message,"La despesa s'ha guardat correctament.");
}
}
} else if (!esNumero){
var tt = "Hola " + firstName + ", en aquest bot l'ajudarem a gestionar les seves ";
tt = tt + "despeses, per començar haurà d'afegir el pressupost amb aquest ";
tt = tt + "format: 'presssupost' = 'numero'.\nAmb la resta de botons podrà afegir ";
tt = tt + "i consultar les despeses tant en comput global com dividides en àmbits.\n";
tt = tt + "També pot borrar totes les dades donades a final de mes amb la següent ";
tt = tt + "comanda: /borrar\n"
sendText(id_message, tt, keyBoard);
}
}
}

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