Bots de conversa de Telegram amb Google Apps Script

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

The Coin Coach Bot

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);
    }
  }
}

 

 

 

 

 

 

 

 

 

 

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