| Bots de conversa | Exemples | Dades pràctiques | Recursos CITCEA | |
| Google Apps Script | Projectes | Interacció | Inici |
En un altre exemple hem enviat un enllaç per descarregar un document de Google Drive. Podríem fer el mateix amb diversos documents, però si n'hi ha més de dos o tres potser és més pràctic que els noms i els enllaços dels documents que es poden descarregar estiguin en un full de càlcul. Així el llistat es pot modificar sense haver de tocar el programa. Una altra alternativa seria fer una carpeta amb els documents a compartir i fer un programa com el d'aquest altre exemple.
En aquest exemple, comptem que tenim un full de càlcul que té una pestanya anomenada Docs amb les següents dues columnes:
| Columna | Contingut |
| 1 | Nom que volem que es mostri per identificar el document |
| 2 | Adreça URL del document |
El programa de l'script seria el següent:
var token = "^^34328844:AAFIpk-e7j3UZtYQYQaTduf4hEhnDqIcNXI"; // API Token de Telegram
var telegramUrl = "https://api.telegram.org/bot" + token; // Url que comunica el nostre bot amb Telegram
var IdFull = "1j0IjAcf0BDppQuAOGZjLSjWY2_VYhgYeKg42bhQMk9Q"; // Identificador del full de càlcul
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 realitzat = false;
if(text == '/docs'){
var resposta = "Enllaços als documents:\n\n";
realitzat = true;
var sh = SpreadsheetApp.openById(IdFull).getSheetByName("Docs"); // Agafem el full
var dades = sh.getDataRange().getValues();
for (var i in dades){ // Recorrem totes les dades rebudes
if(i > 0){ // Descartem la filera dels títols
var filera = dades[i]; // Agafem una filera
var nomDoc = filera[0];
var urlDoc = filera[1];
resposta = resposta + nomDoc + ":\n" + urlDoc +"\n\n";
}
}
sendText(id,resposta);
}
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);
}
Podem fer que se'ns mostrin botons per descarregar els documents. Això dona un format més compacte, ja que els enllaços als documents són molt llargs, i és més pràctic si hi ha uns quants documents com a opcions. El programa quedaria com es mostra a continuació:
var token = "^^34328844:AAFIpk-e7j3UZtYQYQaTduf4hEhnDqIcNXI"; // API Token de Telegram
var telegramUrl = "https://api.telegram.org/bot" + token; // Url que comunica el nostre bot amb Telegram
var IdFull = "1j0IjAcf0BDppQuAOGZjLSjWY2_VYhgYeKg42bhQMk9Q"; // Identificador del full de càlcul
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 realitzat = false;
if(text == '/docs'){
var resposta = "Enllaços als documents:\n\n";
realitzat = true;
var sh = SpreadsheetApp.openById(IdFull).getSheetByName("Docs"); // Agafem el full
var dades = sh.getDataRange().getValues();
var llista = new Array(); // La llista contindrà totes les tecles
for (var i in dades){ // Recorrem totes les dades rebudes
if(i > 0){ // Descartem la filera dels títols
var filera = dades[i]; // Agafem una filera
var text_tecla = filera[0]; // La primera columna és la descripció del document
var url_tecla = filera[1]; // La segona columna és l'enllaç al document
var tecla = {"text":text_tecla,"url":url_tecla}; // Dades per a una tecla
var row = new Array(1); // Contindrà una filera d'un sol botó
row[0] = tecla; // Posem el botó a la filera
llista.push(row); // Afegim la filera a la llista
}
}
var tecles = {"inline_keyboard":llista}; // Creem el teclat a partir de la llista
var titol = "Tria una opció"; // Títol del teclat
sendText(id,titol,tecles);
}
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);
}
Si volem posar dos o més botons per filera el programa es complica una mica perquè els hem d'anar comptant. Per exemple, podríem substituir la funció doPost anterior per la següent, en la que podem triar quantes tecles es posaran a cada filera. Si el nombre de documents no és un múltiple del nombre de tecles per filera, la darrera filera tindrà menys tecles.
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 realitzat = false;
if(text == '/docs'){
var resposta = "Enllaços als documents:\n\n";
realitzat = true;
var sh = SpreadsheetApp.openById(IdFull).getSheetByName("Docs"); // Agafem el full
var dades = sh.getDataRange().getValues();
var llista = new Array(); // La llista contindrà totes les tecles
var numTecFil = 3; // Nombre de tecles per filera
var tecAct = 0; // Comptador de tecles per filera
for (var i in dades){
if(i > 0){ // Descartem la filera dels títols
var filera = dades[i]; // Agafem una filera
var text_tecla = filera[0]; // La primera columna és la descripció del document
var url_tecla = filera[1]; // La segona columna és l'enllaç al document
var tecla = {"text":text_tecla,"url":url_tecla}; // Dades per a una tecla
if(tecAct == 0){ // Si és el primer botó de la filera
var row = new Array(1); // Creem un vector buit per guardar la filera
}
row[tecAct] = tecla; // Posem el botó a la filera
tecAct++; // Botó següent
if(tecAct == numTecFil){ // Si hem acabat una filera
tecAct = 0; // Reiniciem el comptador
llista.push(row); // Afegim la filera a la llista
}
}
}
if(tecAct > 0){ // Si ens ha quedat alguna tecla sense completar filera
llista.push(row); // Afegim la filera a la llista
}
var tecles = {"inline_keyboard":llista}; // Creem el teclat a partir de la llista
var titol = "Tria una opció";
sendText(id,titol,tecles);
}
if (!realitzat){
var resposta = "Comanda desconeguda";
sendText(id,resposta);
}
}
En les adreces URL dels fitxers, una part de la informació és idèntica. Podríem fer que al full de càlcul només hi hagués els identificadors dels fitxers i generar l'adreça completa en el moment de crear el teclat, com es mostra a continuació:
var url_tecla = "https://docs.google.com/document/d/" + filera[1] + "/edit?usp=sharing";

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