# Aplicación TODO ## Codigo Servidor ```javascript= // el ID de nuestra hoja de cálculo SSID=""; // probando devolviendo todas las tareas // crear una funcion que nos devuelva una lista de tareas function todas(args){ return SpreadsheetApp.openById(SSID) .getSheetByName("tareas") .getDataRange() .getValues(); } function pendientes(args){ const {categoria} = args; sheet= SpreadsheetApp.openById(SSID).getSheetByName("pendientes") var valores = sheet.getDataRange().getValues(); var out = []; for (i=1;i< valores.length;i++){ if( valores[i][2]==categoria){out.push(valores[i])} } return out } function nuevatarea(args){ const {categoria,prioridad=3,descripcion} = args; sheet= SpreadsheetApp.openById(SSID).getSheetByName("tareas") ultima= sheet.getLastRow(); sheet.insertRowAfter(ultima); //inserta nueva fila por si no hubiese suficientes nuevoID= 1+sheet.getRange(ultima, 1, 1, 1).getValue(); sheet.getRange(ultima+1, 1, 1, 5).setValues([[nuevoID,descripcion, categoria, prioridad,"no"]]); //return "OK" return pendientes({categoria:categoria}) } function filaDelID(ID,sheetname){ sheet= SpreadsheetApp.openById(SSID).getSheetByName(sheetname) ultima= sheet.getLastRow(); indices = sheet.getRange(1,1,ultima,1).getValues(); fila = false; for(i=0;i<ultima;i++){ console.log(i,indices[i][0],sheet.getRange(i+1, 1, 1, 1).getValue()) if( indices[i][0]==ID){fila = i+1; break} } return fila } /// Obtener registro de un indice (el 4): // fila = filaDelID(4,"tareas"); // if (fila) sheet.getRange(fila,1,1,5).getValues()[0] // PELIGRO insegura, mejor no exponer en la API function cambiavalor(args){ const {id,col,valor} = args; sheet= SpreadsheetApp.openById(SSID).getSheetByName("tareas"); fila = filaDelID(id,"tareas"); if (fila) { sheet.getRange(fila,col,1,1).setValue(valor);} // escribe valor en la columna indicada else { throw "No se encuentra registro con id: "+id;} categoria = sheet.getRange(fila||2,3,1,1).getValue(); // lee columna 3 como categoria return pendientes({categoria:categoria}) } function marcacompleta(args){ const {idtarea} = args; return cambiavalor({id:idtarea,col:5,valor:"si"}) } function cambiaprioridad(args){ const {idtarea,prioridad} = args; return cambiavalor({id:idtarea,col:4,valor:prioridad}) } ``` ## HTML cliente ```htmlmixed= <html> <head> </head> <body> <h2>Probando API cliente</h2> <script> // Insertar aqui la url del script dev y exe // dev GAS="" // exe //GAS="" //llama a una url que responde un objeto JSON en una función callback // realmente devuelve un código javascript // esta funcion devuelve una Promesa, que se ejecuta al recibir los datos const JSONP = (unique => url => new Promise(rs => { const script = document.createElement('script'); const name = `_jsonp_${unique++}`; if (url.match(/\?/)) { url += `&callback=${name}`; } else { url += `?callback=${name}`; } console.log(url); script.src = url; window[name] = json => { rs(json); script.remove(); delete window[name]; }; document.body.appendChild(script); }) )(0); // comprueba que no ha habido errores const checkSuccess = (json =>{ console.log("checkSuccess: ",json); if(json.success) { // console.log("--> SUCCESS: "+json.message+" serverTimeout: "+json.serverTimeout ); return Promise.resolve(json.data);} else {return Promise.reject('Se ha producido un error: '+json.err);} }) // composicion de la url del comando a partir de los argumentos const cmd_url = ((cmd,arg) =>{ const gascript_url =GAS; var url = gascript_url+"?command="+cmd if (typeof(arg) !=="undefined") url = url+'&arg='+JSON.stringify(arg) console.log(url); return url; }) // llamada a la API function APIcall(cmd,arg){ return JSONP(cmd_url(cmd,arg)).then(checkSuccess); } </script> <p>Ejemplo:</p> <pre> APIcall("suma_ab",{a:345,b:5 }) .then(function(data){ console.log( "YA HA RESPONDIDO: ",data) console.log( "el valor devuelto es: ",data.resultado) }) </pre> <h3>Algunas Llamadas</h3> <pre> APIcall("pendientes",{categoria:"insti"}) .then(function(data){ console.log( "YA HA RESPONDIDO: ",data)}) APIcall("nuevatarea",{categoria:"insti",descripcion:"Felices vacaciones"}) .then(function(data){ console.log( "YA HA RESPONDIDO: ",data)}) APIcall("marcacompleta",{idtarea:6}) .then(function(data){ console.log( "YA HA RESPONDIDO: ",data)}) APIcall("cambiavalor",{id:7,col:2,valor:"Una nueva descripción para esta tarea"}) .then(function(data){ console.log( "YA HA RESPONDIDO: ",data)}) </pre> </body> </html> ``` ## Plantilla HTML onsen ```htmlmixed= <ons-page> <ons-toolbar> <div class="center">Pendientes</div> </ons-toolbar> <ons-select id="choose-sel" onchange="editSelects(event)"> <option value="insti">insti</option> <option value="casa">casa</option> </ons-select> <ons-list id='listaTareas'> </ons-list> <br /> </ons-page> ``` ## Plantilla JS onsen ```javascript= // dev GAS="" // exe const JSONP = (unique => url => new Promise(rs => { const script = document.createElement('script'); const name = `_jsonp_${unique++}`; if (url.match(/\?/)) { url += `&callback=${name}`; } else { url += `?callback=${name}`; } console.log(url); script.src = url; window[name] = json => { rs(json); script.remove(); delete window[name]; }; document.body.appendChild(script); }) )(0); // comprueba que no ha habido errores const checkSuccess = (json =>{ console.log("checkSuccess: ",json); if(json.success) { // console.log("--> SUCCESS: "+json.message+" serverTimeout: "+json.serverTimeout ); return Promise.resolve(json.data);} else {return Promise.reject('Se ha producido un error: '+json.err);} }) // composicion de la url del comando a partir de los argumentos const cmd_url = ((cmd,arg) =>{ const gascript_url =GAS; var url = gascript_url+"?command="+cmd if (typeof(arg) !=="undefined") url = url+'&arg='+JSON.stringify(arg) console.log(url); return url; }) // llamada a la API function APIcall(cmd,arg){ return JSONP(cmd_url(cmd,arg)).then(checkSuccess); } function editSelects(event) { //console.log("Holazz",event.target.value) APIcall("pendientes",{categoria:event.target.value}) .then(function(data){ // console.log( "YA HA RESPONDIDO: ",data) // console.log(data.length) for (i=0;i<data.length;i++){ console.log(data[i]) var elemento = document.createElement('ons-list-item'); elemento.innerHTML='<label class="left"><ons-checkbox input-id="check-1"></ons-checkbox></label>' +'<label for="check-1" class="center">' + data[i][1] +'</label>' document.getElementById('listaTareas').appendChild(elemento); } }) } ``` ## 3 de mayo ```javascript= //https://onsen.io/playground/?framework=vanilla&category=reference&module=dialog //https://onsen.io/v2/guide/#the-first-onsen-ui-app // dev GAS="https://script.google.com/a/iesvaldebernardo.es/macros/s/AKfycbyTutvXuUqw1PE3Pq4TL9XZnDTEcmKllZryjQXOwX_5/dev" // exe //GAS="https://script.google.com/macros/s/AKfycbyAxExQWFjv6-pAbr4KgR4-oxOUHUEYGLqk3AGuq0lycGSgag65/exec" //llama a una url que responde un objeto JSON en una función callback // realmente devuelve un código javascript // esta funcion devuelve una Promesa, que se ejecuta al recibir los datos const JSONP = (unique => url => new Promise(rs => { const script = document.createElement('script'); const name = `_jsonp_${unique++}`; if (url.match(/\?/)) { url += `&callback=${name}`; } else { url += `?callback=${name}`; } console.log(url); script.src = url; window[name] = json => { rs(json); script.remove(); delete window[name]; }; document.body.appendChild(script); }) )(0); // comprueba que no ha habido errores const checkSuccess = (json =>{ console.log("checkSuccess: ",json); if(json.success) { // console.log("--> SUCCESS: "+json.message+" serverTimeout: "+json.serverTimeout ); return Promise.resolve(json.data);} else {return Promise.reject('Se ha producido un error: '+json.err);} }) // composicion de la url del comando a partir de los argumentos const cmd_url = ((cmd,arg) =>{ const gascript_url =GAS; var url = gascript_url+"?command="+cmd if (typeof(arg) !=="undefined") url = url+'&arg='+JSON.stringify(arg) console.log(url); return url; }) // llamada a la API function APIcall(cmd,arg){ return JSONP(cmd_url(cmd,arg)).then(checkSuccess); } function editSelects(event) { console.log("Holazz",event.target.value) APIcall("pendientes",{categoria:event.target.value}) .then(function(data){ console.log( "YA HA RESPONDIDO: ",data) console.log(data.length) document.getElementById('listaTareas').innerHTML = ""; for (i=0;i<data.length;i++){ console.log(data[i]) var elemento = document.createElement('ons-list-item'); elemento.innerHTML='<label class="left"><ons-checkbox input-id="check-'+data[i][0]+'"' +' onclick="compruebaCheck('+"'"+data[i][0]+"'" +')"' +' "></ons-checkbox></label>' +'<label for="check-'+data[i][0]+'" class="center">' + data[i][1] +'</label>' document.getElementById('listaTareas').appendChild(elemento); } }) } function compruebaCheck(ID){ var checkBox = document.getElementById("check-"+ID); console.log("pulsado ", ID); if (checkBox.checked == true){ console.log("activo"); APIcall("marcacompleta",{idtarea:ID}) .then(function(data){ console.log( "MARCADO: ",data) }) } else { console.log("desactivado"); APIcall("marcaincompleta",{idtarea:ID}) .then(function(data){ console.log( "DESMARCADO: ",data) }) } } ``` ## Aplicacion basica en VSCodium ```htmlmixed= <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="https://unpkg.com/onsenui/css/onsenui.css"> <link rel="stylesheet" href="https://unpkg.com/onsenui/css/onsen-css-components.min.css"> <script src="https://unpkg.com/onsenui/js/onsenui.min.js"></script> </head> <body> <!-- <ons-button onclick="alert('Hello World!')">Click Me</ons-button> --> <ons-page> <ons-toolbar> <div class="center">Pendientes</div> </ons-toolbar> <ons-select id="choose-sel" onchange="editSelects(event)"> <option value="">--categoría--</option> <option value="insti">insti</option> <option value="casa">casa</option> </ons-select> <ons-list id='listaTareas'> </ons-list> <br /> <ons-fab> <ons-icon icon="md-plus"></ons-icon> </ons-fab> </ons-page> <script> //https://onsen.io/playground/?framework=vanilla&category=reference&module=dialog //https://onsen.io/v2/guide/#the-first-onsen-ui-app // dev GAS="" // exe //GAS="https://script.google.com/macros/s/AKfycbyAxExQWFjv6-pAbr4KgR4-oxOUHUEYGLqk3AGuq0lycGSgag65/exec" //llama a una url que responde un objeto JSON en una función callback // realmente devuelve un código javascript // esta funcion devuelve una Promesa, que se ejecuta al recibir los datos const JSONP = (unique => url => new Promise(rs => { const script = document.createElement('script'); const name = `_jsonp_${unique++}`; if (url.match(/\?/)) { url += `&callback=${name}`; } else { url += `?callback=${name}`; } console.log(url); script.src = url; window[name] = json => { rs(json); script.remove(); delete window[name]; }; document.body.appendChild(script); }) )(0); // comprueba que no ha habido errores const checkSuccess = (json =>{ console.log("checkSuccess: ",json); if(json.success) { // console.log("--> SUCCESS: "+json.message+" serverTimeout: "+json.serverTimeout ); return Promise.resolve(json.data);} else {return Promise.reject('Se ha producido un error: '+json.err);} }) // composicion de la url del comando a partir de los argumentos const cmd_url = ((cmd,arg) =>{ const gascript_url =GAS; var url = gascript_url+"?command="+cmd if (typeof(arg) !=="undefined") url = url+'&arg='+JSON.stringify(arg) console.log(url); return url; }) // llamada a la API function APIcall(cmd,arg){ return JSONP(cmd_url(cmd,arg)).then(checkSuccess); } function editSelects(event) { console.log("Holazz",event.target.value) if (event.target.value!=""){ APIcall("pendientes",{categoria:event.target.value}) .then(function(data){ console.log( "YA HA RESPONDIDO: ",data) console.log(data.length) document.getElementById('listaTareas').innerHTML = ""; for (i=0;i<data.length;i++){ console.log(data[i]) var elemento = document.createElement('ons-list-item'); elemento.innerHTML='<label class="left"><ons-checkbox input-id="check-'+data[i][0]+'"' +' onclick="compruebaCheck('+"'"+data[i][0]+"'" +')"' +' "></ons-checkbox></label>' +'<label for="check-'+data[i][0]+'" class="center">' + data[i][1] +'</label>' document.getElementById('listaTareas').appendChild(elemento); } }) } } function compruebaCheck(ID){ var checkBox = document.getElementById("check-"+ID); console.log("pulsado ", ID); if (checkBox.checked == true){ console.log("activo"); APIcall("marcacompleta",{idtarea:ID}) .then(function(data){console.log( "MARCADO: ",data)}) } else { console.log("desactivado"); APIcall("marcaincompleta",{idtarea:ID}) .then(function(data){console.log( "DESMARCADO: ",data)}) } } </script> </body> </html> ```