Bots de conversa de Telegram amb Google Apps Script

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

Generem un diagrama de columnes que es pot consultar des de Telegram

En aquest exemple agafarem unes dades que tenim en un full de càlcul i generarem una imatge en forma de diagrama de columnes (barres verticals) amb els valors del full de càlcul. Amb la idea de fer un exemple senzill, hem suposat que el nostre full de càlcul sempre té les dades corresponents a set dies, així el nombre de columnes és fix, i que en la primera columna hi ha el nom del dia i a la segona i la tercera el valor que correspon, respectivament, a l'estoc i a les comandes.

La següent imatge mostra el contingut del full de càlcul en un moment donat:

Full de càlcul

El resultat que obtindrem serà el gràfic següent:

Gràfic

En el nostre cas, podem demanar el gràfic des de Telegram (funció doPost) fent servir la comanda /grafic.

El programa és el següent:

var token = "^^34328844:AAFIpk-e7j3UZtYQYQaTduf4hEhnDqIcNXI"; // API Token de Telegram 
var telegramUrl = "https://api.telegram.org/bot" + token;  // URL que comunica el bot de conversa amb Telegram 
var ssId = "^^ThsoSjkeMSfwEKy4mn_4QEYH96sxv3VURqE3WHCTswDA";  // Identificador del full de càlcul
function grafic(){
  var taula = Charts.newDataTable();  // Creem una taula de dades
  var sh = SpreadsheetApp.openById(ssId).getSheetByName("dades");  // Agafem el full
  var dades = sh.getDataRange().getValues();  // Agafem les dades
  for (var i in dades){  // Recorrem totes les dades
    var row = dades[i];  // Agafem una filera
    if (i == 0){  // A la primera filera hi ha els títols
      // Definim les columnes de la taula
	  taula.addColumn(Charts.ColumnType.STRING, row[0]);
      taula.addColumn(Charts.ColumnType.NUMBER, row[1]);
      taula.addColumn(Charts.ColumnType.NUMBER, row[2]);
    } else {  // Guardem els valors a la taula
      taula.addRow([row[0], row[1], row[2]]);
    }
  }
  var taula_dades = taula.build();  // Generem la taula a partir de les dades
  var graf = Charts.newColumnChart();  // Creem el gràfic
  // Posem els paràmetres del gràfic
  graf.setXAxisTitle("Dia");
  graf.setYAxisTitle("Percentatge");
  graf.setTitle("Estoc i comandes");
  graf.setDimensions(700, 500);
  graf.setDataTable(taula_dades);  // Vinculem la taula al gràfic
  var grafic = graf.build();  // Generem el gràfic
  var grafic_blob = grafic.getBlob(); // Converteix el gràfic a dades binàries 
  return grafic_blob;
}
function doPost(e){
  var data = JSON.parse(e.postData.contents);  // Llegeix les dades rebudes per JSON i les guarda
  var text = data.message.text;  // Comanda enviada
  var id = data.message.chat.id;  // Identificador de la finestra d'on prové el missatge 
  var id_usuari = data.message.from.id; // Identificador de l'usuari
  var id_missatge = data.message.message_id; // Identificador del missatge
  var lang = data.message.from.language_code ;  // Idioma de l'usuari 
  var nom_usr = data.message.from.first_name ;  // Nom de l'usuari
  var location = data.message.location;  // Localització de l'usuari (si es sap) 
  var realitzat = false;
  if(text == '/grafic'){
    var blob = grafic();  // Generem el gràfic
    var descrip = "Gràfic";  // Posem un títol
    sendBlobFile(id,blob,descrip);  // Enviem el gràfic a Telegram
    realitzat = true;
  }
  if (!realitzat){
    var resposta = "Comanda desconeguda";
    sendText(id,resposta);
  }
}
function sendText(chatId,text_env,keyBoard){  // Funció que envia un text o un teclat a Telegram 
  keyBoard = keyBoard || 0;
  if(keyBoard.inline_keyboard || keyBoard.keyboard){
    var data = {
      method: "post",
      payload: {
        method: "sendMessage",
        chat_id: String(chatId),
        text: text_env,
        parse_mode: "HTML",
        reply_markup: JSON.stringify(keyBoard)
      }
    }
  } else {
    var data = {
      method: "post",
      payload: {
        method: "sendMessage",
        chat_id: String(chatId),
        text: text_env,
        parse_mode: "HTML"
      }
    }
  }
  UrlFetchApp.fetch( telegramUrl + '/', data);
}
function sendBlobFile(chatId,blob_data,caption){
  var payload = {
    method: "sendPhoto",
    chat_id: String(chatId),
    photo: blob_data,
    caption: caption,
    parse_mode: "HTML"
  };
  var options = {
    method: "POST",
    payload: payload,
    muteHttpExceptions: true
  };
  UrlFetchApp.fetch( telegramUrl + '/', options);
}

Canviant les línies marcades en color per les següents el diagrama tindrà les barres horitzontals:

  var graf = Charts.newBarChart();
  // Posem els paràmetres del gràfic
  graf.setXAxisTitle("Percentatge");
  graf.setYAxisTitle("Dia");

Podem fer que l'eix sigui de tipus logarítmic afegint la línia següent, per exemple després de les marcades en color.

  graf.useLogScale();

Podem fer que el gràfic sigui de barres apilades afegint la línia següent, per exemple després de les marcades en color.

  graf.setStacked();

Per obtenir un gràfic d'àrees només caldrà canviar la primera de les línies marcades en color per la següent:

  var graf = Charts.newAreaChart();

Per obtenir un gràfic de línies només caldrà canviar la primera de les línies marcades en color per la següent:

  var graf = Charts.newLineChart();

 

 

 

 

 

 

 

 

 

 

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