Hola a tohom! Aquí aniré recollint al vol les coses que anem provant! Gràcies a totes les persones que esteu col·laborant en aquesta prova
A priori, les coses que vull provar són:
Grups on la gent es pugui afegir amb un link prèvia aprovació
Fer enquestes a les famílies
Automatitzar articles al bloc i/o Twitter
Que els mestres puguem posar el nostre horari d'atenció i les families pillin hora
Grups de classe per parlar normal entre pares que s'hi pugui accedir amb enllaç
Els canals poden ser públics o privats. Els púHblics es poden buscar a travées de Telegram i s'hi pot afegir tothom.
Els privats cal l'enllaç. Em vist que en la meva versió d'escriptori de telegram no puc accedir a l'enllaç després de crear el grup. En teoria si que hauria de poder.
He enviat l'enllaç a diverses persones i a veure si poden accedir-hi.
Quan li he explicat al Carles el que volía fer, m'ha passat aquests enllaços que han estat un dels punts de partida.
Amb això ja he aconseguit automatitzar una resposta al Twitter de la Comunitat quan algú ens comença a seguir i he fet un canal de telegram en el que tot el que s'hi penja es piula automàticament al compte de la Comunitat de Twitter. Una altra estona faré el vídeo explicant-ho.
Una de les coses bones que té telegram és el fet de poder estar amb altres persones a un grup o canal i no difondre el nostre número de telèfon. Per poder accedir a alguns canals i que altres persones ens puguin enviar missatges de forma fàcil sense haver de donar el nostre número hem de posar-nos un nom d'usuari a telegram.
Ara m'he estat mirant per fer els grups i he vist que pràcticament tothom no té nom d'usuari, així que explicaré com fer-ho.
Hi ha grups i canals. De moment començem pels grups.
Poden ser públics o privats. En els públics hi pots accedir amb un enllaç o buscant-lo al cercador de telegram pel nom i en els privats només amb l'enllaç.
Podem configurar els grups perquè la gent del grup hi pugui enviar una mena d'arxius o altres, emoticones, enllaços, que puguin o no afegir a altres persones, etc.
També podem decidir que la gent pugui llegir tot el que s'ha penjat en aquell grup abans de que s'hi afegissin o només els últims 100 missatges.
Hi ha una pàgina Nodes de centre que explica com fer un bot que enviï el teu contingut del bloc a Telegram i amb que explico al vídeo del costat pots fer que el que enviïs a telegram ho pengi a Twitter i BOOOOM! ja tens automatizat el penjar coses a Twitter!
Ara per ara, alguna cosa vaig fer malament i les imatges no es pengen a Twitter. M'ho acabo de mirar i he fet un altre IFTTT que en teoria ho hauria de fer correctament.
No trobava una Applet que permetés passar imatges a Twitter i l'he fet! Molt fàcil gràcies a IFTTT.
Al setembre diria que em vaig afegir a un grup de Telegram molt interessant que es diu Xatbots_GAS . És un grup obert on qualsevol persona s'hi pot afegir i accedir a la informació que posen a la nostra disposició. Parla de fer Bots i de connectar-los a documents de Drive a través de Google App Script (d'aquí ve lo de GAS). Com no, tenen diferents bots al canal que permeten fer diverses coses. Una d'elles gestionar els tutorials.
Els vídeos 1, 2 i 3 són els primers passos i avui començaré per aquí.
Hi ha una funció per revisar l'activitat del Bot:
https://api.telegram.org/botAPIkey/getUpdates
el que està en negreta és el que s'ha de substituir pel APIkey
L'any passat vaig fer un bot de Telegram que llegia un excel on hi havia les Urls dels horaris del professorat. He parlat amb la Laura i comenta que li aniria bé. Vaig a veure si recordo com anava i puc documentar per aquí el procés.
El primer problema que em trobo és que no sé on està el Full de càlcul on vaig fer el bot.
Trobo el codi, però no el full de càlcul amb les dades. A més, estaria bé que el bot es pogués desvincular de mi; així que el provaré de fer a la unitat compartida de TAC.
L'he batejat com a R3naixença_bot.
He provat de publicar-lo des de la unitat compartida i no em deixa. L'he passat a la meva unitat i s'ha publicat sense problemes.
He provat de canviar l'autentificació perquè en comptes d'executar l'Script com a miquelsubirats ho faci amb l'usuari propi de qui l'executi i he posat que ho pugui executar qualsevol del domini de l'escola.
M'he trobat que no recordava com deslligar el Webhook del Script anterior. He trobat aquesta pàgina que m'ho ha aclarit.
He hagut de configurar la publicació com si fos jo qui executa el codi i permetent que s'utilitzi de forma anònima.
Ara funciona.
Ara el que vull és obtenir el contingut de la carpeta horari de forma automàtica.
Avui 7 d'octubre ens hem trobat uns quants dels del grup de Telegram de Xatbots perquè en Ferran ens expliqui com ho ha fet per fer el Xatbot que gestiona els espais.
La idea és fer la gestió d'un espai o un recurs que es pugui veure per Telegram i es pugui reservar des d'allà.
hi ha 2 maneres bàsiques:
1) en un full de càlcul en que s'hi anota qui té reservat cada dia i hora.
2) Utilitzar el calendari: Més complex però amb recordatoris i altres funcions.
Nosaltres provarem de fer-ho amb el calendari.
Primer hem de crear un calendari. Anem a configuració i hi ha una dada que es diu identificador del calendari.
Els esdeveniments, cada un d'ells, té el seu propi identificador per si ens interessa.
Per fer el programa, hem de tenir un full de càlcul.
El primer que hem de tenir clar és saber qui pot entrar informació. Seria interessant tenir una gestió d'usuaris i des d'allà fer la gestió dels permisos. Si treballem amb l'excel es pot regular amb els permisos de Telegram i si utilitzem el calendari es pot regular des d'allà.
/*
Nombre del script = GAS_calendar.gs
Este codigo intenta dar algunas implementaciones para la gestion de reserva de espacios y/o recursos.
Debereis personalizar las 4 variables
var token = el Token identificador del bot en Telegram facilitado com el BotFather
var webAppurl = La url de la aplicación que nos facilita Google cuando publicamos nuestro codigo
var ssId = id de la hoja de calculo que estamos trabajando y que podemos obtener desde la url de la hoja
var idCal = id del calendario Google calendar de la tutoria
*/
//Bloque I = Cabecera con las variables globales
// nombre del bot GEG_muestra2 - Tutoria
var token = ""; // API Token de Telegram
var telegramUrl = "https://api.telegram.org/bot" + token; // Url que comunica nuestro bot con Telegram
var webAppUrl = ""; // La obtenemos cuando publicamos nuestro codigo
var ssId = "" ; // Id de la hoja de càlculo,podemos obtener de su url
var idCal = "";// Id del calendario de la tutoria
var id_meu = "";
var dies = new Array("Dilluns","Dimarts","Dimecres","Dijous","Divendres");
var meses = new Array("Gener","Febrer","Març","Abril","Maig","Juny","Juliok","Agost","Setembre","Octubre","Novembre","Decembre");
var url_calendari = "https://calendar.google.com/calendar/u/0/embed?src=ml7vutgaf02ebvqmjgafvhb3bk@group.calendar.google.com&ctz=Europe/Madrid";
// Para activar la url de nuestro bot sustituir TOKEN i webAppUrl
// https://api.telegram.org/bot1881518213:AAFi5zzy8xpiF-J55IWJtWodQMzCKlGsVmw/setWebhook?url=https://script.google.com/macros/s/AKfycbyPHvxT3Ep2kqYPqzC58ijD26OZTYAZrJavF2F2Djzg0NFRP6w/exec
/* Comandos programados
info - Información sobre el bot
altacalendari - Per afegir-se al calendari de reserva espai
reservaespai - Mostra taula reserva d'espai via web
veurereserves - Obtenir taula de reserves en format imatge i PDF
El comando "/inscri" está disponible pero no incluido en la lista
La hoja de calculo debe contener una hoja llamada "Usuaris" para registrar los usuarios que tendran acceso a reservar espacio
*/
//Bloque II Funciones para comunicarse con Telegram
function sendPhoto(id,foto,caption) // Funcion que prepara para enviar una imagen a telegram
{
var url = telegramUrl + "/sendPhoto?chat_id=" + id + "&photo=" + foto+"&caption=" + caption ;
var response = UrlFetchApp.fetch(url);
Logger.log(response.getContentText());
}
function sendDocument(id,fitxer)
{
var url = telegramUrl + "/sendDocument?chat_id=" + id + "&document=" + fitxer;
var response = UrlFetchApp.fetch(url);
Logger.log(response.getContentText());
}
function sendDocument2(chatId,id,caption,format){
var format = format || "text/plain" ;
var fileId = id ;
var img = DriveApp.getFileById(id);
var blob2 = img.getBlob().getAs(format);
var payload = {
method: "sendDocument",
chat_id: String(chatId),
document: blob2,
caption : caption,
parse_mode: "HTML"
//disable_web_page_preview: true,
};
var options = {
method: "POST",
payload: payload,
muteHttpExceptions : true
};
var request = UrlFetchApp.fetch( telegramUrl + '/', options);
Logger.log(request.getContentText());
}
function sendDocument3(chatId,blob2,caption){
var payload = {
method: "sendDocument",
chat_id: String(chatId),
document: blob2,
caption : caption,
parse_mode: "HTML"
//disable_web_page_preview: true,
};
var options = {
method: "POST",
payload: payload,
muteHttpExceptions : true
};
var request = UrlFetchApp.fetch( telegramUrl + '/', options);
Logger.log(request.getContentText());
}
function deleteMessage(id,id_missatge)
{
var url = telegramUrl + "/deleteMessage?chat_id=" + id + "&message_id=" + id_missatge;
var response = UrlFetchApp.fetch(url);
Logger.log(response.getContentText());
}
function sendText(chatId,text,keyBoard){ // Función que prepara para enviar un Texto a Telegram
keyBoard = keyBoard || 0;
if(keyBoard.inline_keyboard || keyBoard.keyboard){
var data = {
method: "post",
payload: {
method: "sendMessage",
chat_id: String(chatId),
text: text,
parse_mode: "HTML",
reply_markup: JSON.stringify(keyBoard)
}
}
}else{
var data = {
method: "post",
payload: {
method: "sendMessage",
chat_id: String(chatId),
text: text,
parse_mode: "HTML"
}
}
}
var torna = true;
try
{
UrlFetchApp.fetch( telegramUrl + '/', data);
var torna = false;
}
catch(err){
Logger.log(err); //
}
return torna;
}
function sendDocument(chatId,id,caption){
var fileId = id ;
var img = DriveApp.getFileById(id);
var blob2 = img.getBlob();
var payload = {
method: "sendDocument",
chat_id: String(chatId),
document: blob2,
caption : caption,
parse_mode: "HTML"
//disable_web_page_preview: true,
};
var options = {
method: "POST",
payload: payload,
muteHttpExceptions : true
};
var request = UrlFetchApp.fetch( telegramUrl + '/', options);
Logger.log(request.getContentText());
}
function doGet(e)
{
var accio = e.parameter.accio;
var id = e.parameter.id;
var idioma = e.parameter.idioma;
var hora = e.parameter.hora ;
var clau = e.parameter.clau;
Logger.log(id);
Logger.log(idioma);
var sortida = "Error" ;
switch (accio)
{
case 'svg':
var root = veure_calendari(id,idioma);
return ContentService.createTextOutput(root).setMimeType(ContentService.MimeType.XML);
break;
case 'cal':
var sortida = reserva_hora1(hora,1,idioma);
return ContentService.createTextOutput(sortida);
break;
case 'cal2':
var sortida = reserva_hora1(hora,2,idioma);
return ContentService.createTextOutput(sortida);
break;
}
}
//Bloque III Función doPost que recibe peticiones que llegan por vias Post como es el caso de Telegram
function doPost(e) // Función que recibe los datos enviados por Telegram en formato JSON
{
// Recoje los parametros enviados
var data = JSON.parse(e.postData.contents); // Asigna los datos pasados por Telegram en formato JSON a la variable data
//MailApp.sendEmail(email, "datos Telegram" ,JSON.stringify(data,null,4) ) ; // Para mandar los datos recibidos desde Telegram via email e identificar el nombre de los parametros
// Opción para captar datos si hemos enviado un mensaje de texto
try
{
if(data.message)
{
var texto = data.message.text; // Recupera el texto del mensaje
var id = data.message.chat.id; // Recupera el id de la ventana de donde procede el mensaje
var id_usuario = data.message.from.id; // Recupera el id del usuario que ha escrito el mensaje
var id_mensaje = data.message.message_id; // Recupera el id del mensaje
var idioma = data.message.from.language_code ; // Recupera el idioma que tiene el Telegram del usuario
var nombre = data.message.from.first_name ; // Recupera el nombre del usuario que ha enviado el mensaje
var location = data.message.location; // Recupera la localización en los casos que proceda
}
}
catch(err){
Logger.log(err); //
}
try{ // Opcion si hemos usado un boton interno en el xat
if(data.callback_query)
{
var id_usuario = data.callback_query.from.id;
var id = data.callback_query.message.chat.id;
var id_mensaje = data.callback_query.message.message_id; // Recupera el id del missatge
var texto = data.callback_query.data;
var usuario = data.callback_query.from.user_name;
var nombre = data.callback_query.from.first_name;
var idioma = data.callback_query.from.language_code;
}
}
catch(err){
Logger.log(err);
}
sendText(id,texto); // Para usar como debugador para detectar errores
var enviado = false ; // Variable para controlar si se ha enviado respuesta
var entrada = texto.split("@"); // Separa el comando del nombre del bot utilizando la @ de separador por si procede de un grupo
var comando_grupo = entrada[0] ; // El elemento 0 que quedara a la izquierda será el comando elegido
var entrada = comando_grupo.split(" "); // Para separar elcomando de los parametros
var comando = entrada[0];
if(id_usuario != id_meu)
{
sendText(id_usuario,"Estem fent millores de cara al Videotaller del dijous dia 7/10/2021");
return ;
}
//Bloque IV instruccion switch que trasnfiere comandos
switch (comando) // Comando condicional para analizar los posibles valores del texto
{
case '/start' : // Fabrica el mensaje de bienvenida en el idioma del usuario
var enviat = inicio(id_usuario,nombre,idioma);
break;
case '/regis' :
var enviado = regis(id_usuario,texto,idioma,nombre);
break;
case '/inscri' :
var enviado = inscri(id_usuario,texto,idioma,nombre) ;
break;
case '/altacalendari':
var enviado = alta_calendari(id_usuario,texto,nombre,idioma);
deleteMessage(id,id_mensaje);
break;
case '/reservaespai':
var frase = escribe_frase("Activa l'enllaç per obrir la taula de reserva d'espai \n\n",idioma);
var bot = sendText(id_usuario,frase + webAppUrl+"?accio=svg&id="+cerca_usuari(id_usuario)+"&idioma="+idioma);
if(bot) sendText(id,escribe_frase("@"+nombre+" Recorda que has te tenir obert el bot @GAS_test_bot per poder rebre el resultat ",idioma));
var enviado = true;
deleteMessage(id,id_mensaje);
break;
case '/res':
var enviado = reserva_hora2(id_usuario,texto,1,nombre,idioma);
break;
case '/res2':
var enviado = reserva_hora2(id_usuario,texto,2,nombre,idioma);
break;
case '/veurereserves':
var enviado = pdf(id_usuario,nombre,idioma);
deleteMessage(id,id_mensaje);
break;
default :
//var respuesta = "La opción indicada no està contemplada";
break;
} // final de switch de opciónes
if(!enviado) sendText(id,escribe_frase(respuesta,idioma)); //Si no hemos enviado ninguna respuesta, envia mensaje sin botones
} // final de doPost
//Bloque V funciones creadas por el usuario para gestionar las prestaciones
function inicio(id_usuario,texto,nombre,idioma)
{
var farse = "Benvingut al xat per la gestió dels espais públics del Centre .....";
sendText(id_usuario,escribe_frase(frase,idioma));
return true;
}
// función para mostrar un Menú en forma de botones
function menu(id_usuario,idioma)
{
var lista = new Array([{"text" : "Información", "callback_data": "/info" } ,
{"text" : "Agenda", "callback_data": "/agenda" }] ,
[{"text" : "Inscripción", "callback_data": "/identificar"},
{"text" : "Guia", "callback_data": "/guia"}]);
; // Lista de las dos opciónes de votacion
var teclas = { inline_keyboard : lista , resize_keyboard: true,one_time_keyboard : true }; // Asigna la lista de botones al comando keyboard
sendText(id_usuario,"Selecciona opción",teclas ); // Envia un mensaje a Telegram usando la función sendText()
return true; // devuelve cierto para que no se envie ningun otro mensaje
}
function inscri(id_usuario,texto,idioma,nombre)
{
var id_usuario = id_usuario || id_meu ;
var texto = texto || "/inscri profefp.tk@gmail.com";
var idioma = idioma || "ca";
var nombre = nombre || "Profe ";
var em = texto.split(" "); // Para obtener el mail que estará a la derecha en el texto tecleado
var mail = em[1]; // Separamos la parte derecha del parametro que contiene el email escrito
var datos= SpreadsheetApp.openById(ssId).getSheetByName("Usuaris").getDataRange().getValues(); // Cargamos los datos de la hoja de usuarios
var no_encontrado = true; // variable para controlar que se encuentra la familia
for(i in datos) // Creamos un bucle para localizar el usuario a partir de su email
{
var row = datos[i];
var id = row[1];
var nombre0 = row[2];
var email = row[3]; // Cargamos el email de la familia que tenemos en la columna 4 de la hoja
if(id == id_usuario) // identificamos al usuario en la lista
{
sendText(id_usuario,nombre0 + escribe_frase(" Ya estas regiostrado ",idioma));
return true;
}
}
// Si llega aquí significara que el id no ha sidoencontrado en la lista
var clave = Math.floor(Math.random() * 10000000 ); //Generamos una clave para evitar hackeos
// Gravamos la clave
// Si no_encontrado
SpreadsheetApp.openById(ssId).getSheetByName("Usuaris").appendRow([new Date(),id_usuario,nombre,mail,idioma,clave]);
var fila = SpreadsheetApp.openById(ssId).getSheetByName("Usuaris").getLastRow();
sendText(id_usuario,nombre + escribe_frase(" has sido dado de alta en el registro. Recibiras un mensaje a tu correo que debes validar ", idioma));
// Vamos a construir un mensaje para validar el id de la familia
// Crearemos un enlace para validarse
var url = "https://t.me/@chatt2021_bot?start=regis-"+ fila + "-" + clave ; // Enlace para validarse usando la clave generada
// Generem el missatge d'anul.lació de l'inscripció
var subject = "Inscripción en el Grupo ..... " ;
var plain_email_body = "Apreciado " + nombre + ", \n" +
" Para finalizar el registro en el bot de tutoria, debereis pulsar en el siguiente enlace: \n" +
url + "\n\n" +
"Tambien podeis escribir /inscri-"+ fila + "-" +clave +" en el bot de tutoria que es @chatt2021_bot \n\n\n"+
"Saludos \n\n" +
"El tutor \n\n\n";
var html_body = "Apreciado <b>" + nombre + "</b>, <br />" +
" Para finalizar el registro en el bot de tutoria, debereis pulsar en el siguiente enlace: <br />" +
"<a href='"+ url +"'>"+ url + "</a> <br />" +
"Tambien podeis escribir /regis-"+fila + "-" + clave + " en el bot de tutoria que es <b>@chatt2021_bot</b> <br /><br />"+
"Saludos <br><br>" +
"<i>El tutor</i> <br /><br /><br >";
var advancedOpts = { name: "Registro en el bot de tutoria ", htmlBody: html_body };
MailApp.sendEmail(mail, escribe_frase("Registro en @chatt2021_bot",idioma) ,plain_email_body,advancedOpts) ;
sendText(id_usuario,escribe_frase("Recibiras un correo indicando el codigo para efectuar la inscipcion segura al bot",idioma));
return true;
}
function regis(id_usuario,texto,idioma,nombre)
{
var id_usuario = id_usuario || id_meu ;
var texto = texto || "/regis-1-6455839";
var idioma = idioma || "ca";
var nombre = nombre || "Profe ";
var em = texto.split("-"); // Para obtener los datos a validar
var fila = em[1]; // Separamos las 3 partes separadas por el guion "-"
var clave = em[2];
var datos= SpreadsheetApp.openById(ssId).getSheetByName("Usuaris").getDataRange().getValues(); // Cargamos los datos de la hoja de usuarios
var no_encontrado = true; // variable para controlar que se encuentra la familia
var row = datos[parseInt(fila-1)];
var id = row[1];
var clave0 = row[5];
if(id == id_usuario && clave == clave0 ) // identificamos al usuario en la lista
{
SpreadsheetApp.openById(ssId).getSheetByName("Usuaris").getRange(parseInt(fila),7).setValue(new Date());
sendText(id_usuario,nombre + escribe_frase(" Registro realizado ",idioma));
return true;
}
else
{
sendText(id_usuario,nombre + escribe_frase(" No se ha realizado el regostro. Consulta con el admin ",idioma));
return true;
}
// Si llega aquí significara que el id no ha sidoencontrado en la lista
}
function guia(id_usuario,idioma)
{
var id_guia = "1gPpbhW5uciFfFT0SCFsifZr8hTNLDNRY";
sendDocument(id_usuario,id_guia,"Guia del Tutor de Secundaria");
return true;
}
function notas(id_usuario,idioma)
{
var datos= SpreadsheetApp.openById(ssId).getSheetByName("Usuaris").getDataRange().getValues(); // Cargamos los datos de la hoja de usuarios
for(i in datos) // Creamos un bucle para localizar el usuario a partir de su email
{
var row = datos[i];
var id_familia = row[5]; // Cargamos el email de la familia que tenemos en la columna 6 de la hoja
if(id_usuario = id_familia) // identificamos a la familia
{
var nombre = row[0];
var apellido = row[1];
var materia1 = row[7]; // Recuperamos la calificacion de la materia 1 columna 8
var materia2 = row[8]; // Recuperamos la calificacion de la materia 1 columna 9
var frase = "Las calificiones de " + nombre + " " + apellido + "son: \n Materia 1 = " + materia1 + "\n Materia2 = " + materia2 ;
sendText(id_usuario,frase);
return true;
}
}
sendText(id_usuario,"Aun no estas identificado ");
return true;
}
function calendario(id_usuario,idioma)
{
var meses = new Array("Gener","Febrer","Març","Abril","Maig","Juny","Juliok","Agost","Setembre","Octubre","Novembre","Decembre");
sendText(id_usuario,"Calendario" );
var resultado = ""; // Inicializamos la variable resultado
var salto = "\n"; // codigo para añadir saltos de linea sin codigo HTML
var cal = CalendarApp.getCalendarById(idCal); // Seleccionamos el calendario , idCal lo tenemos definido en la cabecera
if (!cal) { // Si el calendario no existe o no tenemos permíso
resultado = "Problemas con la agenda";
sendText(id,escribe_frase(resultado,idioma)); // enviamos mensaje de error
return true; // Devolvemos True, porque se ha enviado información
}
var ahora = new Date(); // Indicamos la fecha a seleccionar,serà la actual
var final = new Date(); // Creamos el final indicando las 23.59 del dia actual
final.setHours(23); // Li canviem l'hora a les 23.59
final.setMinutes(59);
var esdev = cal.getEvents(ahora, final); // Cargamos todos los eventos entre las dos fechas
var numEsdev = esdev.length; // Cuantos eventos hay ?
for(x=0;x<numEsdev;x++) // Creamos un bucle para todos los eventos
{
var esdAct = esdev[x] ; // Seleccionamos el evento de índice x
var titulo = esdAct.getTitle(); // Título del evento
var dataIni = esdAct.getStartTime(); // Fecha de inicio del evento
var dataFi = esdAct.getEndTime(); // Fecha final del evento
//var lloc = esdAct.getLocation(); // Geolocalización del evento
var descri = esdAct.getDescription(); // Descripción del evento
var fecha = dataIni.getDate() + " de " + escribe_frase(meses[dataIni.getMonth()],idioma) ; // SeDamos formato al dia
var mes = dataIni.getMonth() ; // seleccionamos el mes
var ini = dataIni.getHours() + "." + dataIni.getMinutes(); // Hora de inicio
var fi = dataFi.getHours() + "." + dataFi.getMinutes(); // Hora final
var horario = "De " + ini + " hasta " + fi + " horas " ; // Damos formato a la hora
// creamos la salida de información a partir de las variables recopiladas
var resul = " [<b>"+ escribe_frase(titulo,idioma) + "</b>]" + salto + "<b>" + fecha + "</b>" + salto + horario + salto + "<i>" + escribe_frase(descri,idioma) + "</i>" + salto ;
var resultado = resultado + resul ; // Vamos añadiendo los eventos a la variable resultado
}
sendText(id_usuario,resultado); // Enviamos la resposta a Telegram
return true // Devolvemos True por haber creado una información
}
function alta_calendari(id_usuari,texto,nombre,idioma)
{
// Primer identifiquem el mail de l'usuari
// var datos= SpreadsheetApp.openById(ssId).getSheetByName("Usuaris").getDataRange().getValues(); // Cargamos los datos de la hoja de usuarios
var t = texto.split(" ");
if(t[1]=== undefined )
{
sendText(id_usuari,escribe_frase("Has d'indicar el teu email ",idioma));
return true;
}
var mail = t[1];
/*
for(i in datos) // Creamos un bucle para localizar el usuario a partir de su email
{
var row = datos[i];
var num_usuari = row[1]; // Carguem el id de la llista d'usuaris
if(id_usuari == num_usuari) // identifiquem usuari
{
var mail = row[3];
break;
}
}
*/
var role = "reader"; // Rols = reader,writer i owner
var acl = null;
// Check whether there is already a rule for this user
try {
var acl = Calendar.Acl.get(idCal, "user:"+ mail);
}
catch (e) {
// no existing acl record for this user - as expected. Carry on.
}
if (!acl) {
// No existing rule - insert one.
acl = {
"scope": {
"type": "user",
"value": mail
},
"role": role
};
var newRule = Calendar.Acl.insert(acl, idCal);
//sendText(id_usuari,newRule);
}
else {
// There was a rule for this user - update it.
acl.role = role;
newRule = Calendar.Acl.update(acl, idCal, acl.id)
}
var bot = sendText(id_usuari,escribe_frase("Estas afegit al Calendari: GAS_reserva_espai \n\n " + url_calendari,idioma)) ;
if(bot) sendText(id,escri_frase("@"+nombre+" Recorda que has te tenir obert el bot @GAS_test_bot per poder rebre el resultat ",idioma));
return true;
}
//var rule = shareCalendar( 'gobbledygook@group.calendar.google.com','user@example.com'); // Per compartir un calendari com a lector
/*
var calendarIds = [idCal];
var userEmail = mail;
var resource = {
'scope': {
'type': 'user',
'value': userEmail
},
'role': 'reader'
};
// for (var i = 0; i < calendarIds.length; i++) {
Calendar.Acl.insert(resource, calendarIds[0]);
// }
sendText(id_usuari,"Estas afegit al calendari : GAS_reserva_espais");
}
*/
function escribe_frase(frase,idioma)
{
if( (idioma !="ca") && (idioma.length >1) ) var frase= LanguageApp.translate(frase, 'ca', idioma); // Si els dos idiomes coincideixen dona error, per això excluim fer
// var regFirstLetter = /\b(\w)/g;
// frase = frase.replace(regFirstLetter);
return frase ;
}
function veure_calendari(iden,idioma)
{
//var iden = iden || "2" ;
var idioma = idioma || "ca" ;
var nom = "Pere" ;
//var id_usuari = posa_usuari(iden);
var id_usuari = id_meu ;
//var nom= cerca_usuari(id_usuari,2);
//var dades = SpreadsheetApp.openById(ssId).getSheetByName("horari1").getDataRange().getValues(); // Carreguem les dades per identificar el usuari
//var dies = dades[0];
var svg = '<?xml version="1.0" standalone="no"?>\n'+
'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> \n'+
'<svg width="640" height="480" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">\n'+
'<!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->\n'+
'<g> \n';
var id = 0;
svg = svg + '<title>Demo reserva espai</title>\n';
//svg = svg + '<rect fill="#ffffff" stroke="#000000" stroke-width="2" x="10" y="50" width="480" height="320" id="svg_' + id++ + '"/>\n';
//svg = svg + '<rect id="svg_'+ (id++) + '" stroke-width="2" stroke="grey" fill="white" height="40" width="80" y="50" x="10"/>\n';
svg = svg + '<text id="svg_' + id++ + '" color="blue" font-size="20" font-family="Verdana" y="25" x="200">' + escribe_frase("Reserva espai - Demo -",idioma) +' </text>\n';
var dies = new Array("Dilluns","Dimarts","Dimecres","Dijous","Divendres");
var data = new Date();
sendText(id_meu,"dia es " + data);
var num_dia = data.getDay()-1;
var dia= data.getDate();
var dia_inici = dia-num_dia;
var any = data.getYear();
var mes = data.getMonth();
var data = new Date();
var num_dia = data.getDay();
var dia= data.getDate();
//var dia_inici = dia-num_dia ;
var dia_0 = new Date(data.setDate(data.getDate()- num_dia + 1 ));
var dia_inici = 23;
var matriu = carrega_calendari(id) ;
var num = dies.length;
svg = svg + '<rect id="svg_' + (id++) + '" stroke-width="2" stroke="black" fill="#DACFCF" height="40" width="100" y="50" x="90"/> \n';
svg = svg + '<text id="svg_' + (id++) + '" color="black" font-size="15" font-family="Verdana" y="75" x="15"> Hora </text>\n';
var num_dia = 0;
var n = 0 ;
for(x=0; x<num; x++)
{
var dia = dia_0;
dia = new Date(dia.setDate(dia.getDate() + x ));
num_dia = dia.getDate();
svg = svg + '<rect id="svg_' + (id++) + '" stroke-width="2" stroke="black" fill="#DACFCF" height="40" width="100" y="50" x="' + (90 + (+x*100)) + '"/>\n';
svg = svg + '<text id="svg_' + (id++) + '" color="black" font-size="15" font-family="Verdana" y="75" x="' + (95 + (+x * 100)) + '">' + escribe_frase(dies[x],idioma) + num_dia + '</text>\n';
}
var horaris = new Array("08-09","09-10","10-11","11-12","12-13","13-14","14-15");
var num_horaris = horaris.length;
for(y=0; y<num_horaris; y++)
{
svg = svg + '<rect id="svg_' + (id++) + '" stroke-width="2" stroke="white" fill="#DACFCF" height="40" width="100" y="' + (90+(+y*40)) + '" x="10" />\n';
svg = svg + '<text id="svg_' + (id++) + '" color="black" font-size="15" font-family="Verdana" y="' + (115 + (+y*40)) + '" x="30">' + horaris[y] +'</text>\n';
for(x=0; x<num; x++)
{
var valor = matriu[y][x];
if(valor == "Lliure") var fill = "#FFFFFF";
else var fill = "#CCCCCC";
svg = svg + '<rect id="svg_' + (id++) + '" stroke-width="2" stroke="grey" fill="' + fill + '" height="40" width="100" y="' + (90 + (+40 * +y)) + '" x="' + (90 + (x*100)) + '"/>\n';
var xf = x ;
var yf = y ;
var valor2 = valor;
if(valor == "Lliure")
{
valor2 = escribe_frase(valor,idioma);
if(cerca_usuari(id_usuari)!= 0 )
{
var hora = "2020-"+String(mes)+"-"+String(dia_inici+(x))+"-" +String(y)+"-"+String(cerca_usuari(id_usuari));
svg= svg + '<a href="' + webAppUrl + '?accio=cal&hora='+hora+'&idioma='+idioma+'"> \n';
}
}
svg = svg + '<text id="svg_' + (id++) + '" color="black" font-size="15" font-family="Verdana" y="' + (+115 + (y*40)) + '" x="' + (95 + (+x * 100)) + '">' + valor2 + '</text>\n';
if(valor == "Lliure")
{
if(cerca_usuari(id_usuari)!= 0 ) svg= svg + '</a> \n';
}
if(valor == nom )
{
var hora = "2020-"+String(mes)+"-"+String(dia_inici+(x))+"-" +String(y)+"-"+String(cerca_usuari(id_usuari));
svg = svg + '<a href="' + webAppUrl + '?accio=cal2&hora='+hora+'&idioma='+idioma+'"> \n';
svg = svg + '<text id="svg_' + (id++) + '" color="black" font-size="25" font-family="Verdana" y="' + (+115 + (y*40)) + '" x="' + (160 + (+x * 100)) + '">🗑️</text>\n';
svg= svg + '</a> \n';
}
}
}
svg = svg + '</g>\n';
svg = svg + '</svg>\n';
return svg;
}
function carrega_calendari(id,idioma)
{
var id = id || id_meu;
var idioma = idioma || "ca";
var meses = new Array("Gener","Febrer","Março","Abril","Maig","Juny","Juliol","Agost","Setembre","Octubre","Novembre","Decembre");
var resultado = ""; // Inicializamos la variable resultado
var salto = "\n"; // codigo para añadir saltos de linea sin codigo HTML
var idCal = "";
var cal = CalendarApp.getCalendarById(idCal); // Seleccionamos el calendario , idCal lo tenemos definido en la cabecera
if (!cal) { // Si el calendario no existe o no tenemos permíso
resultado = "Problemas con la agenda";
sendText(id,escribe_frase(resultado,idioma)); // enviamos mensaje de error
return true; // Devolvemos True, porque se ha enviado información
}
// Busquem el dilluns de la setmana que estem
/*
var data = new Date();
var num_dia = data.getDay();
var dia= data.getDate();
var dia_inici = dia-num_dia;
*/
// string is in the format of yyyymmdd (eg. 20140807)
var data = new Date();
var num_dia = data.getDay();
var dia= data.getDate();
//var dia_inici = dia-num_dia ;
var dia_0 = new Date(data.setDate(data.getDate()- num_dia + 1 ));
var dia_1 = new Date(data.setDate(data.getDate() + 4 ));
var dia_inici = dia_0.getDate();
sendText(id_meu,dia_inici);
// var ahora = new Date(data.getFullYear(), data.getMonth() , data.getDate() )
var ahora = dia_0 ;
dia_0.setHours(0); // Li canviem l'hora a les 23.59
dia_0.setMinutes(0);
sendText(id_meu,dia_0);
//var final = new Date(data.getFullYear(), data.getMonth() , dia_inici+7)
var final = dia_1;
sendText(id_meu, dia_0);
sendText(id_meu, dia_1);
dia_1.setHours(23); // Li canviem l'hora a les 23.59
dia_1.setMinutes(59);
sendText(id_meu,dia_1);
var esdev = cal.getEvents(dia_0, dia_1); // Cargamos todos los eventos entre las dos fechas
var numEsdev = esdev.length; // Cuantos eventos hay ?
sendText(id_meu,numEsdev);
var matriu = new Array() ;
for(x=0; x<8; x++)
{
var fila= new Array();
for(z=0;z<5; z++)
{
// data="2020111609";
fila.push('Lliure');
}
matriu.push(fila);
}
for(x=0;x<numEsdev;x++) // Creamos un bucle para todos los eventos
{
var esdAct = esdev[x] ; // Seleccionamos el evento de índice x
var titulo = esdAct.getTitle(); // Título del evento
var dataIni = esdAct.getStartTime(); // Fecha de inicio del evento
var dia = dataIni.getDate() - 1;
var hora = dataIni.getHours() - +8 ;
sendText(id_meu,titulo);
matriu[hora][dia] = titulo;
}
return matriu // Devolvemos True por haber creado una información
}
function posa_usuari(iden)
{
var dades = SpreadsheetApp.openById(ssId).getSheetByName("Log").getDataRange().getValues(); // Carreguem les dades per identificar el usuari
var row = dades[iden];
return row[2];
}
function cerca_usuari(id_usuari,param)
{
var param = param || 1;
var dades = SpreadsheetApp.openById(ssId).getSheetByName("Log").getDataRange().getValues(); // Carreguem les dades per identificar el usuari
for(i in dades)
{
var row = dades[i];
var num_usuari = row[2];
if(id_usuari == num_usuari)
{
var nom = row[3];
if(param == 1) return i ;
else return nom ;
}
}
return 0
}
function foto(id){
// var response = UrlFetchApp.fetch(webAppUrl+"?accio=svg");
// var jpeg = response.getBlob().getAs("image/svg+xml");
// sendPhoto3(id,jpeg);
var folderid = "1s9T6AvoPM83qqtlh80w9RIoq1m0euUOd";
var folder = DriveApp.getFolderById(folderid);
var response = UrlFetchApp.fetch(webAppUrl+"?accio=svg");
var bl = response.getBlob();
var parents = [];
parents.push(folder);
var resource = {
title: "horari4.svg",
parents: parents,
mimeType: "image/svg+xml"
};
var file = Drive.Files.insert(resource, bl);
var newfile = DriveApp.getFileById(file.id).moveTo(folder);
//var file = folder.createFile("horari2.svg",bl);
const svgFileId = file.id; // Please set the fileId of the SVG file.
const url = Drive.Files.get(svgFileId).thumbnailLink.replace("=s220","=s1000");
const blob = UrlFetchApp.fetch(url).getBlob(); // blob is the image blob of PNG format.
sendPhoto3(id,blob);
}
function reserva_hora1(id,param,idioma)
{
var id_meu = "363029540";
var t = id.split("-");
var any = t[0]
var mes = t[1];
var dia = t[2];
var hora = t[3];
var fila = t[4];
var id_usuari = posa_usuari(fila);
var fecha = new Date(any,mes,dia);
var num_dia = fecha.getDay() - 3 ;
/*
Logger.log("fecha " + fecha);
Logger.log("Date " + fecha.getDate());
Logger.log("Day " + fecha.getDay());
*/
if(param == 1)
{
var param_si = "/res@SI-"+String(dia)+"-"+String(mes)+"-"+ String(any) +"-"+ String(hora);
var param_no = "/res@NO";
var frase = "Vols reservar espai pel " + dies[parseInt(num_dia)] + " " + String(dia)+"-"+String(mes)+"-"+ String(any) + " a les " + (+hora + 8) + "? \n" ;
}
if(param == 2)
{
var param_si = "/res2@SI-"+String(dia)+"-"+String(mes)+"-"+ String(any) +"-"+ String(hora);
var param_no = "/res2@NO";
var frase = "Vols esborrar la reserva d'espai pel " + dies[parseInt(num_dia)] + " " + String(dia)+"-"+String(mes)+"-"+ String(any) + " a les " + (+hora + 8) + "? \n";
}
var llista = new Array([{"text": "Si" , "callback_data": param_si},{"text": "No" , "callback_data": param_no }]);
var tecles = { inline_keyboard: llista , resize_keyboard: true,one_time_keyboard : true };
sendText(id_usuari,frase,tecles );
frase = frase + " Per fer definitiva la reserva, has de validar el missatge que rebras al Telegram ";
return escribe_frase(frase,idioma);
}
function reserva_hora2(id_usuari,text,param,nombre,idioma)
{
var nom = cerca_usuari(id_usuari,2);
var cal = CalendarApp.getCalendarById(idCal); // Seleccionamos el calendario , idCal lo tenemos definido en la cabecera
var w = text.split("@");
if(w[1] == "NO" )
{
sendText(id_usuari," Has renunciat a la reserva ");
return true ;
}
var t = w[1].split("-");
var any = t[3]
var mes = t[2];
var dia = t[1];
var hora = t[4];
var hora1 = +hora + 8 ;
var hora2 = +hora + 9;
var hora_ini = new Date(any,mes - 1,dia,hora1);
var hora_fi = new Date(any,mes -1 ,dia,hora2);
if(param==1)
{
cal = CalendarApp.getCalendarById(idCal).createEvent(nom, hora_ini,hora_fi);
var bot = sendText(id_usuari,escribe_frase("Tens la hora reservada. Pots fer més reserves : ",idioma));
if(bot) sendText(id,escri_frase("@"+nombre+" Recorda que has te tenir obert el bot @GAS_test_bot per poder rebre el resultat ",idioma));
sendText(id_usuari,webAppUrl+"?accio=svg&id="+cerca_usuari(id_usuari)+"&idioma="+idioma);
}
if(param==2)
{
var esdev = CalendarApp.getCalendarById(idCal).getEvents(hora_ini, hora_fi); // Cargamos todos los eventos entre las dos fechas
var esdAct = esdev[0] ; // Seleccionamos el evento de índice x
var event_id = esdAct.getId();
var params = {
calendarId: idCal,
eventId: event_id,
};
CalendarApp.getCalendarById(idCal).getEventById(event_id).deleteEvent();
sendText(id_usuari,escribe_frase("Se t'ha anul.lat la reserva. Pots fer nova reserva : ",idioma));
sendText(id_usuari,webAppUrl+"?accio=svg&id="+cerca_usuari(id_usuari)+"&idioma="+idioma);
}
return true;
}
function pdf(id_usuari,nombre,idioma)
{
var bot = sendText(id_usuari,escribe_frase("Generant documents ....",idioma));
if(bot) sendText(id,escri_frase("@"+nombre+" Recorda que has te tenir obert el bot @GAS_test_bot per poder rebre el resultat ",idioma));
var url = webAppUrl+"?accio=svg&id=0&idioma="+idioma;
var folderid = "1iZ73IEKV4kuXpEgJtCc3o6xZPC616Lis";
var folder = DriveApp.getFolderById(folderid);
var response = UrlFetchApp.fetch(url);
var bl = response.getBlob();
var parents = [];
parents.push(folder);
var resource = {
title: "horari4.svg",
parents: parents,
mimeType: "image/svg+xml"
};
//var file = folder.createFile("horari2.svg",bl);
var file = Drive.Files.insert(resource, bl);
var id = file.getId();
var newfile = DriveApp.getFileById(id).moveTo(folder);
const svgFileId = file.getId();
var width = 600;
Utilities.sleep(5000);
var url2 = Drive.Files.get(svgFileId).thumbnailLink.replace(/=s\d+/, "=s" + width);
//var url2 = Drive.Files.get(svgFileId).thumbnailLink;
sendPhoto(id_usuari,url2,"reserves_Aula_demo") ;
Utilities.sleep(5000);
var image = UrlFetchApp.fetch(url2).getBlob();
var filename="mostra.doc";
var doc = DocumentApp.create(filename);
var insertedImage = doc.getBody().insertImage(0, image);
//insertedImage.setHeight(insertedImage.Height/100);
//insertedImage.setWidth(insertedImage.Width/100);
doc.saveAndClose();
blob = doc.getAs(MimeType.PDF);
tempFileId=doc.getId();
var newfile = DriveApp.getFileById(tempFileId).moveTo(folder);
//var docblob = DriveApp.getFileById(tempFileId).getAs('application/pdf'); // Genera el contingut PDF apartir del document Final de la combinació
//docblob.setName("taula.pdf");
//var file = DriveApp.getFolderById(folderid).createFile(docblob) ; // Crea el fitxer PDF a partir del contingut guardat abans
var file = DriveApp.getFolderById(folderid).createFile(blob).setName("taula.pdf") ; // Crea el fitxer PDF a partir del contingut guardat abans
var id_pdf = file.getId();
var url = "https://drive.google.com/uc?id=" + id_pdf +"&export=download";
sendDocument(id_usuari,id_pdf,"Reserva Espais Demo ");
Drive.Files.remove(id_pdf);
Drive.Files.remove(tempFileId);
return true ;
}
function resizeImage(image) {
var height = image.getHeight();
var width = image.getWidth();
//var factor = height / 800;
//image.setHeight(height / factor);
//factor = width / 540;
//image.setWidth(width / factor);
}
/*
var url3 = Drive.Files.get(svgFileId).thumbnailLink;
var response = UrlFetchApp.fetch(url3).getBlob();
var file = folder.createFile("mostra.png", response);
var id = file.getId();
var image = DriveApp.getFileById(id);
// grab its bytes and base64-encode them.
var base64 = Utilities.base64Encode(image.getBlob().getBytes());
var html = '<img src="data:image/png;base64,'+base64+'" />';
// create a blob, convert to PDF
var blob = Utilities.newBlob(html, MimeType.HTML).setName("taula" + ".pdf");
sendDocument3(id_usuari,blob,"reserves_Aula_demo") ;
var folderID = folderToSaveTo;
var folder = DriveApp.getFolderById(folderID);
var newFile = folder.createFile(response);
Drive.Files.remove(svgFileId);
*/
/*
// var url2 = Drive.Files.get(svgFileId).thumbnailLink.replace("=s220","=s1000" );
//const blob = UrlFetchApp.fetch(url2).getBlob();
const blob = UrlFetchApp.fetch(url2).getBlob();
Drive.Files.remove(svgFileId);
//const blob = UrlFetchApp.fetch(url2).getBlob().getAs('application/pdf'); // blob is the image blob of PNG format.
//docblob.setName("Reserva_Aula_demo.pdf");
//var file = DriveApp.getFolderById(folderid).createFile(docblob) ; // Crea el fitxer PDF a partir del contingut guardat abans
//var id_pdf = file.getId();
//var url = "https://drive.google.com/uc?id=" + id_pdf +"&export=download";
sendDocument(id_usuari,blob,"reserves_Aula_demo") ;
*/
/*
// Creació del PDF
var docblob = DriveApp.getFileById(final_Id).getAs('application/pdf'); // Genera el contingut PDF apartir del document Final de la combinació
docblob.setName("certificat_" + participant +".pdf");
var file = DriveApp.getFolderById(pdfFolder_Id).createFile(docblob) ; // Crea el fitxer PDF a partir del contingut guardat abans
var id_pdf = file.getId();
var url = "https://drive.google.com/uc?id=" + id_pdf +"&export=download";
sendDocument(id_usuari,url);
*/
function svg(id_usuari,idioma)
{
//gets the name of the current doc
var id_file = "14iDldk4JfFsJZGs8UQOwFlmKZgluUM-_";
var folderid = "1iZ73IEKV4kuXpEgJtCc3o6xZPC616Lis";
var filename = DriveApp.getFileById(id_file);
var img = getImage(filename);
var blobImg = Utilities.newBlob(img, MimeType.SVG, filename);
var currentFolder = DriveApp.getFolderById(folderid);
//saves image as same name
var newimg = currentFolder.createFile(blobImg).getId();
//wait for image to save
Utilities.sleep(5 * 1000);
// get blob
// --- Added --- Begin
var width = 600; // width of the image. A value of 300 pixels was used as a sample.
var url = "https://www.googleapis.com/drive/v3/files/" + newimg + "?fields=thumbnailLink&access_token=" + ScriptApp.getOAuthToken();
var link = JSON.parse(UrlFetchApp.fetch(url).getContentText()).thumbnailLink.replace(/=s\d+/, "=s" + width);
var blob = UrlFetchApp.fetch(link).getBlob();
// --- Added --- End
sendDocument(id_usuari,blob,"reserves_Aula_demo") ;
}
Revisem junts el codi.
Pregunta: Si volem reservar diferents disposistius, cal que fem un calendari per cada dispositiu?
En cas d'haver de fer diferents calendaris, es poden gestionar tots des del mateix bot?
Si S'acaba la quota de traducció, envia el missatge sense traduir o que fa?Es queda penjat si s'acaba si no hi el try. Es poden guardar les traduccions ja fetes en un full de calcul i al conèixer l'idioma.
Si fem una entrada en un espai manualment en el calendari, es mostra quan generem la imatge?
Ens explica que si cliquem l'aranya va fent mica en mica. Podem marcar amb un punt fins on o des d'on i amb els botons de la dreta que surten després de que surti l'aranya.
Podria crear una graella que tingui els dispositius i que al clicar-los envia la url anotant l'Id de qui l'ha reservat.