diff --git a/googleScript/Code.gs b/googleScript/Code.gs
new file mode 100644
index 0000000..5329d34
--- /dev/null
+++ b/googleScript/Code.gs
@@ -0,0 +1,726 @@
+/* ************************************************************************
+ Función que recibe los datos mediante POST y crea los archivos Sheet con los mismos.
+ ************************************************************************** */
+function doPost(e) {
+ // Leyendo configuración
+ var strDebug = "
Modo debug activado: ";
+ //[1.0, 0.0, jquintero@iac.es,nehk018@gmail.com, dataGris, Sat Dec 30 13:00:00 GMT-01:01 1899, {"Pressure":{"Pres2":{"name":"Presion2","columns":["A","I"]}},"Temperature":{"Temp1":{"name":"Temperature1","columns":["A","I"]},"Temp2":{"name":"Temperature2","columns":["A","I"]}}}]
+
+ var vals = loadFileConfig(strDebug);
+ var initParams = vals[0];
+ var debug = initParams[0];
+ var enviarEmail = initParams[1];
+ var emailList= initParams[2];
+ var timeReport= initParams[4];
+ var dataGrisDirectory = initParams[5];
+
+ strDebug = vals[1];
+ //e = 1
+ if (e != null) {
+ //sheetLocal = SpreadsheetApp.create("loggerC");
+ //row1 = [e.postData.contents];
+ //sheetLocal.appendRow(row1);
+
+ var json = JSON.parse(e.postData.contents);
+ //json = JSON.parse('{"ts": 1649259302000, "name": "Pres2", "values": {"Pres2_value": 355.0, "Pres2_category": "Pres2", "Pres2_minstatus": 0, "Pres2_maxstatus": 0, "Pres2_min": 355.0, "Pres2_max": 355.0, "Pres2_mean": 355.0, "Pres2_median": 355.0, "Pres2_samples": 60, "Pres2_tstamp": "2022-04-06 16:35:02"}}');
+
+ var name = json.name;
+ folder = getOrCreateSubFolder(dataGrisDirectory);
+ var now = new Date();
+ var fileName = Utilities.formatDate(now, 'Etc/GMT', 'yyyyMMdd') + "_" + name;
+ var sheet = getFileData(folder, fileName, strDebug, false);
+ var time = json.values[name + "_tstamp"];
+ //Logger.log(time);
+ //time = Utilities.formatDate(time, "Etc/GMT", "HH:mm:ss");
+ var minStatus = json.values[name + "_minstatus"];
+ var maxStatus = json.values[name + "_maxstatus"];
+ var min = json.values[name + "_min"];
+ var max = json.values[name + "_max"];
+ var mean = json.values[name + "_mean"];
+ var median = json.values[name + "_median"];
+ var samples = json.values[name + "_samples"];
+ var current = json.values[name + "_value"];
+ row = [time, minStatus, maxStatus, min, max, mean, median, samples, current];
+ //sheetLocal.appendRow(row);
+
+ sheet.appendRow(row);
+
+ if (debug == 1) {
+ Logger.log(strDebug);
+ }
+ return ContentService.createTextOutput("Ok");
+ } else {
+ console.warn("No se han recibido datos");
+ return ContentService.createTextOutput("Error. No se han recibido datos.");
+ }
+}
+
+/* ************************************************************************
+ Función que envía un email diario con los datos actuales.
+ ************************************************************************** */
+function checkLimits() {
+ var strDebug = "
Modo debug activado: ";
+ //[1.0, 0.0, jquintero@iac.es,nehk018@gmail.com, dataGris, Sat Dec 30 13:00:00 GMT-01:01 1899, {"Pressure":{"Pres2":{"name":"Presion2","columns":["A","I"]}},"Temperature":{"Temp1":{"name":"Temperature1","columns":["A","I"]},"Temp2":{"name":"Temperature2","columns":["A","I"]}}}]
+
+ var vals = loadFileConfig(strDebug);
+ var initParams = vals[0];
+ var debug = initParams[0];
+ var isEnviarEmail = initParams[1];
+ var emailList= initParams[2];
+ var timeReport= initParams[4];
+ var dataGrisDirectory = initParams[3];
+
+
+ folder = getOrCreateSubFolder(dataGrisDirectory);
+ var ficherosAProcesar = JSON.parse(initParams[5]);
+ //console.log(ficherosAProcesar);
+
+ strBody = "ALERT:\n"
+ //console.log(dataGrisDirectory);
+ var now = new Date();
+ //console.log(now);
+ var fileName = Utilities.formatDate(now, 'Etc/GMT', 'yyyyMMdd');
+ //console.log(fileName);
+ keys = Object.keys(ficherosAProcesar);
+ var enviarAviso = 0;
+ for (i in keys) {
+ strBody += " " + keys[i] + " \n";
+
+ graphName = keys[i];
+ numColumnas = 0;
+ //Logger.log(keys[i]);
+ graphData = ficherosAProcesar[keys[i]];
+ keysGraphs = Object.keys(graphData);
+ //Logger.log(keysGraphs);
+
+
+ limits = {};
+ listaLimites = [];
+
+ for (k in keysGraphs) {
+
+ fileData = graphData[keysGraphs[k]];
+ nameData = fileData.name;
+ columnas = fileData.columns;
+ graphName = fileName + "_" + keysGraphs[k];
+
+ limits = fileData.limit;
+ fichero = getFileData(folder, graphName, strDebug, true);
+ lastRow = fichero.getLastRow();
+ strBody += " * " + keysGraphs[k] + ": ";
+ var valor = [];
+ for(j=0; j < 3; j++) {
+ strColumna = columnas[columnas.length-1] + lastRow;
+ //Logger.log(strColumna);
+ valor.push(Number(fichero.getRange(strColumna).getValues()));
+ //console.log(bouncer(data));
+ if (j == 0) {
+ strBody += valor + " ";
+ }
+ lastRow --;
+ }
+
+ //var data = fichero.getRange("A100", "I100"]).getValues();
+ //console.log(valor);
+ //console.log(limits);
+ //console.log("-----------------");
+ for (l in limits) {
+ //if ()
+ val_limit = limits[l];
+
+ if (val_limit < valor[0] &&
+ val_limit < valor[1] &&
+ val_limit < valor[2]) {
+ //console.log("Enviar aviso");
+ enviarAviso = 1;
+ }
+ }
+ strBody += " (Limits: " + limits + ")";
+ strBody += "\n";
+ }
+
+ strBody += " ---------- \n";
+ }
+
+ //console.log(strBody);
+
+ if (checkEnviarAviso(enviarAviso)) {
+ enviamosEmail(initParams, "GRIS WARNING", strBody);
+ } else {
+ console.log("No se envía aviso");
+ }
+}
+function checkEnviarAviso(enviarAviso) {
+
+ var fileName = "avisos";
+ var files = DriveApp.getFiles();
+ var encontrado = false;
+ var initParams = null;
+
+ while (files.hasNext() && !encontrado){
+ file = files.next();
+ if (file.getName() == fileName) {
+ encontrado = true;
+ }
+ }
+ var sheet;
+ if (encontrado) {
+ sheet = SpreadsheetApp.open(file);
+ var rango = sheet.getSheets()[0].getRange(1,1,1,1);
+ initParams = rango.getValues()[0];
+ //Logger.log(initParams);
+ } else {
+ sheet = SpreadsheetApp.create(fileName);
+ initParams = [0];
+ sheet.appendRow(initParams);
+ }
+ avisoEnviado = initParams[0];
+
+ if (enviarAviso == 1 && avisoEnviado == 0) {
+ sheet.getActiveSheet().getRange(1,1).setValue(1);
+ console.log("Enviamos aviso");
+ return true;
+ }
+ if (enviarAviso == 0 && avisoEnviado == 1) { // Se restaura la normalidad.
+ sheet.getActiveSheet().getRange(1, 1).setValue(0);
+ console.log("Restauramos la normalidad");
+ }
+ return false;
+}
+
+/* ************************************************************************
+ Función que envía un email diario con los datos actuales.
+ ************************************************************************** */
+function dailyEmail() {
+ var strDebug = "
Modo debug activado: ";
+ //[1.0, 0.0, jquintero@iac.es,nehk018@gmail.com, dataGris, Sat Dec 30 13:00:00 GMT-01:01 1899, {"Pressure":{"Pres2":{"name":"Presion2","columns":["A","I"]}},"Temperature":{"Temp1":{"name":"Temperature1","columns":["A","I"]},"Temp2":{"name":"Temperature2","columns":["A","I"]}}}]
+
+ var vals = loadFileConfig(strDebug);
+ var initParams = vals[0];
+ var debug = initParams[0];
+ var isEnviarEmail = initParams[1];
+ var emailList= initParams[2];
+ var timeReport= initParams[4];
+ var dataGrisDirectory = initParams[3];
+
+
+ folder = getOrCreateSubFolder(dataGrisDirectory);
+ var ficherosAProcesar = JSON.parse(initParams[5]);
+ //console.log(ficherosAProcesar);
+
+ strBody = "Daily Gris Instrument report:\n"
+ //console.log(dataGrisDirectory);
+ var now = new Date();
+ //console.log(now);
+ var fileName = Utilities.formatDate(now, 'Etc/GMT', 'yyyyMMdd');
+ //console.log(fileName);
+ keys = Object.keys(ficherosAProcesar);
+
+ for (i in keys) {
+ strBody += " " + keys[i] + " \n";
+
+ graphName = keys[i];
+ numColumnas = 0;
+ //Logger.log(keys[i]);
+ graphData = ficherosAProcesar[keys[i]];
+ keysGraphs = Object.keys(graphData);
+ //Logger.log(keysGraphs);
+
+
+ limits = {};
+ listaLimites = [];
+
+ for (k in keysGraphs) {
+
+ fileData = graphData[keysGraphs[k]];
+ nameData = fileData.name;
+ columnas = fileData.columns;
+ graphName = fileName + "_" + keysGraphs[k];
+
+ limits = fileData.limit;
+ fichero = getFileData(folder, graphName, strDebug, true);
+ lastRow = fichero.getLastRow();
+ strBody += " * " + keysGraphs[k] + ":";
+
+ for(j=0; j < columnas.length; j++) {
+ strColumna = columnas[j] + lastRow;
+ //Logger.log(strColumna);
+ var data = fichero.getRange(strColumna).getValues();
+ //console.log(bouncer(data));
+ strBody += data + " ";
+ }
+
+ //var data = fichero.getRange("A100", "I100"]).getValues();
+ //console.log(limits);
+
+ strBody += " (Limits: " + limits + ")";
+ strBody += "\n";
+ }
+
+ strBody += " ---------- \n";
+ }
+
+ enviamosEmail(initParams, "DAILY REPORT", strBody);
+}
+
+/* ************************************************************************
+ Función que envía un email
+ ************************************************************************** */
+function enviamosEmail(initParams, subject, mensaje) {
+ var isEnviarEmail = initParams[1];
+ var emailList= initParams[2];
+ if (isEnviarEmail == 1) {
+ MailApp.sendEmail(emailList, subject, mensaje);
+ } else {
+ console.log("Enviar email desactivado");
+ console.log(mensaje);
+ }
+}
+
+/* ************************************************************************
+ Función que sirve muestra el HTML con las gráficas.
+ ************************************************************************** */
+function doGet(e) {
+ return HtmlService.createHtmlOutputFromFile('graficas').setTitle('Gris graphics');;
+}
+
+/* ************************************************************************
+ Función que devuelve un map con los datos de la fecha especificada por parámetro.
+ ************************************************************************** */
+function getGraphs(date, numDays) {
+ //date = '20230306';
+ numDays = 1;
+ var strDebug = "
Get Graph's List:";
+ //[1.0, 0.0, jquintero@iac.es,nehk018@gmail.com, dataGris, Sat Dec 30 13:00:00 GMT-01:01 1899, {"Pressure":{"Pres2":{"name":"Presion2","columns":["A","I"]}},"Temperature":{"Temp1":{"name":"Temperature1","columns":["A","I"]},"Temp2":{"name":"Temperature2","columns":["A","I"]}}}]
+ var vals = loadFileConfig(strDebug);
+
+ /*var debug = initParams[0];
+ var enviarEmail = initParams[1];
+ var emailList= initParams[2];
+ var timeReport= initParams[4];
+ var dataGrisDirectory = initParams[5];*/
+
+
+ var initParams = vals[0];
+ var debug = initParams[0];
+ var dataGrisDirectory = initParams[3];
+
+ /*sheetLocal = SpreadsheetApp.create("loggerC");
+ row1 = [date, numDays];
+ sheetLocal.appendRow(row1);*/
+
+ var ficherosAProcesar = JSON.parse(initParams[5]);
+ strDebug = vals[1];
+
+ folder = getOrCreateSubFolder(dataGrisDirectory);
+
+ resultado = [];
+ keys = Object.keys(ficherosAProcesar);
+ var year = +date.substring(0, 4)
+ var month = +date.substring(4, 6)
+ var day = +date.substring(6, 8)
+ var files = [];
+ var pubdate = new Date(year, month - 1, day)
+
+ //Logger.log(ficherosAProcesar);
+ for (i in keys) {
+ graphName = keys[i];
+ numColumnas = 0;
+ //Logger.log(keys[i]);
+ graphData = ficherosAProcesar[keys[i]];
+ keysGraphs = Object.keys(graphData);
+ //Logger.log(keysGraphs);
+
+
+ limits = {};
+ listaLimites = [];
+
+ for (k in keysGraphs) {
+ fileData = graphData[keysGraphs[k]];
+ nameData = fileData.name;
+ columnas = fileData.columns;
+
+ limits = fileData.limit;
+
+ counter = 0;
+
+ for (l in limits) {
+ var limite = {};
+ nameLimit = "Limit " + counter + " (" + keysGraphs[k] + ")";
+ //Logger.log(nameLimit);
+ //Logger.log(limits[l]);
+ limite["name"]= nameLimit;
+ limite["value"] = limits[l];
+ limite["origen"] = keysGraphs[k];
+ //Logger.log(limite);
+ listaLimites.push(limite);
+ counter ++;
+ }
+ //Logger.log(listaLimites);
+
+ for(m=0; m element2)
+ return -1; //Sort element1 before element2
+ if(element1 < element2)
+ return 1; //Sort element1 after element2
+ return 0; //Don't change the positions of element1 and element2
+}
+
+function ascOrder(element1, element2) {
+ if(element1 > element2)
+ return 1; //Sort element1 before element2
+ if(element1 < element2)
+ return -1; //Sort element1 after element2
+ return 0; //Don't change the positions of element1 and element2
+}
+
+function getFilesNames() {
+ var strDebug = "
GetFilesnames";
+ //[1.0, 0.0, jquintero@iac.es,nehk018@gmail.com, dataGris, Sat Dec 30 13:00:00 GMT-01:01 1899, {"Pressure":{"Pres2":{"name":"Presion2","columns":["A","I"]}},"Temperature":{"Temp1":{"name":"Temperature1","columns":["A","I"]},"Temp2":{"name":"Temperature2","columns":["A","I"]}}}]
+ var vals = loadFileConfig(strDebug);
+ var initParams = vals[0];
+ var debug = initParams[0];
+ var dataGrisDirectory = initParams[3];
+ strDebug = vals[1];
+
+ folder = getOrCreateSubFolder(dataGrisDirectory);
+
+ var files = folder.getFiles();
+ var aux = {};
+ while (files.hasNext()){
+ file = files.next();
+ name = file.getName().split("_")[0];
+ aux[name] = 1;
+ }
+ var result = [];
+ for (var key in aux) {
+ result.push(key);
+ }
+ //Logger.log(strDebug);
+ //Logger.log(result);
+ return result.sort(descOrder);
+}
+
+function loadFileConfig(strDebug) {
+ var fileName = "configGris3";
+ var files = DriveApp.getFiles();
+ var encontrado = false;
+ var initParams = null;
+
+ while (files.hasNext() && !encontrado){
+ file = files.next();
+ if (file.getName() == fileName) {
+ encontrado = true;
+ }
+ }
+
+ if (encontrado) {
+ strDebug += "
Abriendo fichero: " + fileName;
+ sheet = SpreadsheetApp.open(file);
+ var rango = sheet.getSheets()[0].getRange(2,1,1,6);
+ initParams = rango.getValues()[0];
+ //Logger.log(initParams);
+ } else {
+ sheet = SpreadsheetApp.create(fileName);
+ initParams = ["Debug", "Send emails", "List of emails", "Excel directory", "Time Email", 'Graph configuration'];
+ sheet.appendRow(initParams);
+ initParams = [1, 0, "jquintero@iac.es,nehk018@gmail.com", "dataGris", "13:00", '{"Pressure":{"Pres2":{"name":"Presion2","columns":["A","I"]}},"Temperature":{"Temp1":{"name":"Temperature1","columns":["A","I"]},"Temp2":{"name":"Temperature2","columns":["A","I"]}}}'];
+ strDebug += "
Creando fichero: " + fileName;
+
+ sheet.appendRow(initParams);
+ }
+ // Establecemos las variables globales.
+ strDebug += "
Configuración: " + initParams;
+
+ return [initParams, strDebug];
+}
+
+function getFileData(folder, fileName, strDebug, soloabrir) {
+ var files = folder.getFiles();
+ var encontrado = false;
+ while (files.hasNext() && !encontrado){
+ file = files.next();
+ if (file.getName() == fileName) {
+ encontrado = true;
+ }
+ }
+ var sheet = null;
+ if (encontrado) {
+ //Logger.log(folder);
+ strDebug += "
Abriendo fichero: " + folder.getName() + " " + fileName;
+ sheet = SpreadsheetApp.open(file);
+ } else if (!soloabrir) {
+
+ strDebug += "
Creando fichero: " + fileName;
+ sheet = SpreadsheetApp.create(fileName);
+ var row = ["tstamp","min", "max", "min", "max", "mean", "median", "samples", "current"];
+ sheet.appendRow(row);
+ var file = DriveApp.getFileById(sheet.getId());
+ var docfile = file.moveTo(folder);
+ }
+ return sheet;
+}
+
+function getOrCreateSubFolder(childFolderName) {
+ folders = DriveApp.getFolders();
+ var encontrado = false;
+ var folder = null;
+ while (folders.hasNext() && ! encontrado) {
+ folder = folders.next();
+ if (folder.getName() == childFolderName) {
+ encontrado = true;
+ }
+ }
+ if (! encontrado) {
+ folder = DriveApp.createFolder(childFolderName);
+ }
+ return folder;
+}
\ No newline at end of file
diff --git a/googleScript/graficas.html b/googleScript/graficas.html
new file mode 100644
index 0000000..1eaa21f
--- /dev/null
+++ b/googleScript/graficas.html
@@ -0,0 +1,351 @@
+
+
+ Gris Graphs 2
+
+
+
+
+
+
+
+ Select day:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/googleScript/readme.txt b/googleScript/readme.txt
new file mode 100644
index 0000000..1a92524
--- /dev/null
+++ b/googleScript/readme.txt
@@ -0,0 +1 @@
+Módulo que permite publicar las gráficas utilizando los sistemas de scripts de Google.