{"id":4743,"date":"2021-08-11T10:07:09","date_gmt":"2021-08-11T08:07:09","guid":{"rendered":"https:\/\/tecnocentres.org\/?p=4743"},"modified":"2021-08-11T11:36:46","modified_gmt":"2021-08-11T09:36:46","slug":"utilizar-gas-para-crear-aplicaciones-web-2a-parte","status":"publish","type":"post","link":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/","title":{"rendered":"Utilizar GAS para crear aplicaciones web (2\u00aa parte)"},"content":{"rendered":"<p style=\"text-align: justify;\">Despu\u00e9s del <a href=\"https:\/\/tecnocentres.org\/es\/utilizar-gas-para-crear-aplicaciones-web-1a-parte\/\" target=\"_blank\" rel=\"noopener\">primer art\u00edculo<\/a> explicando un poco qu\u00e9 son las web apps hechas con Google Apps Script (GAS) vamos a ver en este segundo art\u00edculo c\u00f3mo crear una sencilla. Y lo har\u00e9 con un ejemplo real, relacionado con la evaluaci\u00f3n de los alumnos. Ya aviso que este art\u00edculo ser\u00e1 mucho m\u00e1s t\u00e9cnico y que se necesitan conocimientos de GAS, de html, de estilos css y de javascript. Como dicen mis amigos del grupo de coordinadores del GEG Spain, ser\u00e1 en lenguaje \u00ab<em>balleno<\/em>\u00ab.<\/p>\n<p style=\"text-align: justify;\">Crearemos una aplicaci\u00f3n para que los alumnos rellenen un KPSI (Knowledge and Prior Study Inventory) al iniciar una unidad o proyecto y lo vuelvan a rellenar en terminarlo. Para los que no conozc\u00e1is el instrumento KPSI no es nada m\u00e1s que unas preguntas sobre el tema, donde los alumnos <strong>no<\/strong> tienen que dar la respuesta, sino que deben indicar si conocen la respuesta. Sirve para ser conscientes de los conocimientos previos y para que el alumno se d\u00e9 cuenta del progreso que ha hecho al acabar.<\/p>\n<p style=\"text-align: justify;\">Para que se pueda seguir mejor, en <a href=\"https:\/\/drive.google.com\/drive\/folders\/19TtTlTEO6KW7AKRXTwslWWTnjEl2X-Eq?usp=sharing\" target=\"_blank\" rel=\"noopener\">esta carpeta<\/a> se pueden encontrar los archivos finales, tanto la hoja de c\u00e1lculo como el script con el c\u00f3digo y los html.<\/p>\n<p><!--more--><\/p>\n<p style=\"text-align: justify;\">Haremos una aplicaci\u00f3n para que los alumnos respondan el siguiente KPSI de 4 preguntas.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4744 \" src=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/1-2.png\" alt=\"\" width=\"581\" height=\"301\" srcset=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/1-2.png 787w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/1-2-300x156.png 300w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/1-2-768x398.png 768w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/1-2-640x332.png 640w\" sizes=\"auto, (max-width: 581px) 100vw, 581px\" \/><\/p>\n<p style=\"text-align: justify;\">Para empezar, vamos a crear una hoja de c\u00e1lculo (sin ning\u00fan script) para poder guardar los datos. La hoja podr\u00eda ser como la siguiente (se puede encontrar en <a href=\"https:\/\/drive.google.com\/drive\/folders\/19TtTlTEO6KW7AKRXTwslWWTnjEl2X-Eq\" target=\"_blank\" rel=\"noopener\">la carpeta<\/a>):<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4747 size-full\" src=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/2-2.png\" alt=\"\" width=\"1771\" height=\"331\" srcset=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/2-2.png 1771w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/2-2-300x56.png 300w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/2-2-1024x191.png 1024w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/2-2-768x144.png 768w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/2-2-1536x287.png 1536w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/2-2-1040x194.png 1040w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/2-2-640x120.png 640w\" sizes=\"auto, (max-width: 1771px) 100vw, 1771px\" \/><\/p>\n<p style=\"text-align: justify;\">A continuaci\u00f3n, vamos a crear un script (este script siempre se crea en mi unidad, pero luego se puede desplazar a la carpeta que queramos).<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4694\" src=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-1.png\" alt=\"\" width=\"600\" height=\"408\" srcset=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-1.png 1212w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-1-300x204.png 300w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-1-1024x696.png 1024w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-1-768x522.png 768w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-1-1040x707.png 1040w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-1-640x435.png 640w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p style=\"text-align: justify;\">El script comenzar\u00e1 con algunas definiciones de variables constantes, la direcci\u00f3n de la hoja, el nombre de las hojas y la direcci\u00f3n del usuario, y, de momento, tendr\u00e1 una sola funci\u00f3n, la funci\u00f3n doGet.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4750 \" src=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-2.png\" alt=\"\" width=\"863\" height=\"215\" srcset=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-2.png 1152w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-2-300x75.png 300w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-2-1024x255.png 1024w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-2-768x191.png 768w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-2-1040x259.png 1040w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/3-2-640x159.png 640w\" sizes=\"auto, (max-width: 863px) 100vw, 863px\" \/><\/p>\n<p style=\"text-align: justify;\">Como dec\u00eda en el anterior art\u00edculo, para crear web apps hay que saber GAS, html, css y javascript. As\u00ed que no me entretendr\u00e9 demasiado a explicar cada funci\u00f3n, ya que sino, m\u00e1s que un art\u00edculo, esto ser\u00eda un curso completo.<\/p>\n<p style=\"text-align: justify;\">La funci\u00f3n doGet es la \u00fanica que puede servir p\u00e1ginas html en las web apps. Por tanto, es en esta funci\u00f3n donde pondremos el c\u00f3digo. De entrada, recogeremos todos los datos que haya en la hoja de c\u00e1lculo. Comprobamos que el usuario que contesta est\u00e1 en la lista de los alumnos.<\/p>\n<pre>\/\/URL de la hoja de c\u00e1lculo\r\nconst full_control=\"https:\/\/docs.google.com\/spreadsheets\/d\/1iwl4xEoPuaFovufPr-YktmK0Z3jk8EvUmxQmgrreicE\/edit\";\r\n\r\n\/\/Nombre de la pesta\u00f1a de la hoja de c\u00e1lculo\r\nconst full=\"Hoja 1\";\r\n\r\n\/\/Reogemos la direcci\u00f3n del usuario l'adre\u00e7a de l'usuar\r\nconst usuari=Session.getActiveUser().getEmail();\r\n\r\nfunction doGet(e) {\r\n \/\/Comprobamos si el usuario est\u00e1 en la lista de alumnos\r\n var spreadsheet = SpreadsheetApp.openByUrl(full_control); \r\n var sheet = spreadsheet.getSheetByName(full);\r\n var rang = sheet.getDataRange();\r\n var alumnes = rang.getValues();\r\n var numRows = rang.getNumRows();\r\n let identificacio=0;\r\n for (let i=1;i&lt;numRows;i++){\r\n  if (alumnes[i][1]==usuari){\r\n   identificacio=1;\r\n  }\r\n }\r\n \/\/Si el alumno no est\u00e1 en la llista, se indica con un mensaje emergente\r\n if (identificacio==0){\r\n  return HtmlService.createHtmlOutputFromFile('html_no_autoritzado').setTitle(\"Aplicaci\u00f3n KPSI\")\r\n }else{\r\n\r\n}<\/pre>\n<p style=\"text-align: justify;\">En caso de que el usuario no est\u00e9 en la lista, devolvemos un html. Este html debemos crearlo en el script. En el c\u00f3digo que he puesto, lo he llamado html_no_autoritzado.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4700\" src=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/5.png\" alt=\"\" width=\"260\" height=\"181\" srcset=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/5.png 726w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/5-300x209.png 300w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/5-640x446.png 640w\" sizes=\"auto, (max-width: 260px) 100vw, 260px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4756 \" src=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/4-1.png\" alt=\"\" width=\"817\" height=\"284\" srcset=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/4-1.png 1215w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/4-1-300x104.png 300w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/4-1-1024x356.png 1024w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/4-1-768x267.png 768w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/4-1-1040x361.png 1040w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/4-1-640x222.png 640w\" sizes=\"auto, (max-width: 817px) 100vw, 817px\" \/><\/p>\n<p style=\"text-align: justify;\">Aunque la aplicaci\u00f3n ser\u00e1 p\u00fablica en nuestro dominio (para quienes conozcan la URL), ya nos hemos asegurado que solo puedan utilizar la aplicaci\u00f3n nuestros alumnos.<\/p>\n<p>Ahora nos toca llenar la otra parte del if, el else. Si el usuario es uno de nuestros alumnos, le mostraremos la p\u00e1gina html que debe rellenar. Esta p\u00e1gina la llamaremos KPSI.html<\/p>\n<pre>\/\/Si el alumno no est\u00e1 en la llista, se indica con un mensaje emergente\r\nif (identificacio==0){\r\n  return HtmlService.createHtmlOutputFromFile('html_no_autoritzado').setTitle(\"Aplicaci\u00f3n KPSI\")\r\n}else{\r\n  \/\/Abrimos la pantalla de la aplicaci\u00f3n, pasando los par\u00e1metros necesarios\r\n  plantilla=HtmlService.createTemplateFromFile('KPSI');\r\n  plantilla.usuari=usuari;\r\n  plantilla.alumnes=alumnes;\r\n  return plantilla.evaluate().setTitle(\"Aplicaci\u00f3n KPSI\") \r\n}<\/pre>\n<p style=\"text-align: justify;\">A diferencia de cuando no era un alumno nuestro, que utiliz\u00e1bamos <em>createHtmlOutputFromFile<\/em> para mostrar la p\u00e1gina html, ahora utilizamos <em>createTemplateFromFile<\/em>, que nos permite pasar par\u00e1metros. Cuando el usuario no es un alumno, basta con mostrar un mensaje. Ahora, habr\u00e1 que mostrar una cabecera con el mail del alumno y, si ya ha contestado el KPSI, habr\u00e1 que mostrar sus respuestas anteriores. Para ello hay que pasar como par\u00e1metros, el usuario y el contenido de la Hoja 1.<\/p>\n<p>Vamos ahora por el contenido de la p\u00e1gina KPSI. Comenzaremos con dos referencias dentro del head<\/p>\n<pre>&lt;html&gt;\r\n&lt;head&gt;\r\n&lt;title&gt;Aplicaci\u00f3n KPSI&lt;\/title&gt;\r\n&lt;base target=\"_top\"&gt;\r\n&lt;link href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.0.2\/dist\/css\/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-EVSTQN3\/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC\" crossorigin=\"anonymous\"&gt;\r\n&lt;?!= include('css.html'); ?&gt;<\/pre>\n<p style=\"text-align: justify;\">La primera (&lt;link href = \u00abhttps:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.0.2\/dist\/css\/bootstrap.min.css\u00bb &#8230;) es para poder utilizar los estilos de <em>bootstrap<\/em> para dar formado a nuestra p\u00e1gina. Se podr\u00eda hacer creando nosotros todo el css, pero ser\u00eda m\u00e1s complicado de hacer adaptable a diferentes tama\u00f1os de pantallas. Si no se conocen las clases de bootstrap, en <a href=\"https:\/\/getbootstrap.com\/docs\/5.1\/getting-started\/introduction\/\" target=\"_blank\" rel=\"noopener\">este enlace encontrar\u00e9is la documentaci\u00f3n<\/a>.<\/p>\n<p style=\"text-align: justify;\">La segunda (&lt;?! = Include ( &#8216;css.html&#8217;);?&gt;) nos permite tener nuestro propio hoja de estilos. Nos tocar\u00e1 crear otro html que lleve por nombre css y poner nuestros estilos.<\/p>\n<pre>&lt;style&gt;\r\n  div.cap\r\n  {\r\n    color:#ffffff;\r\n    background-color: gray;\r\n  }\r\n  div.titol{\r\n    font-weight: bold;\r\n    font-size: 1.4em;\r\n    height: 50px;\r\n  }\r\n&lt;\/style&gt;<\/pre>\n<div>\n<div style=\"text-align: justify;\">Adem\u00e1s, en el archivo de c\u00f3digo donde est\u00e1 la funci\u00f3n doGet, tendremos que a\u00f1adir una funci\u00f3n nueva, include, que es la que permite incrustar los estilos que creamos en el css.<\/div>\n<pre>function include(filename) {\r\n \u00a0return\u00a0HtmlService.createHtmlOutputFromFile(filename)\r\n \u00a0\u00a0\u00a0\u00a0\u00a0.getContent();\r\n}<\/pre>\n<\/div>\n<p style=\"text-align: justify;\">Pero no nos distraigamos y seguimos con la p\u00e1gina KPSI.html. Una vez, indicado en el head las referencias, definimos una cabecera ya dentro del body. Aprovechando los estilos de bootstrap, podemos crear como un grid de fondo y colocar los campos donde queramos (en filas y columnas). Adem\u00e1s, a\u00f1adimos css personalizado para dar el aspecto que queremos (como div \u00abcap\u00bb y div \u00abtitol\u00bb, que est\u00e1n definidos en el css.html).<\/p>\n<pre>&lt;html&gt;\r\n &lt;head&gt;\r\n  &lt;title&gt;KPSI&lt;\/title&gt;\r\n  &lt;base target=\"_top\"&gt;\r\n  &lt;link href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.0.2\/dist\/css\/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-EVSTQN3\/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC\" crossorigin=\"anonymous\"&gt;\r\n  &lt;?!= include('css.html'); ?&gt;\r\n &lt;\/head&gt;\r\n &lt;body&gt;\r\n  &lt;div class=\"container\"&gt;\r\n   &lt;div class=\"row cap\"&gt;\r\n    &lt;div class=\"col titol\"&gt;\r\n      Aplicaci\u00f3 KPSI\r\n    &lt;\/div&gt;\r\n    &lt;div class=\"col-2\"&gt;\r\n      Mail del alumno: &lt;?= usuari ?&gt;\r\n    &lt;\/div&gt;\r\n   &lt;\/div&gt;\r\n  &lt;div&gt;\r\n &lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>F\u00edjense que ya hacemos aparecer uno de los par\u00e1metros que hemos pasado, el mail del alumno. Simplemente indicamos que es c\u00f3digo javascript con los s\u00edmbolos &lt;?\u00a0 \u00a0?&gt;.<\/p>\n<p>Pero probamos que lo que estamos haciendo funciona. Si hemos creado todos los archivos (html_no_autoritzado, KPSI y css), utilizamos el bot\u00f3n Implementar y elegimos la opci\u00f3n de <em>Nueva implementaci\u00f3n.<\/em><\/p>\n<p style=\"text-align: left;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4715 \" src=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/7-1.png\" alt=\"\" width=\"715\" height=\"261\" srcset=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/7-1.png 1411w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/7-1-300x109.png 300w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/7-1-1024x374.png 1024w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/7-1-768x280.png 768w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/7-1-1040x380.png 1040w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/7-1-640x234.png 640w\" sizes=\"auto, (max-width: 715px) 100vw, 715px\" \/>Elegimos que el tipo sea <em>Aplicaci\u00f3n web.<\/em><\/p>\n<p style=\"text-align: center;\"><span style=\"font-size: 1rem;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4718 \" src=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/8-1.png\" alt=\"\" width=\"242\" height=\"183\" srcset=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/8-1.png 852w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/8-1-300x227.png 300w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/8-1-768x582.png 768w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/8-1-640x485.png 640w\" sizes=\"auto, (max-width: 242px) 100vw, 242px\" \/><\/span><\/p>\n<p style=\"text-align: justify;\">Indicamos una descripci\u00f3n (como el n\u00famero de versi\u00f3n), que quien ejecute la aplicaci\u00f3n seamos nosotros (que somos los \u00fanicos que tenemos acceso a la hoja de c\u00e1lculo) y que tenga acceso a cualquier usuario de nuestro dominio (ya que ya controlamos por c\u00f3digo que sea un alumno).<\/p>\n<p style=\"text-align: center;\"><span style=\"font-size: 1rem;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4721\" src=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/9.png\" alt=\"\" width=\"459\" height=\"364\" srcset=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/9.png 940w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/9-300x238.png 300w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/9-768x609.png 768w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/9-640x507.png 640w\" sizes=\"auto, (max-width: 459px) 100vw, 459px\" \/><\/span><\/p>\n<p style=\"text-align: justify;\">Como todos los scripts, nos aparecer\u00e1 una pantalla pidiendo acceso y tendremos que otorgar permisos al script. Una vez dados, ya nos aparece la direcci\u00f3n para probarla. Si la direcci\u00f3n de nuestro usuario es uno de los de la lista en la hoja de c\u00e1lculo, nos aparecer\u00e1 la siguiente pantalla.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4761 size-full\" src=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/5-1.png\" alt=\"\" width=\"1698\" height=\"126\" srcset=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/5-1.png 1698w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/5-1-300x22.png 300w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/5-1-1024x76.png 1024w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/5-1-768x57.png 768w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/5-1-1536x114.png 1536w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/5-1-1040x77.png 1040w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/5-1-640x47.png 640w\" sizes=\"auto, (max-width: 1698px) 100vw, 1698px\" \/><\/p>\n<p style=\"text-align: justify;\">El color de fondo lo podemos cambiar f\u00e1cilmente con nuestro css. Si hacemos cambios en el c\u00f3digo y queremos volver a probarlo, en lugar de utilizar la opci\u00f3n de nueva implementaci\u00f3n, es mucho mejor utilizar la opci\u00f3n de <strong>implementaciones de pruebas<\/strong>. Cuando ya hayamos hecho todas las pruebas, ya volveremos a hacer una nueva Implementaci\u00f3n para obtener la direcci\u00f3n definitiva que deber\u00e1n utilizar los alumnos.<\/p>\n<p style=\"text-align: justify;\">Ahora hay que seguir trabajando con la p\u00e1gina KPSI para que aparezcan las cuatro preguntas que los alumnos deben contestar y los desplegables. Doy por supuesto que se sabe html y javascript, as\u00ed que pongo el c\u00f3digo y comento las cosas m\u00e1s importantes.<span style=\"background-color: #eeeeee; font-family: 'Courier 10 Pitch', Courier, monospace; font-size: 0.9375rem;\">&lt;<\/span><\/p>\n<div>\n<pre>&lt;html&gt;\r\n &lt;head&gt;\r\n  &lt;title&gt;Apliaci\u00f3n KPSI&lt;\/title&gt;\r\n  &lt;base target=\"_top\"&gt;\r\n  &lt;link href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.0.2\/dist\/css\/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-EVSTQN3\/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC\" crossorigin=\"anonymous\"&gt;\r\n  &lt;?!= include('css.html'); ?&gt;\r\n &lt;\/head&gt;\r\n &lt;script&gt;\r\n  function habilitar(){\r\n   \/\/Al cambiar algun valor, se habilita el bot\u00f3n guardar\r\n   document.KPSI.btn_desar.disabled=false;\r\n  }\r\n  function guardar(){\r\n   google.script.run.guardar(document.forms[\"KPSI\"]);\u00a0 \/\/ejecuta la funci\u00f3n guardar del c\u00f3digo\r\n   document.KPSI.btn_desar.disabled=true; \/\/Deshabilitamos el bot\u00f3n\r\n   window.alert(\"Se han guardao los cambos correctamente\"); \/\/mostrar un mensage indicando que se ha guardado\r\n  }\r\n &lt;\/script&gt;\r\n &lt;body&gt;\r\n  &lt;div class=\"container\"&gt;\r\n   &lt;div class=\"row cap\"&gt;\r\n    &lt;div class=\"col titol\"&gt;\r\n     Aplicaci\u00f3n KPSI\r\n    &lt;\/div&gt;\r\n   &lt;div class=\"col-2\"&gt;\r\n    Mail del alumno: &lt;?= usuari ?&gt;\r\n   &lt;\/div&gt;\r\n  &lt;\/div&gt;\r\n &lt;div&gt;\r\n &lt;div class=\"container separador\"&gt;&lt;\/div&gt;\r\n &lt;div class=\"container\"&gt;\r\n  &lt;div class=\"row g-3\"&gt;\r\n  &lt;div class=\"col-md-4 titol\"&gt;\r\n   Alumnos\r\n  &lt;\/div&gt;\r\n  &lt;div class=\"col-md-2 titol\"&gt;\r\n   Inicio\r\n  &lt;\/div&gt;\r\n  &lt;div class=\"col-md-2 titol\"&gt;\r\n   Final\r\n  &lt;\/div&gt; \r\n &lt;\/div&gt; \r\n &lt;div class=\"container separador\"&gt;&lt;\/div&gt; \r\n &lt;div class=\"container\"&gt;\r\n  &lt;form name=\"KPSI\" id=\"KPSI\" action=\"javascript:;\"&gt;\r\n   &lt;? for (let i=2;i&lt;alumnes.length;i++){ \/\/Miramos en qu\u00e9 fila de la hoja de c\u00e1lculo est\u00e1n los datos del alumno que accede\r\n    if (alumnes[i][1]==usuari){\r\n     var fila=i;\r\n    }\r\n   }\r\n \r\n   for (let i=2;i&lt;alumnes[0].length;i=i+2){ ?&gt;\r\n    &lt;div class=\"row g-3\"&gt;\r\n    &lt;div class=\"col-md-4\"&gt;\r\n     &lt;label for=\"curs_grup\"&gt;&lt;?= alumnes[0][i]?&gt;&lt;\/label&gt;\r\n    &lt;\/div&gt;\r\n    &lt;div class=\"col-md-2\"&gt;\r\n     &lt;select class=\"form-select\" name=\"inici[]\" onchange=\"habilitar()\"&gt;\r\n      &lt;option value=\"\"&gt;&lt;\/option&gt;\r\n      &lt;option value=\"1\" &lt;? if (alumnes[fila][i]==1){ ?&gt;selected&lt;? } ?&gt;&gt;No lo s\u00e9&lt;\/option&gt;\r\n      &lt;option value=\"2\" &lt;? if (alumnes[fila][i]==2){ ?&gt;selected&lt;? } ?&gt;&gt;No lo entiendo&lt;\/option&gt;\r\n      &lt;option value=\"3\" &lt;? if (alumnes[fila][i]==3){ ?&gt;selected&lt;? } ?&gt;&gt;Creo que s\u00ed que lo s\u00e9&lt;\/option&gt;\r\n      &lt;option value=\"4\" &lt;? if (alumnes[fila][i]==4){ ?&gt;selected&lt;? } ?&gt;&gt;Lo podr\u00eda explicar a mis compa\u00f1eros\/as sin dificultad&lt;\/option&gt;\r\n     &lt;\/select&gt;\r\n    &lt;\/div&gt;\r\n   &lt;div class=\"col-md-2\"&gt;\r\n    &lt;select class=\"form-select\" name=\"final[]\" onchange=\"habilitar()\"&gt;\r\n     &lt;option value=\"\"&gt;&lt;\/option&gt;\r\n     &lt;option value=\"1\" &lt;? if (alumnes[fila][i]==1){ ?&gt;selected&lt;? } ?&gt;&gt;No lo s\u00e9&lt;\/option&gt;\r\n     &lt;option value=\"2\" &lt;? if (alumnes[fila][i]==2){ ?&gt;selected&lt;? } ?&gt;&gt;No lo entiendo&lt;\/option&gt;\r\n     &lt;option value=\"3\" &lt;? if (alumnes[fila][i]==3){ ?&gt;selected&lt;? } ?&gt;&gt;Creo que s\u00ed que lo s\u00e9&lt;\/option&gt;\r\n     &lt;option value=\"4\" &lt;? if (alumnes[fila][i]==4){ ?&gt;selected&lt;? } ?&gt;&gt;Lo podr\u00eda explicar a mis compa\u00f1eros\/as sin dificultad&lt;\/option&gt;\r\n   &lt;\/select&gt;\r\n  &lt;\/div&gt; \r\n &lt;\/div&gt;\r\n &lt;div class=\"container separador2\"&gt;&lt;\/div&gt; \r\n &lt;? } ?&gt;\r\n&lt;\/div&gt;\r\n&lt;div class=\"container separador2\"&gt;&lt;\/div&gt;\r\n&lt;div class=\"container\"&gt;\r\n  &lt;div class=\"row g-3\"&gt;\r\n   &lt;div class=\"col-md-4\"&gt;&lt;\/div&gt;\r\n   &lt;div class=\"col-md-4\"&gt;&lt;\/div&gt;\r\n    &lt;input type=\"text\" class=\"form-control\" value=\"&lt;?= fila ?&gt;\" id=\"fila\" name=\"fila\" hidden&gt;\r\n   &lt;div class=\"col-md-2\"&gt;&lt;button class=\"btn btn-primary\" name=\"btn_desar\" id=\"btn_desar\" disabled onclick=\"guardar()\"&gt;Guardar&lt;\/button&gt;&lt;\/div&gt;\r\n &lt;\/div&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<\/div>\n<p>B\u00e1sicamente, hemos a\u00f1adido un formulario y, con la instrucci\u00f3n for, tantas preguntas como se han indicado en la hoja de c\u00e1lculo. Como en la hoja de c\u00e1lculo tenemos columnas combinadas para poder tener las respotes del inicio y del final juntas, el for lo hacemos con un incremento de 2 de i (i = i + 2).<\/p>\n<p>Antes, hemos mirado en qu\u00e9 fila estaban los datos del usuario para poder mostrar sus respuestas anteriores, si hab\u00eda hecho. Para no volver a calcularlo despu\u00e9s, hemos a\u00f1adido un campo oculto en el formulario con este n\u00famero de fila. As\u00ed lo podremos pasar al c\u00f3digo para poderlo utilizar.<\/p>\n<p>Adem\u00e1s, hemos a\u00f1adido un par de funciones en javascript. Una en los select, onChange, para que el bot\u00f3n guardar s\u00f3lo se active cuando se haga alg\u00fan cambio.<\/p>\n<p>La segunda funci\u00f3n, guardar, que se activa al pulsar el bot\u00f3n, onclick, es la que nos devolver\u00e1 a la hoja de c\u00f3digo, pasando como par\u00e1metros todos los valores que se ha introducido en los desplegables. la funci\u00f3n es muy sencilla:<\/p>\n<pre>google.script.run.guardar(document.forms[\"KPSI\"]);\u00a0 \/\/ejecuta la funci\u00f3n guardar del c\u00f3digo\r\nwindow.alert(\"Se han guardao los cambios correctamente\"); \/\/mostrar un mensage indicando que se ha guardado<\/pre>\n<p style=\"text-align: justify;\">\u00bfQu\u00e9 nos faltar\u00eda? Definir la funci\u00f3n guardar en el c\u00f3digo. Esta funci\u00f3n es la que guardar\u00e1 en la hoja de c\u00e1lculo los datos.<\/p>\n<div>\n<pre>function guardar(KPSI){\r\n \/\/Recuperamos los valores del formulario\r\n var inici=KPSI[\"inici[]\"];\r\n var final=KPSI[\"final[]\"];\r\n var fila=parseInt(KPSI[\"fila\"]);\r\n\r\n \/\/Creamos una matriz con los valores inicio y final intercalados, igual que en la hoja de c\u00e1lculo\r\n var valors=[];\r\n valors[0]=[];\r\n let j=0;\r\n for (let i=0; i&lt;(inici.length+final.length);i=i+2){\r\n  valors[0][i]=inici[j];\r\n  valors[0][i+1]=final[j];\r\n  j++;\r\n }\r\n \/\/Guardoamos los valores en la hoja de c\u00e1lculo\r\n var spreadsheet = SpreadsheetApp.openByUrl(full_control); \r\n var sheet = spreadsheet.getSheetByName(full);\r\n sheet.getRange(fila+1,3,1,valors[0].length).setValues(valors);\r\n}<\/pre>\n<\/div>\n<p style=\"text-align: justify;\">Y ya hemos llegado al final. Hemos creado una peque\u00f1a aplicaci\u00f3n web donde los alumnos acceden, ven las respuestas anteriores y pueden modificarlas.<\/p>\n<p style=\"text-align: justify;\">El aspecto ser\u00eda el siguiente.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-4769\" src=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/6-2.png\" alt=\"\" width=\"713\" height=\"265\" srcset=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/6-2.png 1679w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/6-2-300x111.png 300w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/6-2-1024x380.png 1024w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/6-2-768x285.png 768w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/6-2-1536x570.png 1536w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/6-2-1040x386.png 1040w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/6-2-640x237.png 640w\" sizes=\"auto, (max-width: 713px) 100vw, 713px\" \/><\/p>\n<p style=\"text-align: justify;\">Para acabar de pulirla, estar\u00eda bien controlar cuando los alumnos pueden modificar las respuestas. No tiene mucho sentido que al final de la unidad puedan cambiar las respuestas del inicio. Podr\u00edamos a\u00f1adir en la hoja de c\u00e1lculo alg\u00fan checkbox para decir si est\u00e1 activada la posibilidad de respuesta de los alumnos para la columna inicila y otro para la columna final. Recoger\u00edamos este valor y en los selects a\u00f1adir\u00edamos un condicional. Si no se permite, en el c\u00f3digo html a\u00f1adir\u00eda disable. Algo as\u00ed:<\/p>\n<p>&lt;select class = \u00abform-select\u00bb name = \u00abinicio []\u00bb onChange = \u00abhabilitar ()\u00bb &lt;? if (permitido_inicio == false) {?&gt; disabled &lt;? }?&gt;<\/p>\n<p>Pero ya os lo dejo para vosotros. Una vez el script estuviera terminado y probado, deber\u00eda volver a implementarlo. hay que tener en cuenta que si se realiza una implementaci\u00f3n nueva, la URL cambia. Si ya se ha enviado la URL a los alumnos, ser\u00e1 bastante problem\u00e1tico, ya que los alumnos se har\u00e1n un l\u00edo. Si se desea hacer una nueva implementaci\u00f3n sin que cambie la URL, en lugar de usar la opci\u00f3n nueva implementaci\u00f3n, debe usarse la opci\u00f3n Gestionar implementaciones, editar la versi\u00f3n y eligir nueva versi\u00f3n. De esta manera, la implementaci\u00f3n no cambia y, por tanto, la URL tampoco.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4735\" src=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/11.png\" alt=\"\" width=\"606\" height=\"479\" srcset=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/11.png 1204w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/11-300x237.png 300w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/11-1024x808.png 1024w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/11-768x606.png 768w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/11-1040x821.png 1040w, https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/11-640x505.png 640w\" sizes=\"auto, (max-width: 606px) 100vw, 606px\" \/><\/p>\n<p style=\"text-align: justify;\">Espero que el art\u00edculo haya sido suficientemente entendedor y que se vea la manera de crear Web apps con Google apps script. Dejo pendiente una 3\u00aa parte para explicar c\u00f3mo trabajar con diferentes pantallas. Como he dicho al principio, la \u00fanica funci\u00f3n que puede mostrar html es la funci\u00f3n doGet. Por ejemplo, la funci\u00f3n guardar que hemos creado, no puede mostrar ninguna p\u00e1gina html. Por lo tanto, para hacer aplicaciones donde queramos m\u00e1s de una pantalla (que al pulsar un bot\u00f3n se&#8217; muestre una pantalla diferente), tendremos que hacer alg\u00fan truco. Lo cuento en el siguiente art\u00edculo, que ser\u00e1 m\u00e1s corto y cerrar\u00e1 la trilog\u00eda.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Despu\u00e9s del primer art\u00edculo explicando un poco qu\u00e9 son las web apps hechas con Google Apps Script (GAS) vamos a ver en este segundo art\u00edculo c\u00f3mo crear una sencilla. Y lo har\u00e9 con un ejemplo real, relacionado con la evaluaci\u00f3n&#8230;<\/p>\n","protected":false},"author":1,"featured_media":4680,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[56],"tags":[],"class_list":["post-4743","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-google-apps-script-es","post-archive"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Utilizar GAS para crear aplicaciones web (2\u00aa parte) - Tecnocentres<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Utilizar GAS para crear aplicaciones web (2\u00aa parte) - Tecnocentres\" \/>\n<meta property=\"og:description\" content=\"Despu\u00e9s del primer art\u00edculo explicando un poco qu\u00e9 son las web apps hechas con Google Apps Script (GAS) vamos a ver en este segundo art\u00edculo c\u00f3mo crear una sencilla. Y lo har\u00e9 con un ejemplo real, relacionado con la evaluaci\u00f3n...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/\" \/>\n<meta property=\"og:site_name\" content=\"Tecnocentres\" \/>\n<meta property=\"article:published_time\" content=\"2021-08-11T08:07:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-08-11T09:36:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/gas.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"748\" \/>\n\t<meta property=\"og:image:height\" content=\"221\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jaume Feliu\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@jfeliua\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jaume Feliu\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/2021\\\/08\\\/11\\\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/2021\\\/08\\\/11\\\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\\\/\"},\"author\":{\"name\":\"Jaume Feliu\",\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/#\\\/schema\\\/person\\\/b2eb569e95072dedf967f0036be08adf\"},\"headline\":\"Utilizar GAS para crear aplicaciones web (2\u00aa parte)\",\"datePublished\":\"2021-08-11T08:07:09+00:00\",\"dateModified\":\"2021-08-11T09:36:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/2021\\\/08\\\/11\\\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\\\/\"},\"wordCount\":1721,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/2021\\\/08\\\/11\\\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/tecnocentres.org\\\/wp-content\\\/uploads\\\/2021\\\/08\\\/gas.jpg\",\"articleSection\":[\"Google apps script\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/2021\\\/08\\\/11\\\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/2021\\\/08\\\/11\\\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\\\/\",\"url\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/2021\\\/08\\\/11\\\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\\\/\",\"name\":\"Utilizar GAS para crear aplicaciones web (2\u00aa parte) - Tecnocentres\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/2021\\\/08\\\/11\\\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/2021\\\/08\\\/11\\\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/tecnocentres.org\\\/wp-content\\\/uploads\\\/2021\\\/08\\\/gas.jpg\",\"datePublished\":\"2021-08-11T08:07:09+00:00\",\"dateModified\":\"2021-08-11T09:36:46+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/#\\\/schema\\\/person\\\/b2eb569e95072dedf967f0036be08adf\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/2021\\\/08\\\/11\\\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/2021\\\/08\\\/11\\\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/2021\\\/08\\\/11\\\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\\\/#primaryimage\",\"url\":\"https:\\\/\\\/tecnocentres.org\\\/wp-content\\\/uploads\\\/2021\\\/08\\\/gas.jpg\",\"contentUrl\":\"https:\\\/\\\/tecnocentres.org\\\/wp-content\\\/uploads\\\/2021\\\/08\\\/gas.jpg\",\"width\":748,\"height\":221},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/2021\\\/08\\\/11\\\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Inici\",\"item\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Utilizar GAS para crear aplicaciones web (2\u00aa parte)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/\",\"name\":\"Tecnocentres\",\"description\":\"Blog de Jaume Feliu\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/#\\\/schema\\\/person\\\/b2eb569e95072dedf967f0036be08adf\",\"name\":\"Jaume Feliu\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/04319ca8610bfe2a04fca8f0d7d42c7e87e4bbe1c687e39a0192f567098d464e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/04319ca8610bfe2a04fca8f0d7d42c7e87e4bbe1c687e39a0192f567098d464e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/04319ca8610bfe2a04fca8f0d7d42c7e87e4bbe1c687e39a0192f567098d464e?s=96&d=mm&r=g\",\"caption\":\"Jaume Feliu\"},\"sameAs\":[\"https:\\\/\\\/tecnocentres.org\",\"https:\\\/\\\/x.com\\\/jfeliua\"],\"url\":\"https:\\\/\\\/tecnocentres.org\\\/es\\\/blog\\\/author\\\/admin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Utilizar GAS para crear aplicaciones web (2\u00aa parte) - Tecnocentres","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/","og_locale":"es_ES","og_type":"article","og_title":"Utilizar GAS para crear aplicaciones web (2\u00aa parte) - Tecnocentres","og_description":"Despu\u00e9s del primer art\u00edculo explicando un poco qu\u00e9 son las web apps hechas con Google Apps Script (GAS) vamos a ver en este segundo art\u00edculo c\u00f3mo crear una sencilla. Y lo har\u00e9 con un ejemplo real, relacionado con la evaluaci\u00f3n...","og_url":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/","og_site_name":"Tecnocentres","article_published_time":"2021-08-11T08:07:09+00:00","article_modified_time":"2021-08-11T09:36:46+00:00","og_image":[{"width":748,"height":221,"url":"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/gas.jpg","type":"image\/jpeg"}],"author":"Jaume Feliu","twitter_card":"summary_large_image","twitter_creator":"@jfeliua","twitter_misc":{"Escrito por":"Jaume Feliu","Tiempo de lectura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/#article","isPartOf":{"@id":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/"},"author":{"name":"Jaume Feliu","@id":"https:\/\/tecnocentres.org\/es\/#\/schema\/person\/b2eb569e95072dedf967f0036be08adf"},"headline":"Utilizar GAS para crear aplicaciones web (2\u00aa parte)","datePublished":"2021-08-11T08:07:09+00:00","dateModified":"2021-08-11T09:36:46+00:00","mainEntityOfPage":{"@id":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/"},"wordCount":1721,"commentCount":0,"image":{"@id":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/#primaryimage"},"thumbnailUrl":"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/gas.jpg","articleSection":["Google apps script"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/","url":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/","name":"Utilizar GAS para crear aplicaciones web (2\u00aa parte) - Tecnocentres","isPartOf":{"@id":"https:\/\/tecnocentres.org\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/#primaryimage"},"image":{"@id":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/#primaryimage"},"thumbnailUrl":"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/gas.jpg","datePublished":"2021-08-11T08:07:09+00:00","dateModified":"2021-08-11T09:36:46+00:00","author":{"@id":"https:\/\/tecnocentres.org\/es\/#\/schema\/person\/b2eb569e95072dedf967f0036be08adf"},"breadcrumb":{"@id":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/#primaryimage","url":"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/gas.jpg","contentUrl":"https:\/\/tecnocentres.org\/wp-content\/uploads\/2021\/08\/gas.jpg","width":748,"height":221},{"@type":"BreadcrumbList","@id":"https:\/\/tecnocentres.org\/es\/blog\/2021\/08\/11\/utilizar-gas-para-crear-aplicaciones-web-2a-parte\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Inici","item":"https:\/\/tecnocentres.org\/es\/"},{"@type":"ListItem","position":2,"name":"Utilizar GAS para crear aplicaciones web (2\u00aa parte)"}]},{"@type":"WebSite","@id":"https:\/\/tecnocentres.org\/es\/#website","url":"https:\/\/tecnocentres.org\/es\/","name":"Tecnocentres","description":"Blog de Jaume Feliu","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/tecnocentres.org\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/tecnocentres.org\/es\/#\/schema\/person\/b2eb569e95072dedf967f0036be08adf","name":"Jaume Feliu","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/04319ca8610bfe2a04fca8f0d7d42c7e87e4bbe1c687e39a0192f567098d464e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/04319ca8610bfe2a04fca8f0d7d42c7e87e4bbe1c687e39a0192f567098d464e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/04319ca8610bfe2a04fca8f0d7d42c7e87e4bbe1c687e39a0192f567098d464e?s=96&d=mm&r=g","caption":"Jaume Feliu"},"sameAs":["https:\/\/tecnocentres.org","https:\/\/x.com\/jfeliua"],"url":"https:\/\/tecnocentres.org\/es\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/tecnocentres.org\/es\/wp-json\/wp\/v2\/posts\/4743","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tecnocentres.org\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tecnocentres.org\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tecnocentres.org\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tecnocentres.org\/es\/wp-json\/wp\/v2\/comments?post=4743"}],"version-history":[{"count":0,"href":"https:\/\/tecnocentres.org\/es\/wp-json\/wp\/v2\/posts\/4743\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tecnocentres.org\/es\/wp-json\/wp\/v2\/media\/4680"}],"wp:attachment":[{"href":"https:\/\/tecnocentres.org\/es\/wp-json\/wp\/v2\/media?parent=4743"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tecnocentres.org\/es\/wp-json\/wp\/v2\/categories?post=4743"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tecnocentres.org\/es\/wp-json\/wp\/v2\/tags?post=4743"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}