tag:blogger.com,1999:blog-32338775629700071072024-03-16T07:07:51.896+00:00Tutoriales Google Apps ScriptsTutoriales y ejemplos de Google Apps Script
LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.comBlogger117125tag:blogger.com,1999:blog-3233877562970007107.post-84682579937201365252022-03-19T01:46:00.001+00:002022-03-19T01:59:42.783+00:00Como copiar datos de una hoja a otra con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2021/07/como-convertir-numero-texto-con-google-apps-script.html'> <<<< Como convertir número a texto con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html'> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<br />
<div class='cajaAll'><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html'> Google Apps Script </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-scripts-google-sheets.html'> Google Sheets </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-ejemplos.html'> Ejemplos </a></div>
<p> Después de mucho escribir en este blog me acabo de dar cuenta que una de las cosas más básicas, copiar de una hoja a otra usando Google Apps Script, no lo había explicado todavía.</p><p>Por suerte es un tema tan sencillo que con unos pocos ejemplos os quedará superclaro. Todo lo que haremos será <a href="https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html">leer </a>y <a href="https://www.tutorialesgoogleappscripts.com/2015/02/como-escribir-en-una-celda-de-una-hoja.html">escribir</a>.</p><p>1.Para empezar haremos lo básico, obtener todos los datos de una hoja y copiarla en otra hoja del mismo spreadsheet.</p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #008800; font-weight: bold;">function</span> Copiar()
{
<span style="color: #008800; font-weight: bold;">var</span> spreadsheet <span style="color: #333333;">=</span> SpreadsheetApp.getActiveSpreadsheet();
<span style="color: #008800; font-weight: bold;">var</span> values <span style="color: #333333;">=</span> spreadsheet.getSheetByName(<span style="background-color: #fff0f0;">"Hoja 1"</span>).getDataRange().getValues();
<span style="color: #008800; font-weight: bold;">var</span> out <span style="color: #333333;">=</span> spreadsheet.getSheetByName(<span style="background-color: #fff0f0;">"Hoja 2"</span>);
out.clear();
out.getRange(<span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">1</span>,values.length,values[<span style="color: #0000dd; font-weight: bold;">0</span>].length).setValues(values);
}
</pre></div>
<p><br /></p><p>2. Si no queremos copiar todos los datos sino solo unas cuantas filas o columnas deberemos <a href="https://www.tutorialesgoogleappscripts.com/2020/09/obtener-rango-google-apps-script.html">obtener el rango</a> que nos interese.</p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #008800; font-weight: bold;">function</span> Copiar()
{
<span style="color: #008800; font-weight: bold;">var</span> spreadsheet <span style="color: #333333;">=</span> SpreadsheetApp.getActiveSpreadsheet();
<span style="color: #008800; font-weight: bold;">var</span> values <span style="color: #333333;">=</span> spreadsheet.getSheetByName(<span style="background-color: #fff0f0;">"Hoja 1"</span>).getRange(<span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">3</span>,<span style="color: #0000dd; font-weight: bold;">4</span>).getValues();
<span style="color: #008800; font-weight: bold;">var</span> out <span style="color: #333333;">=</span> spreadsheet.getSheetByName(<span style="background-color: #fff0f0;">"Hoja 2"</span>);
out.clear();
out.getRange(<span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">1</span>,values.length,values[<span style="color: #0000dd; font-weight: bold;">0</span>].length).setValues(values);
}
</pre></div>
<p><br /></p><p>3. Otra cosa interesante es filtrar las filas que vamos a copiar para solo pintar lo que nos interesa. A fin de hacer esto usaremos la funcionalidad <a href="https://www.tutorialesgoogleappscripts.com/2020/11/como-filtrar-filas-usando-filter-con-google-apps-script.html">filter</a>. Aquí teneis un ejemplo en que solo copiaremos las filas que tienen un 1 en la primera columna.</p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #008800; font-weight: bold;">function</span> Copiar()
{
<span style="color: #008800; font-weight: bold;">var</span> spreadsheet <span style="color: #333333;">=</span> SpreadsheetApp.getActiveSpreadsheet();
<span style="color: #008800; font-weight: bold;">var</span> values <span style="color: #333333;">=</span> spreadsheet.getSheetByName(<span style="background-color: #fff0f0;">"Hoja 1"</span>).getDataRange().getValues();
values <span style="color: #333333;">=</span> values.filter(row <span style="color: #333333;">=></span> row[<span style="color: #0000dd; font-weight: bold;">0</span>] <span style="color: #333333;">==</span> <span style="background-color: #fff0f0;">'1'</span>);
<span style="color: #008800; font-weight: bold;">var</span> out <span style="color: #333333;">=</span> spreadsheet.getSheetByName(<span style="background-color: #fff0f0;">"Hoja 2"</span>);
out.clear();
out.getRange(<span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">1</span>,values.length,values[<span style="color: #0000dd; font-weight: bold;">0</span>].length).setValues(values);
}
</pre></div><div><br /></div><div><br /></div><div><div>4. Si lo complicamos un poco nos puede interesar copiar una hoja, eliminando alguna columna que no nos resulta útil. Hay múltiples formas de implementar esto. Creo que la más sencilla es obtener los diferentes rangos de valores que nos interesan , juntarlos en uno solo y entonces copiarlos en la hoja de destino.</div>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #008800; font-weight: bold;">function</span> Copiar()
{
<span style="color: #008800; font-weight: bold;">var</span> spreadsheet <span style="color: #333333;">=</span> SpreadsheetApp.getActiveSpreadsheet();
<span style="color: #008800; font-weight: bold;">var</span> sheet <span style="color: #333333;">=</span> spreadsheet.getSheetByName(<span style="background-color: #fff0f0;">"Hoja 1"</span>)
<span style="color: #008800; font-weight: bold;">var</span> values1 <span style="color: #333333;">=</span> sheet.getRange(<span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">1</span>,sheet.getLastRow(),<span style="color: #0000dd; font-weight: bold;">2</span>).getValues();
<span style="color: #008800; font-weight: bold;">var</span> values2 <span style="color: #333333;">=</span> sheet.getRange(<span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">4</span>,sheet.getLastRow(),<span style="color: #0000dd; font-weight: bold;">2</span>).getValues();
<span style="color: #008800; font-weight: bold;">for</span>(<span style="color: #008800; font-weight: bold;">var</span> i <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span> ; i <span style="color: #333333;"><</span> values1.length ; <span style="color: #333333;">++</span>i )
{
<span style="color: #008800; font-weight: bold;">for</span>(<span style="color: #008800; font-weight: bold;">var</span> j <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">0</span> ; j <span style="color: #333333;"><</span> values2[i].length ; <span style="color: #333333;">++</span>j)
{
values1[i].push(values2[i][j]);
}
}
<span style="color: #008800; font-weight: bold;">var</span> out <span style="color: #333333;">=</span> spreadsheet.getSheetByName(<span style="background-color: #fff0f0;">"Hoja 2"</span>);
out.clear();
out.getRange(<span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">1</span>,values1.length,values1[<span style="color: #0000dd; font-weight: bold;">0</span>].length).setValues(values1);
}
</pre></div>
<div><br /></div><div><br /></div><div>5. También nos puede resultar muy útil copiar la información de una hoja de un spreadsheet, a otra hoja en OTRO spreadsheet. </div><div> </div>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #008800; font-weight: bold;">function</span> Copiar()
{
<span style="color: #008800; font-weight: bold;">var</span> spreadsheet <span style="color: #333333;">=</span> SpreadsheetApp.getActiveSpreadsheet();
<span style="color: #008800; font-weight: bold;">var</span> spreadsheet_out <span style="color: #333333;">=</span> SpreadsheetApp.openById(<span style="background-color: #fff0f0;">"el-id-del-spreadsheet-donde-copiar"</span>);
<span style="color: #008800; font-weight: bold;">var</span> values <span style="color: #333333;">=</span> spreadsheet.getSheetByName(<span style="background-color: #fff0f0;">"Hoja 1"</span>).getDataRange().getValues();
<span style="color: #008800; font-weight: bold;">var</span> out <span style="color: #333333;">=</span> spreadsheet_out.getSheetByName(<span style="background-color: #fff0f0;">"Hoja 1"</span>);
out.clear();
out.getRange(<span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">1</span>,values.length,values[<span style="color: #0000dd; font-weight: bold;">0</span>].length).setValues(values);
}
</pre></div>
<div><br /></div><div>Con esto yo creo que tenemos todo lo básico sobre copiar información con Google Apps Script. Evidentemente hay tantas combinaciones como se quieran, pero con las que os he presentado deberíais ser capaces de montar el script que necesiteis para copiar información de una hoja a otra con Google Apps Script.</div><div><br /></div><div> No vacileis en hacerme llegar vuestras dudas. </div><div><br /></div><div>Nos vemos!</div></div>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com1tag:blogger.com,1999:blog-3233877562970007107.post-82000046810309566892021-09-30T23:01:00.001+01:002022-03-19T01:58:23.965+00:00Como usar Google Drive como servidor de hosting<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2021/09/como-hacer-un-quiz-educativo-con-google-apps-script.html'> <<<< Como hacer un Quiz Educativo con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-crear-una-web-con-google-apps.html'> Como crear una web con Google Apps Script >>>> </a></li>
</ul>
</div>
<br />
<div class='cajaAll'><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html'> Google Apps Script </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-web.html'> Web </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-drive.html'> Google Drive </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-html5.html'> HTML5 </a></div>
<p> </p><p><span style="font-family: inherit;">Uno de los mayores problemas cuando haces un pequeño juego web o implementas una web pequeña para un cliente es donde alojar los recursos (imágenes, videos y audios) necesarios para tu producto. </span></p><p><span style="font-family: inherit;">La respuesta lógica es usar un servidor de hosting donde almacenar la web y los recursos necesarios, pero cuando haces un pequeño proyecto personal o directamente cuando hacemos una <a href="https://www.tutorialesgoogleappscripts.com/2015/03/como-crear-una-web-dinamica-con-google.html">web con Google Apps Script</a> el hosting deja de tener sentido. Precisamente una de las ventajas de hacer webs con Google Apps Script es que no necesitas pagar por un servidor para alojar tu web. Además, si es una web para un cliente, sabrá el como actualizar los recursos del hosting?</span></p><p><span style="font-family: inherit;">La solución más fácil para este problema es usar Google Drive para almacenar todos los recursos que necesitemos y obtenerlos de "alguna manera" para usarlos en nuestra web. No es complicado pero es algo que la gente desconoce bastante: usando la API por url de Drive. Podemos pedirle a Drive que nos de todo el stream de datos de un ciertos recurso y cargarlo en nuestra web como el tipo que necesitemos. </span></p><p><span style="font-family: inherit;">Por ejemplo, en HTML5, si queremos cargar un audio que tenemos en drive solo tendríamos que hacer algo de estilo de este código:</span></p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #666666;"><</span>script<span style="color: #666666;">></span>
<span style="color: #007020; font-weight: bold;">function</span> play() {
<span style="color: #007020; font-weight: bold;">var</span> audio <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> Audio(<span style="color: #4070a0;">'https://docs.google.com/uc?export=download&id=1xiCimh6-rQvwtpdYytNGd5Y8v2V4cjTz'</span>);
audio.play();
}
<span style="color: #666666;"><</span><span style="border: 1px solid rgb(255, 0, 0);">/script></span>
</pre></div>
<p>Si os fijáis solo tenemos que cargar el recurso como si fuera un audio normal y corriente pero en la ruta del fichero ponerle algo del estilo de : <span style="color: #4070a0;">https://docs.google.com/uc?export=download&id="id del fichero de audio de drive". </span></p><p>Con este sencillo truco podréis usar cualquier fichero de audio que tengáis en Google Drive y nadie que use tu web notará la diferencia con una web con hosting.</p><p>Si queréis usar este truco para imágenes también funciona de la misma manera:</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #666666;"><</span>img src<span style="color: #666666;">=</span><span style="color: #4070a0;">'https://docs.google.com/uc?export=download&id=19kKkZT6DaBUVn4_9b8A-ulAeR4e8ApFw'</span><span style="color: #666666;">/></span>
</pre></div>
<p>Y de la misma forma podréis estar pintando imágenes que están alojadas en Google Drive. Esto nos otorga una potencia descomunal. Podemos hacer webs dinámicas en que controlamos totalmente el contenido y podemos permitir que quien sea necesario actualice los gráficos o sonidos sin problemas.</p><p>Te imaginas subir imágenes a través de un formulario que luego usas para mostrarlo a través de una web? Las posibilidades que se abren con este truco no tienen fin.</p><p>Si queréis ver un ejemplo de como queda en una web, <a href="https://www.aprenderjaponesgratis.com/2021/08/aprender-hiragana-a.html">aquí </a>tenéis un post donde uso la técnica que os he explicado para poner un botón con audio, cuyos recursos están en mi Drive.</p><p>Nos vemos!</p><p><br /></p><p><br /></p>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com0tag:blogger.com,1999:blog-3233877562970007107.post-27660498018058317762021-09-13T19:05:00.004+01:002021-10-06T22:45:39.668+01:00Como hacer un Quiz Educativo con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2021/08/omo-formatear-html-con-google-apps-script.html'> <<<< Como formatear HTML con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-crear-una-web-con-google-apps.html'> Como crear una web con Google Apps Script >>>> </a></li>
</ul>
</div>
<br />
<div class='cajaAll'><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html'> Google Apps Script </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-scripts-google-sheets.html'> Google Sheets </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-web.html'> Web </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-ejemplos.html'> Ejemplos </a></div>
<p> </p><p>Como ya sabéis estoy haciendo un <a href="https://www.aprenderjaponesgratis.com/" target="_blank">blog para aprender japonés</a> y me he visto con la necesidad de desarrollar una herramienta para facilitar el aprendizaje del alfabeto Hiragana. A fin de conseguir un aprendizaje ameno y sencillo he creído que lo más idóneo era desarrollar un Quiz con Google Apps Script.</p><p>El sistema esta planteado de manera que podáis ir poniendo todas las respuestas que queráis en un spreadsheet y el quiz ( que no será más que una <a href="https://www.tutorialesgoogleappscripts.com/2015/03/como-crear-una-web-dinamica-con-google.html" target="_blank">web</a>) ira recogiendo esas preguntas y poniéndoselas al usuario de forma aleatoria. A la vez que se ha de poner la respuesta correcta, también se le tienen que poner las respuestas incorrectas y una url que dará la explicación de que es lo que hemos hecho mal.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-fh1VT0P6-DzN9BihmAFkTUBhYtKoM5GUY5bPTSB3mh3dRcxWVmPq9xkLsAICuI5xHBtepTi13MayEMdt9Eld8kb9eaDKcjFPE_I3yQn_e1qR1A5afljBp5uHWGPxqzvmlHH4jAZcXpc/s863/juegohiragana.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="321" data-original-width="863" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-fh1VT0P6-DzN9BihmAFkTUBhYtKoM5GUY5bPTSB3mh3dRcxWVmPq9xkLsAICuI5xHBtepTi13MayEMdt9Eld8kb9eaDKcjFPE_I3yQn_e1qR1A5afljBp5uHWGPxqzvmlHH4jAZcXpc/w640-h238/juegohiragana.png" width="640" /></a></div><br /><p>Evidentemente, el código lo podréis personalizar como queráis, yo solo os doy un ejemplo de Google Apps Script que funciona. La aplicación final que vosotros hagáis solo se verá limitada por vuestras necesidades e imaginación.</p><p>Por motivos obvios, para hacer este artículo he usado el post que hacía referencia a <a href="https://www.tutorialesgoogleappscripts.com/2021/01/como-generar-numeros-aleatorios-con-google-apps-script.html">números aleatorios en Google Apps Script</a></p><p>Sin más, os dejo con el código:</p><p>index.html</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020;"><!DOCTYPE html></span>
<span style="color: #062873; font-weight: bold;"><html></span>
<span style="color: #062873; font-weight: bold;"><head></span>
<span style="color: #062873; font-weight: bold;"><base</span> <span style="color: #4070a0;">target="_top"</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"><script></span>
<span style="color: #007020; font-weight: bold;">var</span> ok <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span>;
<span style="color: #007020; font-weight: bold;">function</span> Response(string)
{
SetAciertos();
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"container"</span>).innerHTML <span style="color: #666666;">=</span> string;
}
<span style="color: #007020; font-weight: bold;">function</span> SetAciertos()
{
<span style="color: #007020; font-weight: bold;">if</span>(ok)
{
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"aciertos"</span>).innerHTML <span style="color: #666666;">=</span> <span style="color: #4070a0;">"<p> Aciertos consecutivos: "</span><span style="color: #666666;">+</span> ok <span style="color: #666666;">+</span> <span style="color: #4070a0;">"</p>"</span>;
}
<span style="color: #007020; font-weight: bold;">else</span>
{
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"aciertos"</span>).innerHTML <span style="color: #666666;">=</span> <span style="color: #4070a0;">"<p></p>"</span>;
}
}
<span style="color: #007020; font-weight: bold;">function</span> Start()
{
ok <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span>;
google.script.run.withSuccessHandler(Response).Question();
}
<span style="color: #007020; font-weight: bold;">function</span> Ok()
{
ok<span style="color: #666666;">++</span>;
google.script.run.withSuccessHandler(Response).Question();
}
<span style="color: #007020; font-weight: bold;">function</span> Fail(link)
{
<span style="color: #007020; font-weight: bold;">var</span> html <span style="color: #666666;">=</span> <span style="color: #4070a0;">"<h2> Test de Nivel de Hiragana </h2>"</span>;
html <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<p><a href='"</span> <span style="color: #666666;">+</span> link <span style="color: #666666;">+</span> <span style="color: #4070a0;">"' target='_blank'> Haz click aquí para saber cual es tu fallo </a></p>"</span>
html <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<p><button onclick='Start()'> REINICIAR </button></p>"</span>;
Response(html);
}
<span style="color: #062873; font-weight: bold;"></script></span>
<span style="color: #062873; font-weight: bold;"></head></span>
<span style="color: #062873; font-weight: bold;"><body></span>
<span style="color: #062873; font-weight: bold;"><div</span> <span style="color: #4070a0;">id="aciertos"</span><span style="color: #062873; font-weight: bold;">></div></span>
<span style="color: #062873; font-weight: bold;"><div</span> <span style="color: #4070a0;">id="container"</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"><h2></span> Test de Nivel de Hiragana <span style="color: #062873; font-weight: bold;"></h2></span>
<span style="color: #062873; font-weight: bold;"><p><button</span> <span style="color: #4070a0;">onclick="Start()"</span><span style="color: #062873; font-weight: bold;">></span> INICIAR <span style="color: #062873; font-weight: bold;"></button></p></span>
<span style="color: #062873; font-weight: bold;"></div></span>
<span style="color: #062873; font-weight: bold;"></body></span>
<span style="color: #062873; font-weight: bold;"></html></span>
</pre></div><div><br /></div>
Code.gs<div><br /></div>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> doGet()
{
<span style="color: #007020; font-weight: bold;">return</span> HtmlService.createTemplateFromFile(<span style="color: #4070a0;">'index'</span>)
.evaluate() <span style="color: #60a0b0; font-style: italic;">// El evaluate siempre debe estar antes del FrameOptions</span>
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
<span style="color: #007020; font-weight: bold;">function</span> GetRandom(min,max)
{
<span style="color: #007020; font-weight: bold;">return</span> <span style="color: #007020;">Math</span>.floor(<span style="color: #007020;">Math</span>.random()<span style="color: #666666;">*</span>(max <span style="color: #666666;">-</span>(min <span style="color: #666666;">-</span><span style="color: #40a070;">1</span>))) <span style="color: #666666;">+</span> min;
}
<span style="color: #007020; font-weight: bold;">function</span> crand(elements)
{
<span style="color: #007020; font-weight: bold;">return</span> GetRandom(<span style="color: #40a070;">0</span>,elements<span style="color: #666666;">-</span><span style="color: #40a070;">1</span>);
}
<span style="color: #60a0b0; font-style: italic;">//Aleatorizamos un vector</span>
<span style="color: #007020; font-weight: bold;">function</span> RandVector(Initial)
{
<span style="color: #007020; font-weight: bold;">var</span> Vector <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Array</span>();
<span style="color: #007020; font-weight: bold;">while</span>(Initial.length)
{
<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> crand(Initial.length);
Vector.push(Initial[i]);
Initial.splice(i,<span style="color: #40a070;">1</span>);
}
<span style="color: #007020; font-weight: bold;">return</span> Vector;
}
<span style="color: #007020; font-weight: bold;">function</span> Question()
{
<span style="color: #60a0b0; font-style: italic;">//Obtenemos la lista de conversiones de texto</span>
<span style="color: #007020; font-weight: bold;">var</span> values <span style="color: #666666;">=</span> SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getDataRange().getDisplayValues();
<span style="color: #007020; font-weight: bold;">var</span> out <span style="color: #666666;">=</span> <span style="color: #4070a0;">"<div>"</span>;
<span style="color: #007020; font-weight: bold;">var</span> index <span style="color: #666666;">=</span> crand(values.length<span style="color: #666666;">-</span><span style="color: #40a070;">1</span>) <span style="color: #666666;">+</span> <span style="color: #40a070;">1</span>;
<span style="color: #007020; font-weight: bold;">var</span> row <span style="color: #666666;">=</span> values[index];
<span style="color: #007020; font-weight: bold;">var</span> vector <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Array</span>();
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">1</span> ; i <span style="color: #666666;"><</span> <span style="color: #40a070;">5</span>; i<span style="color: #666666;">++</span>)
vector.push(row[i]);
vector <span style="color: #666666;">=</span> RandVector(vector);
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<table>"</span>;
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<tr>"</span>;
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<td></td>"</span>;
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<td>"</span>;
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<H1>"</span> <span style="color: #666666;">+</span> row[<span style="color: #40a070;">0</span>] <span style="color: #666666;">+</span> <span style="color: #4070a0;">"</H1>"</span>;
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"</td>"</span>;
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<td></td>"</span>;
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<td></td>"</span>;
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"</tr>"</span>;
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<tr>"</span>;
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span> ; i <span style="color: #666666;"><</span> vector.length ; <span style="color: #666666;">++</span>i)
{
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<td>"</span>;
<span style="color: #007020; font-weight: bold;">if</span> (vector[i] <span style="color: #666666;">==</span> row[<span style="color: #40a070;">1</span>] )
{
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<p><button onclick='Ok()'> "</span> <span style="color: #666666;">+</span> vector[i] <span style="color: #666666;">+</span> <span style="color: #4070a0;">" </button></p>"</span>;
}
<span style="color: #007020; font-weight: bold;">else</span>
{
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<p><button onclick='Fail(\""</span><span style="color: #666666;">+</span>row[<span style="color: #40a070;">5</span>]<span style="color: #666666;">+</span><span style="color: #4070a0;">"\")'> "</span> <span style="color: #666666;">+</span> vector[i] <span style="color: #666666;">+</span> <span style="color: #4070a0;">" </button></p>"</span>;
}
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"</td>"</span>;
}
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"</tr>"</span>;
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"</table>"</span>;
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"</div>"</span>;
<span style="color: #007020; font-weight: bold;">return</span> out;
}
</pre></div>
<p>Si queréis ver funcionando este ejemplo podéis ver este código en un iframe dentro de este <a href="https://www.aprenderjaponesgratis.com/2021/09/juego-para-aprender-hiragana-japones.html" target="_blank">Juego para Aprender Hiragana</a></p>
LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com0tag:blogger.com,1999:blog-3233877562970007107.post-74089082777696192022021-09-11T23:53:00.002+01:002021-10-04T13:11:45.253+01:00Google Drive : Lenguajes de programación<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2021/02/como-crear-una-biblioteca-con-google-apps-script.html'> <<<< Como crear una biblioteca con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/que-es-google-apps-script.html'> ¿Que es Google Apps Script ? (Tutorial en Español) >>>> </a></li>
</ul>
</div>
<br />
<div class='cajaAll'><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html'> Google Apps Script </a></div>
<p> </p><p>Si te estas planteando como automatizar tareas en el ecosistema de Google Drive lo primero que te has de plantear es que lenguaje has de usar para hacerlo. Respuesta fácil: <a href="https://www.tutorialesgoogleappscripts.com/">Google Apps Script</a> :) , pero no sería correcto o exacto.</p><p>Personalmente mi opción preferida de lenguaje de programación para Google Drive es usar Google Apps Script ( es por ello que hago este blog ) dado que sería algo así como el lenguaje de programación nativo de Google Drive. Es el que viene con el sistema y es extremadamente fácil hacer que todo funcione. En pocos minutos puedes tener armado tu script que se encargue de automatizar tareas en Google Drive.</p><p>Si tienes una base de JavaScript, C/C++ o algún otro lenguaje parecido dar el salto a Google Apps Script es trivial. Si no tienes ni idea de programar te costará un poco más dado que tendrás que entender la lógica de programación, pero con esfuerzo en muy poco tiempo podrás empezar a hacer tus scripts. Por donde empezar? Te recomendaría empezar por este artículo para tener una <a href="https://www.tutorialesgoogleappscripts.com/2015/02/que-es-google-apps-script.html" target="_blank">idea general del lenguaje</a> y este otro para <a href="https://www.tutorialesgoogleappscripts.com/2015/02/empezar-programar-en-google-apps-script.html" target="_blank">empezar a programar en GAS</a></p><p>Ahora bien, Google Apps Script no es el único lenguaje de programación que puedes usar en Google Drive. Google creó una API que permite tener acceso a las funcionalidades de Drive desde una aplicación de escritorio por ejemplo o en un servidor web . Tiene sus limitaciones y a mi personalmente siempre me ha dado quebraderos de cabezas, pero para ciertas cosas puede ser una buena opción.</p><p>Básicamente se puede usar cualquier lenguaje que sea capaz de atacar a la API de Google así que podríamos decir que con (casi) cualquier lenguaje podríamos automatizar tareas de Google Drive. Evidentemente, no es lo mismo decir que es posible a decir que es fácil , que haya documentación y ejemplos o que no pueda haber más problemas.</p><p>Ejemplos de lenguajes de programación que se usan de vez en cuando en la programación de "scripts" de Google Drive y de los cuales se puede encontrar algún ejemplo podrían ser Python, PHP, Java, Ruby, Plataforma .NET, Perl, etc... En general todos son lenguajes bastante enfocados a la programación web.</p><p>A priori, también deberían de poder usarse lenguajes "menos web" como C/C++, pero realmente hay muy poca documentación, por no decir ninguna ,de como atacar a la API de Google Drive desde estos lenguajes, así que salvo que tengas un afán de investigación exacerbado no te recomendaría ir por este camino, mucho menos si estás empezando.</p><p>Resumiendo, si estas empezando y te estas preguntando que lenguaje de programación deberías usar para programar script de Google Drive, la respuesta debería ser Google Apps Script, es lo más fácil y sencillo. Si eres un ingeniero y te estás preguntando si el lenguaje que estás usando en tu proyecto sería capaz de "hacer algo" en Drive, la respuesta es que si, pero que eventualmente podrá costarte sangre, sudor y lágrimas.</p><p>Si optas por Google Apps Script este blog intentará echarte un cable, si optas por la otra opción...en fin.. buena suerte, la necesitarás :D</p><p>Nos vemos</p>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com0tag:blogger.com,1999:blog-3233877562970007107.post-28989878202962977512021-08-23T20:12:00.002+01:002021-08-26T16:45:09.640+01:00Como formatear HTML con Google Apps Script<div class="Menu">
<ul id="nav">
<li><a href="https://www.tutorialesgoogleappscripts.com/2021/06/como-saber-el-usuario-actual-con-google-apps-script.html"> <<<< Cómo saber el usuario actual con Google Apps Script</a></li>
<li><a href="https://www.tutorialesgoogleappscripts.com/2015/02/como-crear-una-web-con-google-apps.html"> Como crear una web con Google Apps Script >>>> </a></li>
</ul>
</div>
<br />
<div class="cajaAll"><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html"> Google Apps Script </a><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-script-html5.html"> HTML5 </a></div>
<p>Una aplicación muy útil de Google Apps Script es formatear automáticamente texto en formato <a href="https://www.tutorialesgoogleappscripts.com/p/apps-script-html5.html" target="_blank">HTML</a>. En mi caso particular he montado este sistema para escribir textos en <a href="https://www.aprenderjaponesgratis.com/" target="_blank">japonés </a>(nunca es fácil escribir esos símbolos endemoniados :D ), pero vosotros podéis modificarlo como necesitáis para formatear vuestros htmls como querais: introducir links, poner negritas, cambiar tamaños , aplicar cursivas, etc.. Con esta base podéis montar como queráis vuestro formateador html con Google Apps Script.</p><p>En nuestro caso completo hemos montado una <a href="https://www.tutorialesgoogleappscripts.com/2015/03/como-crear-una-web-dinamica-con-google.html">web configurable</a> en el que tenemos todos los símbolos japoneses con sus respectivos links, como os he dicho lo podéis adaptar a lo que necesitéis poniéndole más columnas para configurarle más condicionantes a vuestro formateo.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCjrYCMbBoC4h7ZCZjCh0myJHE6pW3DLXecU0rhfT7XjqTuvIfpTf7I8plYR4OGDHhsIhvYuoVqeL6iUG_f1tjdFJAvs_toEx8dc7O7KCFhnF9H-99sZFsg3Qhc0Aq049uHZcdCmJSpew/s953/formateohtml.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Formateo Html Google Apps Script" border="0" data-original-height="252" data-original-width="953" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCjrYCMbBoC4h7ZCZjCh0myJHE6pW3DLXecU0rhfT7XjqTuvIfpTf7I8plYR4OGDHhsIhvYuoVqeL6iUG_f1tjdFJAvs_toEx8dc7O7KCFhnF9H-99sZFsg3Qhc0Aq049uHZcdCmJSpew/w640-h170/formateohtml.png" title="HTML - Google Apps Script ( formateo )" width="640" /></a></div><br /><p>Dado que el producto final es una web que nos pedirá el texto que queremos formatear, tenemos parte de html y parte de gs. Aquí tenéis el código de ambos:</p><p>index.html</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020;"><!DOCTYPE html></span>
<span style="color: #062873; font-weight: bold;"><html></span>
<span style="color: #062873; font-weight: bold;"><head></span>
<span style="color: #062873; font-weight: bold;"><base</span> <span style="color: #4070a0;">target="_top"</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"><script></span>
<span style="color: #007020; font-weight: bold;">function</span> Response(string)
{
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"converted"</span>).innerHTML <span style="color: #666666;">=</span> string;
}
<span style="color: #007020; font-weight: bold;">function</span> Convert()
{
<span style="color: #007020; font-weight: bold;">var</span> text <span style="color: #666666;">=</span> <span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"text"</span>).value;
google.script.run.withSuccessHandler(Response).Convert(text);
}
<span style="color: #062873; font-weight: bold;"></script></span>
<span style="color: #062873; font-weight: bold;"></head></span>
<span style="color: #062873; font-weight: bold;"><body></span>
<span style="color: #062873; font-weight: bold;"><div></span>
<span style="color: #062873; font-weight: bold;"><h2></span> Romaji -> Hiragana <span style="color: #062873; font-weight: bold;"></h2></span>
<span style="color: #062873; font-weight: bold;"><p><textarea</span> <span style="color: #4070a0;">id="text"</span><span style="color: #062873; font-weight: bold;">></span> <span style="color: #062873; font-weight: bold;"></textarea></p></span>
<span style="color: #062873; font-weight: bold;"><p><button</span> <span style="color: #4070a0;">onclick="Convert()"</span><span style="color: #062873; font-weight: bold;">></span> CONVERTIR <span style="color: #062873; font-weight: bold;"></button></p></span>
<span style="color: #062873; font-weight: bold;"><p><div</span> <span style="color: #4070a0;">id="converted"</span><span style="color: #062873; font-weight: bold;">></span> <span style="color: #062873; font-weight: bold;"></div></p></span>
<span style="color: #062873; font-weight: bold;"></div></span>
<span style="color: #062873; font-weight: bold;"></body></span>
<span style="color: #062873; font-weight: bold;"></html></span>
</pre></div>
<p>Code.gs</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> doGet()
{
<span style="color: #007020; font-weight: bold;">return</span> HtmlService.createTemplateFromFile(<span style="color: #4070a0;">'index'</span>)
.evaluate() <span style="color: #60a0b0; font-style: italic;">// El evaluate siempre debe estar antes del FrameOptions</span>
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
<span style="color: #007020; font-weight: bold;">function</span> Convert(txt)
{
txt <span style="color: #666666;">=</span> <span style="color: #007020;">String</span>(txt.trim());
<span style="color: #60a0b0; font-style: italic;">//Obtenemos la lista de conversiones de texto</span>
<span style="color: #007020; font-weight: bold;">var</span> values <span style="color: #666666;">=</span> SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getDataRange().getDisplayValues();
<span style="color: #007020; font-weight: bold;">var</span> out <span style="color: #666666;">=</span> <span style="color: #4070a0;">"<p>"</span>;
<span style="color: #60a0b0; font-style: italic;">//Miramos de todas las posibles conversiones cual cuadra con nuestro texto.</span>
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">1</span> ; i <span style="color: #666666;"><</span> values.length ; i<span style="color: #666666;">++</span>)
{
<span style="color: #007020; font-weight: bold;">var</span> tag <span style="color: #666666;">=</span> values[i][<span style="color: #40a070;">0</span>].trim();
<span style="color: #007020; font-weight: bold;">var</span> len <span style="color: #666666;">=</span> tag.length;
<span style="color: #007020; font-weight: bold;">var</span> sub <span style="color: #666666;">=</span> txt.substring(<span style="color: #40a070;">0</span>,len).trim();
<span style="color: #007020; font-weight: bold;">if</span> ( tag <span style="color: #666666;">==</span> sub )
{
<span style="color: #007020; font-weight: bold;">var</span> <span style="color: #007020; font-weight: bold;">char</span> <span style="color: #666666;">=</span> values[i][<span style="color: #40a070;">1</span>];
<span style="color: #007020; font-weight: bold;">var</span> url <span style="color: #666666;">=</span> values[i][<span style="color: #40a070;">2</span>];
<span style="color: #60a0b0; font-style: italic;">//Este código es especfico del ejemplo. En vuestro caso concreto puede necesitar cambios.</span>
<span style="color: #007020; font-weight: bold;">if</span>( <span style="color: #007020; font-weight: bold;">char</span>.length <span style="color: #666666;"><</span> <span style="color: #40a070;">2</span> )
{
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<a target='_blank' href='"</span><span style="color: #666666;">+</span> url <span style="color: #666666;">+</span><span style="color: #4070a0;">"'>"</span> <span style="color: #666666;">+</span> <span style="color: #007020; font-weight: bold;">char</span> <span style="color: #666666;">+</span> <span style="color: #4070a0;">"</a>"</span>;
}
<span style="color: #007020; font-weight: bold;">else</span>
{
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<a target='_blank' href='"</span><span style="color: #666666;">+</span> url <span style="color: #666666;">+</span><span style="color: #4070a0;">"'>"</span> <span style="color: #666666;">+</span> <span style="color: #007020; font-weight: bold;">char</span>.charAt(<span style="color: #40a070;">0</span>) <span style="color: #666666;">+</span> <span style="color: #4070a0;">"<small>"</span> <span style="color: #666666;">+</span> <span style="color: #007020; font-weight: bold;">char</span>.charAt(<span style="color: #40a070;">1</span>) <span style="color: #666666;">+</span> <span style="color: #4070a0;">"</small>"</span> <span style="color: #666666;">+</span> <span style="color: #4070a0;">"</a>"</span>;
}
<span style="color: #60a0b0; font-style: italic;">//Nos quedamos con el texto todavía no procesado</span>
txt <span style="color: #666666;">=</span> txt.substring(len);
<span style="color: #60a0b0; font-style: italic;">//Volvemos a mirar desde el principio</span>
i<span style="color: #666666;">=</span><span style="color: #40a070;">1</span>;
}
}
out <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"</p>"</span>;
<span style="color: #007020; font-weight: bold;">return</span> out;
}
</pre></div>
<p><br /></p><p>Si queréis verlo funcionando lo tengo implementado en esta <a href="https://www.aprenderjaponesgratis.com/2021/08/convertidor-de-romaji-hiragana.html" target="_blank">web de japonés</a></p><p>Cualquier duda , no vaciléis en hacerme llegar. Este proyecto es un poco más complejo de lo que os tengo acostumbrados.</p><p>Espero que os haya servido.</p><p>Nos vemos</p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com0tag:blogger.com,1999:blog-3233877562970007107.post-66422241351776949762021-07-27T23:17:00.002+01:002021-07-27T23:17:50.691+01:00Como convertir número a texto con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2021/07/como-obtener-el-nombre-de-un-fichero-con-google-apps-script.html'> <<<< Como obtener el nombre de un fichero con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html'> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<br />
<div class='cajaAll'><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html'> Google Apps Script </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-scripts-google-sheets.html'> Google Sheets </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-javascript.html'> JavaScript </a></div>
<p>Necesitas usar un número como si fuera un string cuando estas trabajando con Google Apps Script?. En muchas ocasiones nos puede resultar útil convertir un dato de tipo numérico a tipo string con Google Apps Script. Generalmente se usa este tipo de conversiones para obtener un identificador de forma automática o un código de producto por ejemplo , de forma que también nos puede resultar útil si aseguramos que el string va a tener un tamaño mínimo (rellanado con ceros por la izquierda, por ejemplo).</p><p>El código que os presentaré hoy hace justamente eso, convierte un número a un string usando Google Apps Script y opcionalmente permite rellenar con ceros a la izquierda si es necesario hasta el tamaño de string que tu le digas. </p><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> NumberToText(number,min_size)
{
<span style="color: #007020; font-weight: bold;">var</span> text <span style="color: #666666;">=</span> <span style="color: #4070a0;">""</span>;
<span style="color: #007020; font-weight: bold;">while</span>(number <span style="color: #666666;">></span> <span style="color: #40a070;">0</span>)
{
<span style="color: #007020; font-weight: bold;">var</span> <span style="color: #007020; font-weight: bold;">char</span> <span style="color: #666666;">=</span> <span style="color: #007020;">Math</span>.floor(number<span style="color: #666666;">%</span><span style="color: #40a070;">10</span>);
text <span style="color: #666666;">=</span> <span style="color: #007020;">String</span>(<span style="color: #007020; font-weight: bold;">char</span>) <span style="color: #666666;">+</span> text;
number <span style="color: #666666;">-=</span> <span style="color: #007020; font-weight: bold;">char</span>;
number <span style="color: #666666;">=</span> <span style="color: #007020;">Math</span>.floor(number<span style="color: #666666;">/</span><span style="color: #40a070;">10</span>);
}
<span style="color: #007020; font-weight: bold;">while</span> ( text.length <span style="color: #666666;"><</span> min_size )
{
text <span style="color: #666666;">=</span> <span style="color: #4070a0;">"0"</span> <span style="color: #666666;">+</span> text;
}
<span style="color: #007020; font-weight: bold;">return</span> text;
}
</pre></div><p></p><p></p><div><br /></div>La gracia de este código es que tanto se puede usar en nuestros programas Google Apps Script como usarlo directamente como una fórmula en nuestras hojas de Google Spreadsheets:<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLP7_ED_qFs66zLaENt78iyVBbdnVVAUmaELkfrz_1JpXzm4T_3XCTps-lbOyEkpVI4U5qS4twUOi5_iWmJdc62Rxsnw3ZPj6gGe2HvjAmwkH0a2p1GYjHq-Qqjcb1pWgjgCBzIwE6ANk/s309/numbertotext.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="84" data-original-width="309" height="174" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLP7_ED_qFs66zLaENt78iyVBbdnVVAUmaELkfrz_1JpXzm4T_3XCTps-lbOyEkpVI4U5qS4twUOi5_iWmJdc62Rxsnw3ZPj6gGe2HvjAmwkH0a2p1GYjHq-Qqjcb1pWgjgCBzIwE6ANk/w640-h174/numbertotext.png" width="640" /></a></div><br /><div><br /></div><div>Como podéis ver el código es extremadamente sencillo y fácil de usar. Lo podéis adaptar como querías a vuestras necesidades con muy pocos cambios.</div><div><br /></div><div>Cualquier cosa, no dudéis en hacérmelo saber.</div><div><br /></div><div>Nos vemos</div>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com0tag:blogger.com,1999:blog-3233877562970007107.post-31665812326339808192021-07-15T22:38:00.004+01:002021-07-15T23:05:34.236+01:00Como obtener el nombre de un fichero con Google Apps Script<div class="Menu">
<ul id="nav">
<li><a href="https://www.tutorialesgoogleappscripts.com/2021/07/como-cambiar-permisos-de-forma-recursiva-con-google-apps-script.html"> <<<< Como cambiar permisos de forma recursiva con Google Apps Script</a></li>
<li><a href="https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html"> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<br />
<div class="cajaAll"><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html"> Google Apps Script </a><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-scripts-google-sheets.html"> Google Sheets </a><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-script-google-drive.html"> Google Drive </a></div>
<p> </p><p>Hay ocasiones en las que nos puede resultar útil obtener el nombre de un fichero de Drive del cual solo tenemos el id. La forma de solucionar este problema es extremadamente fácil, obtendremos el fichero gracias al id y la funcionalidad de DriveApp y entonces le preguntaremos el nombre.</p><p>Dado que esto tiene utilidad en listas grandes de ids, ya he preparado el código para que lea los ids de la primera columna y escriba el nombre en la segunda columna tal y como se ve en esta imagen:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF3aXD2eWk6VDc8jgmT3adntUAbzetK-VAwIfrAlv77fCoWoTOoyd9hAUqlblDMpiSgM77mSB5LmeA-AgLdYLUnQpROwhdIVIKK4jpDA9izLbWXZHA-f8bZzyhTanWeZ8Dv1vSuIUhJgo/s586/filename.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Nombre de archivo de Drive con Google Apps Script" border="0" data-original-height="105" data-original-width="586" height="114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF3aXD2eWk6VDc8jgmT3adntUAbzetK-VAwIfrAlv77fCoWoTOoyd9hAUqlblDMpiSgM77mSB5LmeA-AgLdYLUnQpROwhdIVIKK4jpDA9izLbWXZHA-f8bZzyhTanWeZ8Dv1vSuIUhJgo/w640-h114/filename.png" title="Obtener nombre a partir de Id con Google Apps Script" width="640" /></a></div><br /><p> Es fácil de adaptar a lo que necesitéis. Os adjunto el código, ya viereis que más sencillo no puede ser. Si tenéis cualquier duda, hacédmela llegar sin problemas.</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> onOpen()
{
SpreadsheetApp.getUi().createMenu(<span style="color: #4070a0;">"SCRIPT"</span>).addItem(<span style="color: #4070a0;">"Get Name"</span>,<span style="color: #4070a0;">"GetName"</span>).addToUi();
}
<span style="color: #007020; font-weight: bold;">function</span> GetNameFromId(id)
{
<span style="color: #007020; font-weight: bold;">var</span> result <span style="color: #666666;">=</span> <span style="color: #4070a0;">"NOT FOUND"</span>;
<span style="color: #007020; font-weight: bold;">var</span> file <span style="color: #666666;">=</span> DriveApp.getFileById(id);
<span style="color: #007020; font-weight: bold;">if</span>(file <span style="color: #666666;">!=</span> <span style="color: #007020; font-weight: bold;">null</span>)
{
result <span style="color: #666666;">=</span> file.getName();
}
<span style="color: #007020; font-weight: bold;">return</span> result;
}
<span style="color: #007020; font-weight: bold;">function</span> GetName()
{
<span style="color: #007020; font-weight: bold;">var</span> sheet <span style="color: #666666;">=</span> SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
<span style="color: #007020; font-weight: bold;">var</span> values <span style="color: #666666;">=</span> sheet.getDataRange().getDisplayValues();
<span style="color: #007020; font-weight: bold;">for</span>( <span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">1</span> ; i <span style="color: #666666;"><</span> values.length ; <span style="color: #666666;">++</span>i )
{
<span style="color: #007020; font-weight: bold;">var</span> str <span style="color: #666666;">=</span> values[i][<span style="color: #40a070;">0</span>];
<span style="color: #007020; font-weight: bold;">if</span>(str <span style="color: #666666;">!=</span> <span style="color: #4070a0;">""</span>)
{
sheet.getRange(i<span style="color: #666666;">+</span><span style="color: #40a070;">1</span>,<span style="color: #40a070;">2</span>).setValue(GetNameFromId(str));
}
}
}
</pre></div>
<p>Solo como nota final, os comento que no es factible usar esta funcionalidad dentro de una formula ( como quería hacer al principio de redactar este post ) dado que las formulas se ejecutan sin permisos y esta funcionalidad necesita si o si de acceso a DriveApp ( como es lógico ). Es por ello que lo he montado en forma de ejecución batch de toda la lista.</p><p>Cualquier sugerencia siempre es bien recibida.</p><p>Nos vemos</p><p>P.D: Tal vez te interesa saber el paso contrario, <a href="https://www.tutorialesgoogleappscripts.com/2020/08/como-obtener-el-id-de-un-fichero-con-google-apps-scripts.html" target="_blank">como obtener el id de un fichero con Google Apps Script</a></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com0tag:blogger.com,1999:blog-3233877562970007107.post-75107762346307595322021-07-06T18:12:00.005+01:002021-07-06T18:24:34.010+01:00Como cambiar permisos de forma recursiva con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2021/06/introducir-datos-popup-google-apps-script.html'> <<<< Como introducir datos con un popup con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html'> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<br />
<div class='cajaAll'><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html'> Google Apps Script </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-drive.html'> Google Drive </a></div>
<p> En muchas ocasiones nos puede resultar útil cambiar los permisos de un árbol de directorios de Drive , de forma que con una sola llamada a un script nos aseguremos que todos los ficheros y carpetas que cuelgan de la carpeta origen tienen los permisos que nosotros queremos.</p><p>Hace un tiempo ya hice un artículo sobre <a href="https://www.tutorialesgoogleappscripts.com/2020/12/omo-cambiar-permisos-de-un-fichero-con-google-apps-script.html" target="_blank">como cambiar permisos de una carpeta de Drive con Google Apps Script</a>, así que tomando ese código de base, ya veréis que es muy fácil implementarlo para que sea recursivo en todo el árbol de carpetas.</p><p>Todo lo que hemos de hacer para conseguir recursividad es llamar a la misma función que estamos creando para cada una de las subcarpetas de la carpeta actual. Dicho así, parece complejo, pero viendo el código Google Apps Script lo tendréis clarísimo:</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> SetPermisosRecursivos(folder)
{
<span style="color: #60a0b0; font-style: italic;">//Seteamos permisos a la carpeta actual</span>
folder.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
<span style="color: #60a0b0; font-style: italic;">//Inspeccionamos todas las carpetas hijas</span>
<span style="color: #007020; font-weight: bold;">var</span> folders <span style="color: #666666;">=</span> folder.getFolders();
<span style="color: #007020; font-weight: bold;">while</span>(folders.hasNext())
{
SetPermisosRecursivos(folders.next());
}
<span style="color: #60a0b0; font-style: italic;">//Seteamos permisos a todos los ficheros de la carpeta actual</span>
<span style="color: #007020; font-weight: bold;">var</span> files <span style="color: #666666;">=</span> folder.getFiles();
<span style="color: #007020; font-weight: bold;">while</span>(files.hasNext())
{
files.next().setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
}
}
</pre></div>
<p>En este ejemplo todas las carpetas y ficheros que dependan de la carpeta que le pasemos a la función se compartirán con cualquier que tenga el link. Evidentemente podéis cambiar esa linea de código para que los permisos se apliquen como lo necesites en tu caso.</p><p>Cualquier duda que tengáis, no vaciléis en hacérmela llegar.</p><p>Nos vemos</p><p><br /></p>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com4tag:blogger.com,1999:blog-3233877562970007107.post-63980652508461062472021-06-19T12:11:00.004+01:002021-06-19T12:16:37.578+01:00Cómo saber el usuario actual con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2021/01/como-aprender-multiplicar-jugando-con-google-apps-script.html'> <<<< Como aprender a multiplicar jugando</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-crear-una-web-con-google-apps.html'> Como crear una web con Google Apps Script >>>> </a></li>
</ul>
</div>
<br />
<div class='cajaAll'><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html'> Google Apps Script </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-web.html'> Web </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-html5.html'> HTML5 </a></div>
<p> Cuando implementamos <a href="http://tutorialesgoogleappscripts.com/2020/08/como-usar-templates-web-con-google-apps.html" target="_blank">webs con Google Apps Script</a> o en general cuando queremos <a href="https://www.tutorialesgoogleappscripts.com/2020/10/como-comunicar-javascript-con-google-apps-script.html" target="_blank">comunicar javascript con Google Apps Script</a> siempre podemos tener problemas en saber cual es el usuario real que está usando nuestro servicios.</p><p>Generalmente cuando distribuimos una web implementada con Google Apps Script lo hacemos con los permisos de ejecución del desarrollador. Es decir. la web accede a los datos a los que el desarrollador tiene permiso, y el usuario de la web puede ver el html, pero no puede llegar a los documentos que hay detrás dado que el mismo no tiene permisos. Acostumbra a ser una muy buena manera de recolectar información de diferentes fuentes y poderlas mostrar a los usuarios de una forma controlada y sin tener que dar permisos para nada a nadie.</p><p>Ahora bien, ¿Qué pasaría si necesitáramos saber cual es el usuario que accede a nuestra web? Imaginemos que la web ha de mostrar información diferente en función de que usuario se está conectando (una web con diferentes niveles de permisos, por ejemplo) . Google Apps Script nos permite saber sin lugar a dudas cual es el usuario que se conecta a nuestra web y con que usuario se está ejecutando la web, de forma que podremos mostrar información diferente sin ningún tipo de problemas.</p><p>Con este ejemplo veréis facilísimo cual es la diferencia entre usuarios conectados a una web:</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> doGet()
{
<span style="color: #007020; font-weight: bold;">var</span> active_user <span style="color: #666666;">=</span> Session.getActiveUser().getEmail();
<span style="color: #007020; font-weight: bold;">var</span> effective_user <span style="color: #666666;">=</span> Session.getEffectiveUser().getEmail();
<span style="color: #007020; font-weight: bold;">var</span> user <span style="color: #666666;">=</span> Session.getUser().getEmail();
<span style="color: #007020; font-weight: bold;">var</span> output <span style="color: #666666;">=</span> <span style="color: #4070a0;">"<p>Active: "</span> <span style="color: #666666;">+</span> active_user <span style="color: #666666;">+</span> <span style="color: #4070a0;">"</p>"</span>;
output <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<p>Effective: "</span> <span style="color: #666666;">+</span> effective_user <span style="color: #666666;">+</span> <span style="color: #4070a0;">"</p>"</span>;
output <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<p>User: "</span> <span style="color: #666666;">+</span> user <span style="color: #666666;">+</span> <span style="color: #4070a0;">"</p>"</span>;
<span style="color: #007020; font-weight: bold;">return</span> HtmlService.createHtmlOutput(output);
}
</pre></div>
<p>Si ejecutáis la web con vuestro usuario veréis que los 3 campos son iguales:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4qPRCRvhZO8gIUlXmc6gJicMDrvgKLiD8oi97clhmTsxaLR4CVPUBsZkMnZY3ji5l9cqEO5xdTwIuTujXKQRUMli7oWKOkQ0bY3XHS07cogYYyL287RaKYZvfRJD67JhdcfHeudFU91A/s240/Usuarios.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Usuarios con Google Apps Script" border="0" data-original-height="108" data-original-width="240" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4qPRCRvhZO8gIUlXmc6gJicMDrvgKLiD8oi97clhmTsxaLR4CVPUBsZkMnZY3ji5l9cqEO5xdTwIuTujXKQRUMli7oWKOkQ0bY3XHS07cogYYyL287RaKYZvfRJD67JhdcfHeudFU91A/w640-h288/Usuarios.png" title="Diferencias entre effective user y active user" width="640" /></a></div>Si habéis habilitado que la web se puede ejecutar sin permisos de ninguno tipo, veréis que solo se llena el campo effective mientras que los otros dos quedan vacíos. <div><br /></div><div>Si ejecutas la web con otro usuario veras que el campo active y el campo effective difieren.</div><div><br /></div><div><b>Conclusión:</b></div><div>- Session.getEffectiveUser() Nos devuelve con que permisos se esta ejecutando la web (generalmente el desarrollador del código que ha publicado la web)</div><div>- Session.getActiveUser(): Nos dice que usuario se ha conectado a la web. Este es el que tendremos que usar para saber que usuario esta usando nuestro web.</div><div><br /></div><div>Con esta información podréis tener controlados que usuarios se conectan a vuestra web, pudiendo denegar servicio, o cambiar lo que vais a mostrar en función del tipo de usuario.</div><div><br /></div><div>Ya veis que es muy sencillo saber que usuario se conecta a nuestro Google Apps Script y actuar en consecuencia.</div><div><br /></div><div>No dudéis en hacerme llegar vuestras preguntas.</div><div><br /></div><div>Nos vemos<br /><p><br /></p></div>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com0tag:blogger.com,1999:blog-3233877562970007107.post-52567065634082531022021-06-09T23:58:00.003+01:002021-06-10T00:02:34.375+01:00Como introducir datos con un popup con Google Apps Script<div class="Menu">
<ul id="nav">
<li><a href="https://www.tutorialesgoogleappscripts.com/2021/05/como-extraer-un-pdf-solo-de-las-hojas-llenas-con-google-script.html"> <<<< Cómo extraer un PDF solo de las hojas con información con Google Apps Script</a></li>
<li><a href="https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html"> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<br />
<div class="cajaAll"><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html"> Google Apps Script </a><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-scripts-google-sheets.html"> Google Sheets </a><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-script-web.html"> Web </a><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-script-gui.html"> GUI </a><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-script-html5.html"> HTML5 </a></div>
En ocasiones puede resultar muy útil usar Google Apps Script a fin de simplificar la introducción de datos en nuestros spreadsheets. <div><br /></div><div>Gracias a Google Apps Scripts podemos generar un <a href="https://www.tutorialesgoogleappscripts.com/2021/02/como-poner-un-popup-en-un-spreadsheet-con-google-apps-script.html?showComment=1623279683878#c7807370622897599288" target="_blank">popup </a>con los campos que necesitemos que ingresen la información que queramos en las casillas que necesitemos.</div><div><br /></div><div>El ejemplo que aquí os muestro es muy sencillo, solo pide el nombre y el apellido y lo registra en la hoja de cálculo pero con pocas modificaciones podréis tenerlo listo para trabajar como lo necesitáis.</div><div><br /></div><div>El popup no es más que una pequeña web que se comunica con el Google Apps Script y le da la información que ha de procesar.</div><div><br /></div><div>Aquí os dejo el código:</div><div><br /></div><div>index.html<br />
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020;"><!DOCTYPE html></span>
<span style="color: #062873; font-weight: bold;"><html></span>
<span style="color: #062873; font-weight: bold;"><head></span>
<span style="color: #062873; font-weight: bold;"><base</span> <span style="color: #4070a0;">target="_top"</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"><script></span>
<span style="color: #007020; font-weight: bold;">function</span> Register()
{
<span style="color: #007020; font-weight: bold;">var</span> Nombre <span style="color: #666666;">=</span> <span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"Nombre"</span>).value;
<span style="color: #007020; font-weight: bold;">var</span> Apellido <span style="color: #666666;">=</span> <span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"Apellido"</span>).value;
google.script.run.withSuccessHandler(Done).Register( Nombre, Apellido );
}
<span style="color: #007020; font-weight: bold;">function</span> Done()
{
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"container"</span>).innerHTML <span style="color: #666666;">=</span> <span style="color: #4070a0;">"<p> PROCESO FINALIZADO </p>"</span>;
}
<span style="color: #062873; font-weight: bold;"></script></span>
<span style="color: #062873; font-weight: bold;"></head></span>
<span style="color: #062873; font-weight: bold;"><body></span>
<span style="color: #062873; font-weight: bold;"><div</span> <span style="color: #4070a0;">id="container"</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"><h1></span>Introducir datos<span style="color: #062873; font-weight: bold;"></h1></span>
<span style="color: #062873; font-weight: bold;"><p><input</span> <span style="color: #4070a0;">type="text"</span> <span style="color: #4070a0;">id="Nombre"</span> <span style="color: #4070a0;">value=""</span> <span style="color: #4070a0;">placeholder="Nombre"</span><span style="color: #062873; font-weight: bold;">></p></span>
<span style="color: #062873; font-weight: bold;"><p><input</span> <span style="color: #4070a0;">type="text"</span> <span style="color: #4070a0;">id="Apellido"</span> <span style="color: #4070a0;">value=""</span> <span style="color: #4070a0;">placeholder="Apellido"</span><span style="color: #062873; font-weight: bold;">></p></span>
<span style="color: #062873; font-weight: bold;"><button</span> <span style="color: #4070a0;">onclick="Register()"</span><span style="color: #062873; font-weight: bold;">></span> Registrar <span style="color: #062873; font-weight: bold;"></button></span>
<span style="color: #062873; font-weight: bold;"></div></span>
<span style="color: #062873; font-weight: bold;"></body></span>
<span style="color: #062873; font-weight: bold;"></html></span>
</pre></div>
<div><br /></div><div>Code.gs</div>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> onOpen()
{
SpreadsheetApp.getUi().createMenu(<span style="color: #4070a0;">"SCRIPT"</span>)
.addItem(<span style="color: #4070a0;">"ShowPopup"</span>,<span style="color: #4070a0;">"ShowPopup"</span>)
.addToUi();
}
<span style="color: #007020; font-weight: bold;">function</span> ShowPopup()
{
<span style="color: #007020; font-weight: bold;">var</span> html <span style="color: #666666;">=</span> HtmlService.createHtmlOutputFromFile(<span style="color: #4070a0;">'index'</span>).setWidth(<span style="color: #40a070;">300</span>).setHeight(<span style="color: #40a070;">300</span>);
SpreadsheetApp.getUi().showModalDialog(html,<span style="color: #4070a0;">"Entrada de datos"</span>);
}
<span style="color: #007020; font-weight: bold;">function</span> Register( Nombre, Apellido )
{
<span style="color: #007020; font-weight: bold;">var</span> row <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Array</span>();
row.push(Nombre);
row.push(Apellido);
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().appendRow(row);
}
</pre></div>
<div><br />
</div></div>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com1tag:blogger.com,1999:blog-3233877562970007107.post-45534529027819319352021-05-31T23:55:00.003+01:002021-09-08T21:36:44.353+01:00Extraer PDF solo de hojas no vacías con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2021/02/como-obtener-tamano-imagen-con-google-apps-script.html'> <<<< Como obtener el tamaño de imágenes con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html'> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<br />
<div class='cajaAll'><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html'> Google Apps Script </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-scripts-google-sheets.html'> Google Sheets </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-pdf.html'> PDF </a></div>
<p> Hace un tiempo un usuario me pidió en el post de <a href="https://www.tutorialesgoogleappscripts.com/2020/08/como-crear-un-pdf-de-una-seleccion-con-google-scripts.html" target="_blank">Como crear un PDF de una selección de datos con Google Apps Script</a> como se podía hacer un script que generase un PDF de las hojas que tuvieran datos.</p><p>Es decir, como implementar un Google Apps Script que ignorase las hojas vacías de un spreadsheet y generase un PDF con la información.</p><p>El código para hacer esto es bastante sencillo, de hecho, me he basado en el código que publiqué en <a href="https://www.tutorialesgoogleappscripts.com/2020/10/como-generar-un-pdf-y-enviarlo-por-email-con-google-apps-script.html" target="_blank">Como generar un PDF y enviarlo por email con Google Apps Script</a> modificando la parte en que se detecta las hojas a convertir.</p><p>El proceso para convertir un spreadsheet a PDF desde Google Apps Script, es tan sencillo como llamar a la API de exportación a través de un UrlFetchApp y con eso lo tenemos todo hecho. </p><p>El proceso de conversión a PDF puede tardar un rato ( dependerá del tamaño de los datos ) , generalmente unas decenas de segundos.</p><p>Aquí os dejo el código:</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> onOpen()
{
SpreadsheetApp.getUi().createMenu(<span style="color: #4070a0;">"SCRIPT"</span>).addItem(<span style="color: #4070a0;">"PDF"</span>,<span style="color: #4070a0;">"ExportPDF"</span>).addToUi();
}
<span style="color: #007020; font-weight: bold;">function</span> ExportPDF()
{
<span style="color: #007020; font-weight: bold;">var</span> timestamp <span style="color: #666666;">=</span> <span style="color: #007020;">Math</span>.floor((<span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Date</span>()).getTime() <span style="color: #666666;">/</span> <span style="color: #40a070;">1000</span>);
<span style="color: #007020; font-weight: bold;">var</span> spreadsheet <span style="color: #666666;">=</span> SpreadsheetApp.getActiveSpreadsheet();
<span style="color: #007020; font-weight: bold;">var</span> sheets <span style="color: #666666;">=</span> spreadsheet.getSheets();
<span style="color: #007020; font-weight: bold;">var</span> values <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Array</span>();
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> s <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span> ; s <span style="color: #666666;"><</span> sheets.length ; s<span style="color: #666666;">++</span>)
{
<span style="color: #60a0b0; font-style: italic;">//Asumimos que la hoja esta "escrita" si tiene más de una fila de datos</span>
<span style="color: #007020; font-weight: bold;">if</span> ( sheets[s].getDataRange().getValues().length <span style="color: #666666;">></span> <span style="color: #40a070;">1</span> )
{
values.push(sheets[s].getName());
}
}
<span style="color: #007020; font-weight: bold;">var</span> out <span style="color: #666666;">=</span> SpreadsheetApp.create(spreadsheet.getName() <span style="color: #666666;">+</span> <span style="color: #4070a0;">"-ToPrint-"</span> <span style="color: #666666;">+</span> timestamp);
<span style="color: #007020; font-weight: bold;">var</span> folder <span style="color: #666666;">=</span> DriveApp.getFolderById(<span style="color: #4070a0;">"tu_nombre_de_Carpeta"</span>);
SpreadsheetApp.flush();
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span> ; i <span style="color: #666666;"><</span> values.length ; <span style="color: #666666;">++</span>i)
{
<span style="color: #007020; font-weight: bold;">var</span> sheet <span style="color: #666666;">=</span> spreadsheet.getSheetByName(values[i]);
sheet.copyTo(out).setName(values[i]);
}
<span style="color: #007020; font-weight: bold;">var</span> first_sheet <span style="color: #666666;">=</span> out.getSheets()[<span style="color: #40a070;">0</span>];
out.deleteSheet(first_sheet);
SpreadsheetApp.flush();
<span style="color: #007020; font-weight: bold;">var</span> exportUrl <span style="color: #666666;">=</span> <span style="color: #4070a0;">'https://docs.google.com/spreadsheets/d/'</span> <span style="color: #666666;">+</span> out.getId()
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'/export?exportFormat=pdf&format=pdf'</span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&size=FOLIO'</span> <span style="color: #60a0b0; font-style: italic;">//Tamaño del papel: 0-LETTER,1-TABLOID,2-LEGAL,3-STATEMENT,4-EXECUTIVE,5-FOLIO,6-A3,7-A4,8-A5,9-B4,10-B5</span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&portrait=false'</span> <span style="color: #60a0b0; font-style: italic;">//Orientación: False - Horizontal / True - Vertical</span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&fitw=true'</span> <span style="color: #60a0b0; font-style: italic;">//Forzamos que quepa correctamente en el ancho de la hoja</span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&scale=4'</span> <span style="color: #60a0b0; font-style: italic;">// Fit to Page?</span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&top_margin=1.75'</span> <span style="color: #60a0b0; font-style: italic;">//Margen Superior </span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&bottom_margin=1.75'</span> <span style="color: #60a0b0; font-style: italic;">//Margen inferior </span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&left_margin=1.5'</span> <span style="color: #60a0b0; font-style: italic;">//Margen Izquierdo </span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&right_margin=1.5'</span> <span style="color: #60a0b0; font-style: italic;">//Margen Derecho </span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&sheetnames=false'</span> <span style="color: #60a0b0; font-style: italic;">//Marcamos si se ha de poner el nombre de las hojas o no</span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&printtitle=false'</span> <span style="color: #60a0b0; font-style: italic;">//Marcamos si se ha imprimir el titulo del documento o no</span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&pagenum=false'</span> <span style="color: #60a0b0; font-style: italic;">//Indicamos si se de pintar el número de página</span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&gridlines=true'</span> <span style="color: #60a0b0; font-style: italic;">//Marcamos si queremos que se vean las lineas de las celdas o no </span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&fzr=FALSE'</span> <span style="color: #60a0b0; font-style: italic;">//Frozen: marcamos si las cabeceras se han de ir imprimiendo o no en las consecutivas hojas</span>
<span style="color: #666666;">+</span> <span style="color: #4070a0;">'&id='</span> <span style="color: #666666;">+</span> out.getId(); <span style="color: #60a0b0; font-style: italic;">//Identificador del tab</span>
<span style="color: #007020; font-weight: bold;">var</span> response <span style="color: #666666;">=</span> UrlFetchApp.fetch(exportUrl, { muteHttpExceptions<span style="color: #666666;">:</span> <span style="color: #007020; font-weight: bold;">true</span>, headers<span style="color: #666666;">:</span> { Authorization<span style="color: #666666;">:</span> <span style="color: #4070a0;">'Bearer '</span> <span style="color: #666666;">+</span> ScriptApp.getOAuthToken() } } );
<span style="color: #007020; font-weight: bold;">var</span> blob <span style="color: #666666;">=</span> response.getBlob();
blob <span style="color: #666666;">=</span> blob.setName(out.getName());
<span style="color: #007020; font-weight: bold;">var</span> pdfFile <span style="color: #666666;">=</span> DriveApp.createFile(blob);
pdfFile.moveTo(folder);
SpreadsheetApp.getUi().alert(pdfFile.getUrl());
DriveApp.getFileById(out.getId()).setTrashed(<span style="color: #007020; font-weight: bold;">true</span>);
}
</pre></div>
<p> No vaciléis en hacerme llegar vuestras dudas ( tardaré más o menos pero siempre acabaré respondiendo )</p><p>Nos vemos</p>
<p> </p><p> </p>
LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com0tag:blogger.com,1999:blog-3233877562970007107.post-73701513052631981262021-02-07T13:11:00.001+00:002021-02-07T13:17:34.778+00:00Como obtener el tamaño de imágenes con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2021/02/como-poner-un-popup-en-un-spreadsheet-con-google-apps-script.html'> <<<< Cómo poner un popup en un spreadsheet con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html'> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<div class='cajaAll'><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html'> Google Apps Script </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-scripts-google-sheets.html'> Google Sheets </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-web.html'> Web </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-javascript.html'> JavaScript </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-html5.html'> HTML5 </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-ejemplos.html'> Ejemplos </a></div>
<div>Puede haber ocasiones en que obtener el tamaño de imágenes usando Google Apps Script puede ser extremadamente útil para automatizar tareas, el problema es que esto es bastante difícil de conseguir (te reto a que lo encuentres :) ). Aunque me ha costado bastante he conseguido desarrollar un manera de hacerlo y que me permite ahorra bastante tiempo diario al calcular los tamaños de grupos de imágenes.</div><div><br /></div><div>He montado un spreadsheet con esta estructura, donde puedes poner la lista de url a las imagenes y al ejecutar el script se rellenan el height y el width de la imagen gracias a la magia de Google Apps Script.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4eC8GdsbSaPLfCpeJJnhbeCT08whFFaw4sKWkJytJWP7_ScH_OasAEbBYsHZnyXmtXN0stARTw2ERQ_z0zhDT1Axm3YGj_6gaKeWQLuFYpRYKgSIt9omlfUMYCNqlbZ47cF0mf9U2hpQ/s1035/sizes.png" style="margin-left: 1em; margin-right: 1em;"><img alt="como calcular tamaño de una imagen con Google Apps Script" border="0" data-original-height="298" data-original-width="1035" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4eC8GdsbSaPLfCpeJJnhbeCT08whFFaw4sKWkJytJWP7_ScH_OasAEbBYsHZnyXmtXN0stARTw2ERQ_z0zhDT1Axm3YGj_6gaKeWQLuFYpRYKgSIt9omlfUMYCNqlbZ47cF0mf9U2hpQ/w640-h184/sizes.png" title="Estructura para calcular tamaños con Google Apps Script" width="640" /></a></div><br /><div><br /></div><div><b>Como conseguirlo?</b></div><div>En este caso concreto, el gran problema no es saber programar, sino encontrar la manera de poder obtener la información que queremos. Desde Google Apps Script es IMPOSIBLE conseguirlo directamente, no hay herramienta que te lo permita, pero, desde JavaScript si que es factible saber el tamaño de una imagen.</div><div><br /></div><div>El código para saber el tamaño de una imagen con JavaScript seria tal que así:</div>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> GetImagesize()
{
<span style="color: #007020; font-weight: bold;">var</span> img <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> Image();
img.addEventListener(<span style="color: #4070a0;">"load"</span>, <span style="color: #007020; font-weight: bold;">function</span>()
{
<span style="color: #007020; font-weight: bold;">var</span> url <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">this</span>.currentSrc;
<span style="color: #007020; font-weight: bold;">var</span> width <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">this</span>.naturalWidth;
<span style="color: #007020; font-weight: bold;">var</span> height <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">this</span>.naturalHeight;
<span style="color: #60a0b0; font-style: italic;">//Aqui hacemos lo queramos con ese tamaño </span>
});
img.src <span style="color: #666666;">=</span> url_de_tu_imagen;
}
</pre></div>
<div><br /></div><div>Básicamente, creamos un objeto de tipo imagen (una de las pocas cosas de JavaScript que no podemos hacer en Google Apps Script), le marcamos que cuando la imagen este cargada obtenga el tamaño de la imagen correspondiente y le damos la url de la imagen a cargar.</div><div><br /></div><div>Tal como hemos dicho esto no puede hacerse en Google Apps Script, pero... desde Google Apps Script si que podemos servir una <a href="https://www.tutorialesgoogleappscripts.com/2015/03/como-crear-una-web-dinamica-con-google.html" target="_blank">web </a>que use JavaScript. Es más, podemos hacer que esta web esta embedida dentro de un <a href="https://www.tutorialesgoogleappscripts.com/2021/02/como-poner-un-popup-en-un-spreadsheet-con-google-apps-script.html" target="_blank">popup en un spreadsheet</a>, de forma que cuando llamemos a este popup desde nuestro spreadsheet se realice todo el proceso de obtención de tamaños de imágenes. </div><div><br /></div><div>Ahora el problema que tendremos es que la obtención de los tamaños de las imágenes se producirá de forma asíncrona (se obtendrá cuando la imagen se haya cargado), de forma que esta información la tendremos que ir guardando hasta que no la podamos recuperar toda. La forma más fácil es usar la cache ( sessionStorage ) de JavaScript.</div><div><br /></div><div>Finalmente solo necesitaremos <a href="https://www.tutorialesgoogleappscripts.com/2020/10/como-comunicar-javascript-con-google-apps-script.html" target="_blank">transferir toda esta información desde JavaScript a Google Apps Script</a> para poder guardarla en nuestro spreadsheet.</div><div><br /></div><div>Como podéis ver, el proyecto es bastante más complicado de lo que parece, pero personalmente ha sido todo un orgullo poderlo completar.</div><div><br /></div><div>Os adjunto todo el código del proyecto para que podáis ponerlo en práctica.</div><div><br /></div><div>Espero que os sirva! </div><div><br /></div><div>No dudéis en hacerme llegar vuestras propuestas!</div><div><br /></div>Code.gs
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> onOpen()
{
SpreadsheetApp.getUi().createMenu(<span style="color: #4070a0;">"SCRIPT"</span>)
.addItem(<span style="color: #4070a0;">"CheckSize"</span>,<span style="color: #4070a0;">"CheckSize"</span>)
.addToUi();
}
<span style="color: #007020; font-weight: bold;">function</span> AskForList()
{
<span style="color: #007020; font-weight: bold;">var</span> spreadsheet <span style="color: #666666;">=</span> SpreadsheetApp.getActiveSpreadsheet();
<span style="color: #007020; font-weight: bold;">var</span> sheeturl <span style="color: #666666;">=</span> spreadsheet.getActiveSheet();
<span style="color: #007020; font-weight: bold;">var</span> images <span style="color: #666666;">=</span> sheeturl.getRange(<span style="color: #40a070;">1</span>,<span style="color: #40a070;">1</span>,sheeturl.getLastRow(), <span style="color: #40a070;">1</span> ).getValues();
<span style="color: #007020; font-weight: bold;">var</span> elements <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Array</span>();
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">1</span> ; i <span style="color: #666666;"><</span> images.length ; <span style="color: #666666;">++</span>i)
{
<span style="color: #007020; font-weight: bold;">var</span> url <span style="color: #666666;">=</span> images[i][<span style="color: #40a070;">0</span>];
<span style="color: #007020; font-weight: bold;">var</span> element <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Object</span>();
element.url <span style="color: #666666;">=</span> url;
elements.push(element);
}
<span style="color: #007020; font-weight: bold;">return</span> elements;
}
<span style="color: #007020; font-weight: bold;">function</span> ReportSizes(sizes)
{
<span style="color: #007020; font-weight: bold;">var</span> spreadsheet <span style="color: #666666;">=</span> SpreadsheetApp.getActiveSpreadsheet();
<span style="color: #007020; font-weight: bold;">var</span> sheet <span style="color: #666666;">=</span> spreadsheet.getActiveSheet();
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span> ; i <span style="color: #666666;"><</span> sizes.length ; <span style="color: #666666;">++</span>i)
{
<span style="color: #007020; font-weight: bold;">var</span> size <span style="color: #666666;">=</span> sizes[i];
sheet.getRange(i<span style="color: #666666;">+</span><span style="color: #40a070;">2</span>,<span style="color: #40a070;">2</span>).setValue(size.Height);
sheet.getRange(i<span style="color: #666666;">+</span><span style="color: #40a070;">2</span>,<span style="color: #40a070;">3</span>).setValue(size.Width);
}
}
<span style="color: #007020; font-weight: bold;">function</span> CheckSize()
{
<span style="color: #007020; font-weight: bold;">var</span> html <span style="color: #666666;">=</span> HtmlService.createHtmlOutputFromFile(<span style="color: #4070a0;">'index'</span>).setWidth(<span style="color: #40a070;">100</span>).setHeight(<span style="color: #40a070;">100</span>);
SpreadsheetApp.getUi().showModalDialog(html,<span style="color: #4070a0;">"Image Size"</span>);
}
</pre></div><div><br /></div>
index.html
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #666666;"><!</span>DOCTYPE html<span style="color: #666666;">></span>
<span style="color: #666666;"><</span>html<span style="color: #666666;">></span>
<span style="color: #666666;"><</span>head<span style="color: #666666;">></span>
<span style="color: #666666;"><</span>base target<span style="color: #666666;">=</span><span style="color: #4070a0;">"_top"</span><span style="color: #666666;">></span>
<span style="color: #666666;"><</span>script<span style="color: #666666;">></span>
<span style="color: #007020; font-weight: bold;">function</span> getSize(url)
{
<span style="color: #007020; font-weight: bold;">var</span> img <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> Image();
img.addEventListener(<span style="color: #4070a0;">"load"</span>, <span style="color: #007020; font-weight: bold;">function</span>()
{
<span style="color: #007020; font-weight: bold;">var</span> url <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">this</span>.currentSrc;
<span style="color: #007020; font-weight: bold;">var</span> width <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">this</span>.naturalWidth;
<span style="color: #007020; font-weight: bold;">var</span> height <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">this</span>.naturalHeight;
sessionStorage[url<span style="color: #666666;">+</span><span style="color: #4070a0;">"_width"</span>] <span style="color: #666666;">=</span> width;
sessionStorage[url<span style="color: #666666;">+</span><span style="color: #4070a0;">"_height"</span>]<span style="color: #666666;">=</span> height;
});
img.src <span style="color: #666666;">=</span> url;
}
<span style="color: #007020; font-weight: bold;">function</span> ReciveDone()
{
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"button"</span>).innerHTML <span style="color: #666666;">=</span> <span style="color: #4070a0;">"<a> PROCESS END </a>"</span>;
}
<span style="color: #007020; font-weight: bold;">function</span> ReciveWaiting(list)
{
<span style="color: #007020; font-weight: bold;">var</span> errors <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Array</span>();
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span> ; i <span style="color: #666666;"><</span> list.length ; <span style="color: #666666;">++</span>i )
{
<span style="color: #007020; font-weight: bold;">var</span> element <span style="color: #666666;">=</span> list[i];
<span style="color: #007020; font-weight: bold;">var</span> width <span style="color: #666666;">=</span> sessionStorage[element.url<span style="color: #666666;">+</span><span style="color: #4070a0;">"_width"</span>];
<span style="color: #007020; font-weight: bold;">var</span> height <span style="color: #666666;">=</span> sessionStorage[element.url<span style="color: #666666;">+</span><span style="color: #4070a0;">"_height"</span>];
list[i].Height <span style="color: #666666;">=</span> height;
list[i].Width <span style="color: #666666;">=</span> width;
}
google.script.run.withSuccessHandler(ReciveDone).ReportSizes(list);
}
<span style="color: #007020; font-weight: bold;">function</span> ReciveList(list)
{
sessionStorage.clear();
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span> ; i <span style="color: #666666;"><</span> list.length ; <span style="color: #666666;">++</span>i )
{
<span style="color: #007020; font-weight: bold;">var</span> element <span style="color: #666666;">=</span> list[i];
getSize(element.url);
}
google.script.run.withSuccessHandler(ReciveWaiting).AskForList();
}
<span style="color: #007020; font-weight: bold;">function</span> AskForList()
{
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"button"</span>).innerHTML <span style="color: #666666;">=</span> <span style="color: #4070a0;">""</span>;
google.script.run.withSuccessHandler(ReciveList).AskForList();
}
<span style="color: #666666;"><</span><span style="border: 1px solid rgb(255, 0, 0);">/script></span>
<span style="color: #666666;"><</span><span style="border: 1px solid rgb(255, 0, 0);">/head></span>
<span style="color: #666666;"><</span>body<span style="color: #666666;">></span>
<span style="color: #666666;"><</span>div id<span style="color: #666666;">=</span><span style="color: #4070a0;">"button"</span><span style="color: #666666;">></span>
<span style="color: #666666;"><</span>input type<span style="color: #666666;">=</span><span style="color: #4070a0;">"button"</span> onclick<span style="color: #666666;">=</span><span style="color: #4070a0;">"AskForList()"</span> value<span style="color: #666666;">=</span><span style="color: #4070a0;">"PROCEED"</span><span style="color: #666666;">></span>
<span style="color: #666666;"><</span><span style="border: 1px solid rgb(255, 0, 0);">/div></span>
<span style="color: #666666;"><</span><span style="border: 1px solid rgb(255, 0, 0);">/body></span>
<span style="color: #666666;"><</span><span style="border: 1px solid rgb(255, 0, 0);">/html></span>
</pre></div>
LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com6tag:blogger.com,1999:blog-3233877562970007107.post-37132133376387830172021-02-06T15:18:00.002+00:002021-02-11T23:38:59.356+00:00Cómo poner un popup en un spreadsheet con Google Apps Script<div class="Menu">
<ul id="nav">
<li><a href="https://www.tutorialesgoogleappscripts.com/2021/01/como-seleccionar-la-fecha-actual-con-google-apps-script.html"> <<<< Como seleccionar la fecha actual al abrir un spreadsheet con Google Apps Script </a></li>
<li><a href="https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html"> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<br />
<div class="cajaAll"><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html"> Google Apps Script </a><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-scripts-google-sheets.html"> Google Sheets </a><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-script-gui.html"> GUI </a><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-script-html5.html"> HTML5 </a></div>
<p> Hay ocasiones en que nos puede resultar interesante poner un popup en un spreadsheet. Ya sea para mostrar información, para pedirle información al usuario o para permitir mostrar una pequeña web en el spreadsheet, los popups de Google Apps Script pueden ser de gran utilidad.</p><p>La forma de poder hacer popups con Google Apps Script se basa en cargar una web en un contexto modal y mostrarlo. Parece complicado pero realmente, es algo trivial.</p><p>Lo primero que necesitaremos es un html que es el que mostraremos en nuestro popup dentro del spreadsheet, aquí os dejo un ejemplo, pero en principio podríais poner cualquier web hecha en HTML5 que quisierais:</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020;"><!DOCTYPE html></span>
<span style="color: #062873; font-weight: bold;"><html></span>
<span style="color: #062873; font-weight: bold;"><head></span>
<span style="color: #062873; font-weight: bold;"><base</span> <span style="color: #4070a0;">target="_top"</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"></head></span>
<span style="color: #062873; font-weight: bold;"><body></span>
<span style="color: #062873; font-weight: bold;"><h1></span>Ejemplo de web en popup<span style="color: #062873; font-weight: bold;"><h1></span>
<span style="color: #062873; font-weight: bold;"><select></span>
<span style="color: #062873; font-weight: bold;"><option</span> <span style="color: #4070a0;">value="1"</span><span style="color: #062873; font-weight: bold;">></span>Opcion 1<span style="color: #062873; font-weight: bold;"></option></span>
<span style="color: #062873; font-weight: bold;"><option</span> <span style="color: #4070a0;">value="2"</span><span style="color: #062873; font-weight: bold;">></span>Opcion B<span style="color: #062873; font-weight: bold;"></option></span>
<span style="color: #062873; font-weight: bold;"><option</span> <span style="color: #4070a0;">value="3"</span><span style="color: #062873; font-weight: bold;">></span>Tegucigalpa<span style="color: #062873; font-weight: bold;"></option></span>
<span style="color: #062873; font-weight: bold;"></select></span>
<span style="color: #062873; font-weight: bold;"></body></span>
<span style="color: #062873; font-weight: bold;"></html></span>
</pre></div>
<p>Esta web se comporta exactamente igual que una <a href="https://www.tutorialesgoogleappscripts.com/2015/03/como-crear-una-web-dinamica-con-google.html" target="_blank">web que podamos servir directamente desde un spreadsheet</a>, así que nos permitirá hacer cosas como <a href="https://www.tutorialesgoogleappscripts.com/2020/10/como-comunicar-javascript-con-google-apps-script.html" target="_blank">comunicar desde JavaScript con el Google Apps Script del servidor</a>. Con esto, está claro que la potencia del sistema es extrema.</p><p>Como serviremos este html en un popup del spreadsheet con Google Apps Script? Fácil, vamos a usar la función showModalDialog para servir la web que queramos como un popup del tamaño que queramos.</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> onOpen()
{
SpreadsheetApp.getUi().createMenu(<span style="color: #4070a0;">"SCRIPT"</span>)
.addItem(<span style="color: #4070a0;">"ShowPopup"</span>,<span style="color: #4070a0;">"ShowPopup"</span>)
.addToUi();
}
<span style="color: #007020; font-weight: bold;">function</span> ShowPopup()
{
<span style="color: #007020; font-weight: bold;">var</span> html <span style="color: #666666;">=</span> HtmlService.createHtmlOutputFromFile(<span style="color: #4070a0;">'index'</span>).setWidth(<span style="color: #40a070;">300</span>).setHeight(<span style="color: #40a070;">300</span>);
SpreadsheetApp.getUi().showModalDialog(html,<span style="color: #4070a0;">"Ejemplo de popup"</span>);
}
</pre></div>
<p>Si copiáis estos ficheros en vuestro proyecto y ejecutáis veréis algo de este estilo:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik-HdlYzn2XN7puuk5O8KqggFiOCGRy2PHb6ADhEJ4EKEkB1yl_v6xv_Mag_hmXa0LTUWZa5lQFjf0v6fHOi1NuAvSaNaVPun5t6eCqk99N-3SuEkP2JUYkxR5XB4AVvT5qiZ3Awhp61I/s433/popup-min.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Ejemplo de popup" border="0" data-original-height="433" data-original-width="400" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik-HdlYzn2XN7puuk5O8KqggFiOCGRy2PHb6ADhEJ4EKEkB1yl_v6xv_Mag_hmXa0LTUWZa5lQFjf0v6fHOi1NuAvSaNaVPun5t6eCqk99N-3SuEkP2JUYkxR5XB4AVvT5qiZ3Awhp61I/w370-h400/popup-min.png" title="Popup con Google Apps Script" width="370" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><p>Como ya os habréis imaginado esto da una funcionalidad adicional a nuestros spreadsheets realmente brutal. Nos permite crear con HTML5 interficies de usuario profesionales ya sea para mostrar información o pedirla.</p><p>Bajo mi forma de ver, es una de las características más potentes de Google Apps Script, es un tema que no tiene límites ni fin.</p><p>Espero que te haya servido, y recuerda, no vaciles en hacerme llegar tus dudas</p><p>Nos vemos</p><p><br /></p><p><br /></p><p><br /></p>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com6tag:blogger.com,1999:blog-3233877562970007107.post-27566454953651423832021-02-02T17:26:00.001+00:002021-02-02T17:53:52.168+00:00Como crear una biblioteca con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2021/01/como-generar-numeros-aleatorios-con-google-apps-script.html'> <<<< Como generar números aleatorios con google apps script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/que-es-google-apps-script.html'> ¿Que es Google Apps Script ? (Tutorial en Español) >>>> </a></li>
</ul>
</div>
<div class='cajaAll'><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html'> Google Apps Script </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-scripts-google-sheets.html'> Google Sheets </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-api.html'> API </a></div>
<p>Seguramente habrás oído hablar de las bibliotecas de Google Apps Script y te preguntarás si es algo que te puede servir en tus proyectos. Una biblioteca de Google Apps Script no es más que un proyecto al que le damos acceso al código desde otro proyectos. </p><p>Para verlo claro, nada más sencillo que un ejemplo.</p><p>Abriremos un proyecto de código dentro de un spreadsheet (como hacemos en el resto de proyectos) y escribiremos una función que haga algo concreto, en mi caso he hecho una función muy sencilla que se encarga de sumar vectores:</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #60a0b0; font-style: italic;">/**</span>
<span style="color: #60a0b0; font-style: italic;"> * Función que se encarga de sumar vectores. No controla tamaños.</span>
<span style="color: #60a0b0; font-style: italic;"> * @param a Primer vector a sumar</span>
<span style="color: #60a0b0; font-style: italic;"> * @param b Segundo vector a sumar</span>
<span style="color: #60a0b0; font-style: italic;"> * @return Suma de los vectores a y b</span>
<span style="color: #60a0b0; font-style: italic;"> */</span>
<span style="color: #007020; font-weight: bold;">function</span> VectorSum(a,b)
{
<span style="color: #007020; font-weight: bold;">var</span> c <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Array</span>();
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span> ; i <span style="color: #666666;"><</span> a.length ; <span style="color: #666666;">++</span>i)
{
c.push( a[i]<span style="color: #666666;">+</span>b[i] );
}
<span style="color: #007020; font-weight: bold;">return</span> c;
}
</pre></div>
<p>Una vez tengamos hecho este código vamos a publicarlo como librería.</p><p>Le vamos a a dar a Implementar > Nueva Implementación</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWywEFtJv-WIhVlYWmwqck02hzo2NPDfLof4TDXCkp9jDtMnUDX415gYKpxcsB5FPJ-m-jvFt-z5ouCdysyEQMDYhgIoIPnDUcw9O49y11gMQ9BM1dvste2vdJbcf-5DtQGZ-XgMDHPtY/s300/implementar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="227" data-original-width="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWywEFtJv-WIhVlYWmwqck02hzo2NPDfLof4TDXCkp9jDtMnUDX415gYKpxcsB5FPJ-m-jvFt-z5ouCdysyEQMDYhgIoIPnDUcw9O49y11gMQ9BM1dvste2vdJbcf-5DtQGZ-XgMDHPtY/s0/implementar.png" /></a></div><p>Y seleccionaremos que la nueva implementación es una biblioteca</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnR-69DRYwC8B-rTX8cn8sEBrs5iemy6aL8i1Ngxrjm25zFRCFH3lbjqa4hMCxJoy_M4hKcmQZLgnYgdQeDfpbRVSjL1hgnIXt1R3p35pwQAQ7L3-qYSBFHjM9SWlJAYLHQyngVejs_WE/s364/Biblioteca.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="278" data-original-width="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnR-69DRYwC8B-rTX8cn8sEBrs5iemy6aL8i1Ngxrjm25zFRCFH3lbjqa4hMCxJoy_M4hKcmQZLgnYgdQeDfpbRVSjL1hgnIXt1R3p35pwQAQ7L3-qYSBFHjM9SWlJAYLHQyngVejs_WE/s320/Biblioteca.png" width="320" /></a></div><div><br /></div>Y pondremos una descripción de para que sirve nuestra biblioteca.<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjej75XzmhM_ibNiRwN5JnavHnzdMzgJpQppx1etaaZQwAVawnoo-Xj4-gqkOgXiBrIyLLhFsBt_rvKrgzagbUTA-TkHXbATkEqrQ3IxK95P40dimgFxB3dCxG-f4nUP6MHZyHLDTTH4o/s760/descripcion.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="232" data-original-width="760" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjej75XzmhM_ibNiRwN5JnavHnzdMzgJpQppx1etaaZQwAVawnoo-Xj4-gqkOgXiBrIyLLhFsBt_rvKrgzagbUTA-TkHXbATkEqrQ3IxK95P40dimgFxB3dCxG-f4nUP6MHZyHLDTTH4o/w640-h196/descripcion.png" width="640" /></a></div><br /><p>Con ello conseguiremos una ruta de acceso a la biblioteca que es lo que usaremos para distribuirla y usarla en nuestros proyectos.</p><p>Para "instalar" la libreria en nuestro proyecto solo debemos crear un nuevo proyecto de código y darle al botón de la izquierda de + Bibliotecas.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb_iehwKyOWDFDdH-EQghvobn1c8MLba35u_QYi1rZu5oP-dvK_YB8IQBBQ8sz3GXzTml6DjTvkhGn131mmXw5ev7GdqOYpNkzvsveoQvyMFgS-qqOrgILCBYQ25v8JzTbCIqCPd9brGQ/s529/anyadirbiblioteca.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="521" data-original-width="529" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb_iehwKyOWDFDdH-EQghvobn1c8MLba35u_QYi1rZu5oP-dvK_YB8IQBBQ8sz3GXzTml6DjTvkhGn131mmXw5ev7GdqOYpNkzvsveoQvyMFgS-qqOrgILCBYQ25v8JzTbCIqCPd9brGQ/s320/anyadirbiblioteca.png" width="320" /></a></div><br /><p>Aquí veréis que una vez detecte el id de nuestra librería nos permitirá seleccionar la versión que tendremos que usar y (muy importante) el nombre que usaremos para el workspace, el identificador.</p><p>Todas las funciones de la biblioteca se llamarán a través de ese identificador. Una vez hemos "instalado" la librería en el nuevo proyecto podemos llamar a la función de la librería usando el nombre del workspace de esta manera:</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> TestSum()
{
<span style="color: #007020; font-weight: bold;">var</span> a <span style="color: #666666;">=</span> [<span style="color: #40a070;">1.0</span>,<span style="color: #40a070;">2.0</span>,<span style="color: #40a070;">3.0</span>];
<span style="color: #007020; font-weight: bold;">var</span> b <span style="color: #666666;">=</span> [<span style="color: #40a070;">3.0</span>,<span style="color: #40a070;">4.0</span>,<span style="color: #40a070;">5.0</span>];
<span style="color: #007020; font-weight: bold;">var</span> c <span style="color: #666666;">=</span> MathLib.VectorSum(a,b);
Logger.log(c);
}
<div class="separator" style="clear: both; text-align: center;"><br /></div></pre></div>
<p>Como podéis ver es una funcionalidad muy potente que nos permite organizar y limpiar el código, poderlo distribuir de una forma sencilla y tener un control bastante mayor sobre nuestras implementaciones.</p><p>Espero que os haya servido, no vacileis en hacerme llegar vuestras dudas.</p><p>Nos vemos!</p><div class="separator" style="clear: both; text-align: center;"><br /></div>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com2tag:blogger.com,1999:blog-3233877562970007107.post-65490438421623563062021-01-27T16:03:00.004+00:002021-02-02T17:52:12.174+00:00Como generar números aleatorios con google apps script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html'> <<<< Como usar Google Apps Scripts en hojas de cálculo</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2021/02/como-crear-una-biblioteca-con-google-apps-script.html'> Como crear una biblioteca con Google Apps Script >>>> </a></li>
</ul>
</div>
<div class='cajaAll'><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html'> Google Apps Script </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-javascript.html'> JavaScript </a></div>
<p>En muchas ocasiones nos puede resultar muy útil generar números aleatorios cuando hacemos nuestros scripts de Google Apps Script: para juegos, para dar cierta aleatoriedad a nuestras respuestas o inventarnos un identificador único para todo aquello que necesitemos. </p><p>Lo que os explicaré hoy no es un sistema criptográficamente seguro de generar números aleatorios con Google Apps Script, solo es una manera de generar números aleatorios de baja calidad estadística ( que para la gran mayoría de nuestros usos va a ser mucho más que suficiente )</p><p>Nuestro sistema se basará en el <b>Math.random</b> que todo lo que hace es generar un float entre 0.0 y 1.0 (este último no incluido). Teniendo este valor entre 0 y 1, podemos multiplicarlo, redondearlo y operarlo como queramos.</p><p>A fin de hacerlo fácil he creado esta función para que podáis tener números aleatorios con Google Apps Script de forma bastante fácil: </p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> GetRandom(min,max)
{
<span style="color: #007020; font-weight: bold;">return</span> <span style="color: #007020;">Math</span>.floor(<span style="color: #007020;">Math</span>.random()<span style="color: #666666;">*</span>(max <span style="color: #666666;">-</span>(min <span style="color: #666666;">-</span><span style="color: #40a070;">1</span>))) <span style="color: #666666;">+</span> min;
}
</pre></div>
<p>Le pasáis el mínimo y el máximo y ya tenéis el número aleatorio que os interesa.</p><p>Si estás aprendiendo Google Apps Script y vienes de lenguajes como C , tal vez una nomenclatura en que al random solo quieres pasarle el numero de elementos a sortear te va mejor. Si ese es el caso, aquí tienes el código: </p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> crand(elements)
{
<span style="color: #007020; font-weight: bold;">return</span> GetRandom(<span style="color: #40a070;">0</span>,elements<span style="color: #666666;">-</span><span style="color: #40a070;">1</span>);
}
</pre></div>
<p>Como podéis ver el código es muy sencillo y fácil de seguir. Recordad que estas funciones no sirven para nada estadísticamente "serio" como por ejemplo criptografía, pero para vuestras pequeñas aplicaciones y juegos este código os irá fenomenal.</p><p>No vaciléis en hacerme llegar vuestras dudas</p><p>Nos vemos</p><p><br /></p><p><br /></p><p><br /></p>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com6tag:blogger.com,1999:blog-3233877562970007107.post-33097752935325578142021-01-23T14:29:00.005+00:002021-02-02T17:50:22.560+00:00Como aprender a multiplicar jugando<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2020/12/como-leer-datos-de-un-webhook-con-google-apps-script.html'> <<<< Como leer datos de un webhook con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-crear-una-web-con-google-apps.html'> Como crear una web con Google Apps Script >>>> </a></li>
</ul>
</div>
<div class='cajaAll'><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html'> Google Apps Script </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-html5.html'> HTML5 </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-ejemplos.html'> Ejemplos </a></div>
<br />
<iframe height="500" src="https://script.google.com/macros/s/AKfycbxuhCuE0VIlqxvRS2mJL5J7QeouTgjzDK0nvputnz-fS0j7FaOtKo0rMQ/exec" title="X Tester" width="500"></iframe><div><br /></div><div>Este sencillo juego esta pensado para ayudar a los niños a aprender las tablas de multiplicar.</div><div><br /></div><div>Se podría haber montado sin necesidad de Google Apps Script, pero creo que como ejemplo puede ser muy interesante y lo podéis usar como base para vuestros proyectos, tiene todo lo necesario para hacer prácticamente cualquier web.</div><div><br /></div><div>Aquí os dejo el código:</div><div><br /></div><div>Index.hmtl</div>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020;"><!DOCTYPE html></span>
<span style="color: #062873; font-weight: bold;"><html></span>
<span style="color: #062873; font-weight: bold;"><head></span>
<span style="color: #062873; font-weight: bold;"><base</span> <span style="color: #4070a0;">target="_top"</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"><style </span><span style="color: #4070a0;">type="text/css"</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;">button</span>
{
<span style="color: #007020; font-weight: bold;">text-decoration</span><span style="color: #666666;">:</span> <span style="color: #007020; font-weight: bold;">none</span>;
<span style="color: #007020; font-weight: bold;">padding</span><span style="color: #666666;">:</span> <span style="color: #40a070;">20px</span>;
<span style="color: #007020; font-weight: bold;">font-weight</span><span style="color: #666666;">:</span> <span style="color: #40a070;">600</span>;
<span style="color: #007020; font-weight: bold;">font-size</span><span style="color: #666666;">:</span> <span style="color: #40a070;">40px</span>;
<span style="color: #007020; font-weight: bold;">color</span><span style="color: #666666;">:</span> <span style="color: #40a070;">#ffffff</span>;
<span style="color: #007020; font-weight: bold;">background-color</span><span style="color: #666666;">:</span> <span style="color: #40a070;">#1883ba</span>;
<span style="color: #007020; font-weight: bold;">border</span><span style="color: #666666;">-</span>radius<span style="color: #666666;">:</span> <span style="color: #40a070;">12px</span>;
<span style="color: #007020; font-weight: bold;">border</span><span style="color: #666666;">:</span> <span style="color: #40a070;">4px</span> <span style="color: #007020; font-weight: bold;">solid</span> <span style="color: #40a070;">#0016b0</span>;
<span style="color: #007020; font-weight: bold;">width</span><span style="color: #666666;">:</span> <span style="color: #40a070;">130px</span>;
}
<span style="color: #062873; font-weight: bold;">button</span><span style="color: #555555; font-weight: bold;">:hover</span>
{
<span style="color: #007020; font-weight: bold;">text-shadow</span><span style="color: #666666;">:</span> <span style="color: #40a070;">1px</span> <span style="color: #40a070;">1px</span> <span style="color: #40a070;">6px</span> <span style="color: #40a070;">#fff</span>;
<span style="color: #007020; font-weight: bold;">border</span><span style="color: #666666;">-</span>shadow<span style="color: #666666;">:</span>
}
<span style="color: #06287e;">#question</span>
{
<span style="color: #007020; font-weight: bold;">width</span><span style="color: #666666;">:</span> <span style="color: #40a070;">600px</span>;
<span style="color: #007020; font-weight: bold;">padding</span><span style="color: #666666;">:</span> <span style="color: #40a070;">10px</span>;
<span style="color: #007020; font-weight: bold;">font-weight</span><span style="color: #666666;">:</span> <span style="color: #40a070;">600</span>;
<span style="color: #007020; font-weight: bold;">font-size</span><span style="color: #666666;">:</span> <span style="color: #40a070;">30px</span>;
<span style="color: #007020; font-weight: bold;">color</span><span style="color: #666666;">:</span> <span style="color: #40a070;">#44ff55</span>;
<span style="color: #007020; font-weight: bold;">background-color</span><span style="color: #666666;">:</span> <span style="color: #40a070;">#f3f3bf</span>;
<span style="color: #007020; font-weight: bold;">border</span><span style="color: #666666;">-</span>radius<span style="color: #666666;">:</span> <span style="color: #40a070;">6px</span>;
<span style="color: #007020; font-weight: bold;">border</span><span style="color: #666666;">:</span> <span style="color: #40a070;">2px</span> <span style="color: #007020; font-weight: bold;">solid</span> <span style="color: #40a070;">#0016b0</span>;
<span style="color: #007020; font-weight: bold;">text-align</span><span style="color: #666666;">:</span><span style="color: #007020; font-weight: bold;">center</span>;
}
<span style="color: #06287e;">#tabla</span>
{
<span style="color: #007020; font-weight: bold;">margin</span><span style="color: #666666;">:</span> <span style="color: #40a070;">10px</span>;
<span style="color: #007020; font-weight: bold;">width</span><span style="color: #666666;">:</span> <span style="color: #40a070;">100px</span>;
<span style="color: #007020; font-weight: bold;">padding</span><span style="color: #666666;">:</span> <span style="color: #40a070;">10px</span>;
<span style="color: #007020; font-weight: bold;">font-weight</span><span style="color: #666666;">:</span> <span style="color: #40a070;">600</span>;
<span style="color: #007020; font-weight: bold;">font-size</span><span style="color: #666666;">:</span> <span style="color: #40a070;">40px</span>;
<span style="color: #007020; font-weight: bold;">color</span><span style="color: #666666;">:</span> <span style="color: #40a070;">#ff4455</span>;
<span style="color: #007020; font-weight: bold;">background-color</span><span style="color: #666666;">:</span> <span style="color: #40a070;">#33f3bf</span>;
<span style="color: #007020; font-weight: bold;">border</span><span style="color: #666666;">-</span>radius<span style="color: #666666;">:</span> <span style="color: #40a070;">6px</span>;
<span style="color: #007020; font-weight: bold;">border</span><span style="color: #666666;">:</span> <span style="color: #40a070;">2px</span> <span style="color: #007020; font-weight: bold;">solid</span> <span style="color: #40a070;">#0016b0</span>;
<span style="color: #007020; font-weight: bold;">text-align</span><span style="color: #666666;">:</span><span style="color: #007020; font-weight: bold;">center</span>;
}
<span style="color: #06287e;">#countdown</span>
{
<span style="color: #007020; font-weight: bold;">margin</span><span style="color: #666666;">:</span> <span style="color: #40a070;">10px</span>;
<span style="color: #007020; font-weight: bold;">width</span><span style="color: #666666;">:</span> <span style="color: #40a070;">50px</span>;
<span style="color: #007020; font-weight: bold;">padding</span><span style="color: #666666;">:</span> <span style="color: #40a070;">10px</span>;
<span style="color: #007020; font-weight: bold;">font-weight</span><span style="color: #666666;">:</span> <span style="color: #40a070;">600</span>;
<span style="color: #007020; font-weight: bold;">font-size</span><span style="color: #666666;">:</span> <span style="color: #40a070;">50px</span>;
<span style="color: #007020; font-weight: bold;">color</span><span style="color: #666666;">:</span> <span style="color: #40a070;">#ff4455</span>;
<span style="color: #007020; font-weight: bold;">background-color</span><span style="color: #666666;">:</span> <span style="color: #40a070;">#fff3bf</span>;
<span style="color: #007020; font-weight: bold;">border</span><span style="color: #666666;">-</span>radius<span style="color: #666666;">:</span> <span style="color: #40a070;">25px</span>;
<span style="color: #007020; font-weight: bold;">border</span><span style="color: #666666;">:</span> <span style="color: #40a070;">2px</span> <span style="color: #007020; font-weight: bold;">solid</span> <span style="color: #40a070;">#ff16b0</span>;
<span style="color: #007020; font-weight: bold;">text-align</span><span style="color: #666666;">:</span><span style="color: #007020; font-weight: bold;">center</span>;
}
<span style="color: #06287e;">#error</span>
{
<span style="color: #007020; font-weight: bold;">margin</span><span style="color: #666666;">:</span> <span style="color: #40a070;">10px</span>;
<span style="color: #007020; font-weight: bold;">width</span><span style="color: #666666;">:</span> <span style="color: #40a070;">400px</span>;
<span style="color: #007020; font-weight: bold;">min-width</span><span style="color: #666666;">:</span> <span style="color: #40a070;">400px</span>;
<span style="color: #007020; font-weight: bold;">padding</span><span style="color: #666666;">:</span> <span style="color: #40a070;">10px</span>;
<span style="color: #007020; font-weight: bold;">font-weight</span><span style="color: #666666;">:</span> <span style="color: #40a070;">600</span>;
<span style="color: #007020; font-weight: bold;">font-size</span><span style="color: #666666;">:</span> <span style="color: #40a070;">50px</span>;
<span style="color: #007020; font-weight: bold;">color</span><span style="color: #666666;">:</span> <span style="color: #40a070;">#ffaabb</span>;
<span style="color: #007020; font-weight: bold;">background-color</span><span style="color: #666666;">:</span> <span style="color: #40a070;">#776655</span>;
<span style="color: #007020; font-weight: bold;">border</span><span style="color: #666666;">-</span>radius<span style="color: #666666;">:</span> <span style="color: #40a070;">25px</span>;
<span style="color: #007020; font-weight: bold;">border</span><span style="color: #666666;">:</span> <span style="color: #40a070;">2px</span> <span style="color: #007020; font-weight: bold;">solid</span> <span style="color: #40a070;">#ff16b0</span>;
<span style="color: #007020; font-weight: bold;">text-align</span><span style="color: #666666;">:</span><span style="color: #007020; font-weight: bold;">center</span>;
}
<span style="color: #06287e;">#accept</span>
{
<span style="color: #007020; font-weight: bold;">margin</span><span style="color: #666666;">:</span> <span style="color: #40a070;">10px</span>;
<span style="color: #007020; font-weight: bold;">width</span><span style="color: #666666;">:</span> <span style="color: #40a070;">400px</span>;
<span style="color: #007020; font-weight: bold;">min-width</span><span style="color: #666666;">:</span> <span style="color: #40a070;">400px</span>;
<span style="color: #007020; font-weight: bold;">padding</span><span style="color: #666666;">:</span> <span style="color: #40a070;">10px</span>;
<span style="color: #007020; font-weight: bold;">font-weight</span><span style="color: #666666;">:</span> <span style="color: #40a070;">600</span>;
<span style="color: #007020; font-weight: bold;">font-size</span><span style="color: #666666;">:</span> <span style="color: #40a070;">50px</span>;
<span style="color: #007020; font-weight: bold;">color</span><span style="color: #666666;">:</span> <span style="color: #40a070;">#aaffbb</span>;
<span style="color: #007020; font-weight: bold;">background-color</span><span style="color: #666666;">:</span> <span style="color: #40a070;">#667744</span>;
<span style="color: #007020; font-weight: bold;">border</span><span style="color: #666666;">-</span>radius<span style="color: #666666;">:</span> <span style="color: #40a070;">25px</span>;
<span style="color: #007020; font-weight: bold;">border</span><span style="color: #666666;">:</span> <span style="color: #40a070;">2px</span> <span style="color: #007020; font-weight: bold;">solid</span> <span style="color: #40a070;">#16ffb0</span>;
<span style="color: #007020; font-weight: bold;">text-align</span><span style="color: #666666;">:</span><span style="color: #007020; font-weight: bold;">center</span>;
}
<span style="color: #062873; font-weight: bold;">audio</span>
{
<span style="color: #007020; font-weight: bold;">display</span><span style="color: #666666;">:</span> <span style="color: #007020; font-weight: bold;">none</span>
}
<span style="color: #062873; font-weight: bold;"></style></span>
<span style="color: #062873; font-weight: bold;"><script></span>
<span style="color: #007020; font-weight: bold;">var</span> end <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Date</span>();
<span style="color: #007020; font-weight: bold;">var</span> process_blocked <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span>;
<span style="color: #007020; font-weight: bold;">function</span> Init()
{
setInterval(showRemaining, <span style="color: #40a070;">1000</span>);
Accept();
}
<span style="color: #007020; font-weight: bold;">function</span> Accept()
{
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"error"</span>).style.visibility <span style="color: #666666;">=</span> <span style="color: #4070a0;">"hidden"</span>;
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"tip"</span>).style.visibility <span style="color: #666666;">=</span> <span style="color: #4070a0;">"hidden"</span>;
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"accept"</span>).style.visibility <span style="color: #666666;">=</span> <span style="color: #4070a0;">"hidden"</span>;
<span style="color: #007020; font-weight: bold;">var</span> now <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Date</span>();
end.setTime( now.getTime() <span style="color: #666666;">+</span> <span style="color: #40a070;">10</span><span style="color: #666666;">*</span><span style="color: #40a070;">1000</span> );
process_blocked <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span>;
}
<span style="color: #007020; font-weight: bold;">function</span> <span style="color: #007020;">Error</span>(error)
{
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"error"</span>).innerHTML <span style="color: #666666;">=</span> error;
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"error"</span>).style.visibility <span style="color: #666666;">=</span> <span style="color: #4070a0;">'visible'</span>;
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"accept"</span>).style.visibility <span style="color: #666666;">=</span> <span style="color: #4070a0;">'visible'</span>;
process_blocked <span style="color: #666666;">=</span> <span style="color: #40a070;">1</span>;
}
<span style="color: #007020; font-weight: bold;">function</span> Response(str)
{
<span style="color: #007020; font-weight: bold;">if</span>(process_blocked)
<span style="color: #007020; font-weight: bold;">return</span>;
<span style="color: #007020; font-weight: bold;">var</span> splitted <span style="color: #666666;">=</span> str.split(<span style="color: #4070a0;">","</span>);
<span style="color: #007020; font-weight: bold;">var</span> msg <span style="color: #666666;">=</span> splitted[<span style="color: #40a070;">0</span>];
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"tabla"</span>).innerHTML <span style="color: #666666;">=</span> msg.split(<span style="color: #4070a0;">"X"</span>)[<span style="color: #40a070;">0</span>].trim();
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"question"</span>).innerHTML <span style="color: #666666;">=</span> msg;
<span style="color: #007020; font-weight: bold;">if</span>(msg.indexOf(<span style="color: #4070a0;">"FINAL"</span>) <span style="color: #666666;">!=</span> <span style="color: #666666;">-</span><span style="color: #40a070;">1</span> )
{
<span style="color: #007020; font-weight: bold;">var</span> audio <span style="color: #666666;">=</span> <span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"audioWIN"</span>);
audio.play();
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"countdown"</span>).style.visibility <span style="color: #666666;">=</span> <span style="color: #4070a0;">'hidden'</span>;
}
<span style="color: #007020; font-weight: bold;">if</span>(splitted.length <span style="color: #666666;">></span> <span style="color: #40a070;">1</span>)
{
<span style="color: #007020; font-weight: bold;">var</span> tab <span style="color: #666666;">=</span> splitted[<span style="color: #40a070;">1</span>];
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"buttons"</span>).innerHTML <span style="color: #666666;">=</span> tab;
}
<span style="color: #007020; font-weight: bold;">if</span>(splitted.length <span style="color: #666666;">></span> <span style="color: #40a070;">2</span>)
{
<span style="color: #007020; font-weight: bold;">var</span> audio <span style="color: #666666;">=</span> <span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"audioFAIL"</span>);
audio.play();
<span style="color: #007020; font-weight: bold;">var</span> error <span style="color: #666666;">=</span> splitted[<span style="color: #40a070;">2</span>];
<span style="color: #007020;">Error</span>(error);
<span style="color: #007020; font-weight: bold;">return</span>;
}
<span style="color: #007020; font-weight: bold;">else</span>
{
<span style="color: #007020; font-weight: bold;">var</span> audio <span style="color: #666666;">=</span> <span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"audioOK"</span>);
audio.play();
}
Accept();
}
<span style="color: #007020; font-weight: bold;">function</span> Push(value)
{
<span style="color: #007020; font-weight: bold;">if</span> (<span style="color: #666666;">!</span>process_blocked)
{
<span style="color: #007020; font-weight: bold;">var</span> question <span style="color: #666666;">=</span> <span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">"question"</span>).innerHTML;
google.script.run.withSuccessHandler(Response).Answer(question,value);
}
<span style="color: #007020; font-weight: bold;">var</span> now <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Date</span>();
end.setTime( now.getTime() <span style="color: #666666;">+</span> <span style="color: #40a070;">10</span><span style="color: #666666;">*</span><span style="color: #40a070;">1000</span> );
}
<span style="color: #007020; font-weight: bold;">function</span> showRemaining()
{
<span style="color: #007020; font-weight: bold;">if</span>( process_blocked)
<span style="color: #007020; font-weight: bold;">return</span>;
<span style="color: #007020; font-weight: bold;">var</span> now <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Date</span>();
<span style="color: #007020; font-weight: bold;">var</span> distance <span style="color: #666666;">=</span> end.getTime() <span style="color: #666666;">-</span> now.getTime();
<span style="color: #007020; font-weight: bold;">if</span> (distance <span style="color: #666666;"><</span> <span style="color: #40a070;">0</span>)
{
Push(<span style="color: #40a070;">0</span>);
<span style="color: #007020; font-weight: bold;">return</span>;
}
<span style="color: #007020; font-weight: bold;">var</span> seconds <span style="color: #666666;">=</span> <span style="color: #007020;">Math</span>.floor(distance<span style="color: #666666;">/</span><span style="color: #40a070;">1000</span>);
<span style="color: #007020;">document</span>.getElementById(<span style="color: #4070a0;">'countdown'</span>).innerHTML <span style="color: #666666;">=</span> seconds;
}
<span style="color: #062873; font-weight: bold;"></script></span>
<span style="color: #062873; font-weight: bold;"></head></span>
<span style="color: #062873; font-weight: bold;"><body</span> <span style="color: #4070a0;">onload="Init()"</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"><audio</span> <span style="color: #4070a0;">id="audioOK"</span> <span style="color: #4070a0;">controls</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"><source</span> <span style="color: #4070a0;">type="audio/wav"</span> <span style="color: #4070a0;">src="https://sampleswap.org/samples-ghost/SOUND%20EFFECTS%20and%20NOISES/VIDEO%20GAMES/carnival/27[kb]ranking.wav.mp3"</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"></audio></span>
<span style="color: #062873; font-weight: bold;"><audio</span> <span style="color: #4070a0;">id="audioFAIL"</span> <span style="color: #4070a0;">controls</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"><source</span> <span style="color: #4070a0;">type="audio/wav"</span> <span style="color: #4070a0;">src="https://sampleswap.org/samples-ghost/SOUND%20EFFECTS%20and%20NOISES/Alarm%20Sounds/81[kb]vidgame-gliss-down.aif.mp3"</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"></audio></span>
<span style="color: #062873; font-weight: bold;"><audio</span> <span style="color: #4070a0;">id="audioWIN"</span> <span style="color: #4070a0;">controls</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"><source</span> <span style="color: #4070a0;">type="audio/wav"</span> <span style="color: #4070a0;">src="https://sampleswap.org/samples-ghost/SOUND%20EFFECTS%20and%20NOISES/VIDEO%20GAMES/carnival/330[kb]bonus1.wav.mp3"</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"></audio></span>
<span style="color: #062873; font-weight: bold;"><p></span> <span style="color: #062873; font-weight: bold;"><a</span> <span style="color: #4070a0;">id='tabla'</span><span style="color: #062873; font-weight: bold;">></span>2<span style="color: #062873; font-weight: bold;"><a><a</span> <span style="color: #4070a0;">id='question'</span><span style="color: #062873; font-weight: bold;">></span>2 X 2 =<span style="color: #062873; font-weight: bold;"><a></span> <span style="color: #062873; font-weight: bold;"><a</span> <span style="color: #4070a0;">id="countdown"</span><span style="color: #062873; font-weight: bold;">></a></p></span>
<span style="color: #062873; font-weight: bold;"><div</span> <span style="color: #4070a0;">id='buttons'</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"><table></span>
<span style="color: #062873; font-weight: bold;"><tr></span>
<span style="color: #062873; font-weight: bold;"><td><button</span> <span style="color: #4070a0;">onclick="Push(2)"</span><span style="color: #062873; font-weight: bold;">></span> 2 <span style="color: #062873; font-weight: bold;"></button></td></span>
<span style="color: #062873; font-weight: bold;"><td><button</span> <span style="color: #4070a0;">onclick="Push(3)"</span><span style="color: #062873; font-weight: bold;">></span> 3 <span style="color: #062873; font-weight: bold;"></button></td></span>
<span style="color: #062873; font-weight: bold;"><td><button</span> <span style="color: #4070a0;">onclick="Push(4)"</span><span style="color: #062873; font-weight: bold;">></span> 4 <span style="color: #062873; font-weight: bold;"></button></td></span>
<span style="color: #062873; font-weight: bold;"></tr></span>
<span style="color: #062873; font-weight: bold;"><tr></span>
<span style="color: #062873; font-weight: bold;"><td><button</span> <span style="color: #4070a0;">onclick="Push(5)"</span><span style="color: #062873; font-weight: bold;">></span> 5 <span style="color: #062873; font-weight: bold;"></button></td></span>
<span style="color: #062873; font-weight: bold;"><td><button</span> <span style="color: #4070a0;">onclick="Push(6)"</span><span style="color: #062873; font-weight: bold;">></span> 6 <span style="color: #062873; font-weight: bold;"></button></td></span>
<span style="color: #062873; font-weight: bold;"><td><button</span> <span style="color: #4070a0;">onclick="Push(7)"</span><span style="color: #062873; font-weight: bold;">></span> 7 <span style="color: #062873; font-weight: bold;"></button></td></span>
<span style="color: #062873; font-weight: bold;"></tr></span>
<span style="color: #062873; font-weight: bold;"></table></span>
<span style="color: #062873; font-weight: bold;"></div></span>
<span style="color: #062873; font-weight: bold;"><div</span> <span style="color: #4070a0;">id='info'</span><span style="color: #062873; font-weight: bold;">></span>
<span style="color: #062873; font-weight: bold;"><p><a</span> <span style="color: #4070a0;">id='error'</span><span style="color: #062873; font-weight: bold;">></span> <span style="color: #062873; font-weight: bold;"></a></span> <span style="color: #062873; font-weight: bold;"></p></span>
<span style="color: #062873; font-weight: bold;"><p><a</span> <span style="color: #4070a0;">id='tip'</span><span style="color: #062873; font-weight: bold;">></span> <span style="color: #062873; font-weight: bold;"></a></span> <span style="color: #062873; font-weight: bold;"></p></span>
<span style="color: #062873; font-weight: bold;"><p><button</span> <span style="color: #4070a0;">id='accept'</span> <span style="color: #4070a0;">onclick="Accept()"</span><span style="color: #062873; font-weight: bold;">></span> OK <span style="color: #062873; font-weight: bold;"></button></p></span>
<span style="color: #062873; font-weight: bold;"></div></span>
<span style="color: #062873; font-weight: bold;"></body></span>
<span style="color: #062873; font-weight: bold;"></html></span>
</pre></div><div><br /></div><br />
<p>Code.gs</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> doGet()
{
<span style="color: #007020; font-weight: bold;">return</span> HtmlService.createTemplateFromFile(<span style="color: #4070a0;">'index'</span>)
.evaluate() <span style="color: #60a0b0; font-style: italic;">// El evaluate siempre debe estar antes del FrameOptions</span>
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
<span style="color: #007020; font-weight: bold;">function</span> getRandomNumber(min, max)
{
<span style="color: #007020; font-weight: bold;">return</span> <span style="color: #007020;">Math</span>.floor( <span style="color: #007020;">Math</span>.random() <span style="color: #666666;">*</span> (max <span style="color: #666666;">-</span> min) <span style="color: #666666;">+</span> min );
}
<span style="color: #007020; font-weight: bold;">function</span> Answer(question, value)
{
<span style="color: #007020; font-weight: bold;">var</span> error <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">false</span>;
<span style="color: #007020; font-weight: bold;">var</span> result <span style="color: #666666;">=</span> <span style="color: #4070a0;">""</span>;
<span style="color: #007020; font-weight: bold;">var</span> items <span style="color: #666666;">=</span> question.split(<span style="color: #4070a0;">"X"</span>);
<span style="color: #007020; font-weight: bold;">var</span> num1 <span style="color: #666666;">=</span> items[<span style="color: #40a070;">0</span>].trim();
<span style="color: #007020; font-weight: bold;">var</span> num2 <span style="color: #666666;">=</span> items[<span style="color: #40a070;">1</span>].split(<span style="color: #4070a0;">"="</span>)[<span style="color: #40a070;">0</span>].trim();
<span style="color: #007020; font-weight: bold;">var</span> old1 <span style="color: #666666;">=</span> num1;
<span style="color: #007020; font-weight: bold;">var</span> old2 <span style="color: #666666;">=</span> num2;
<span style="color: #007020; font-weight: bold;">var</span> expected <span style="color: #666666;">=</span> num1<span style="color: #666666;">*</span>num2;
<span style="color: #007020; font-weight: bold;">if</span>( expected <span style="color: #666666;">==</span> value )
{
num2<span style="color: #666666;">++</span>;
<span style="color: #007020; font-weight: bold;">if</span>(num2 <span style="color: #666666;">></span> <span style="color: #40a070;">9</span>)
{
num1<span style="color: #666666;">++</span>;
num2 <span style="color: #666666;">=</span> <span style="color: #40a070;">2</span>;
<span style="color: #007020; font-weight: bold;">if</span>(num1 <span style="color: #666666;">></span> <span style="color: #40a070;">9</span>)
{
result <span style="color: #666666;">=</span> <span style="color: #4070a0;">"FINAL!!!"</span>;
}
}
}
<span style="color: #007020; font-weight: bold;">else</span>
{
error <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">true</span>;
num2 <span style="color: #666666;">=</span> <span style="color: #40a070;">2</span>;
}
<span style="color: #007020; font-weight: bold;">if</span> ( result <span style="color: #666666;">==</span> <span style="color: #4070a0;">""</span> )
{
result <span style="color: #666666;">=</span> num1 <span style="color: #666666;">+</span> <span style="color: #4070a0;">" X "</span> <span style="color: #666666;">+</span> num2 <span style="color: #666666;">+</span> <span style="color: #4070a0;">" ="</span>;
}
<span style="color: #007020; font-weight: bold;">var</span> desired <span style="color: #666666;">=</span> num1<span style="color: #666666;">*</span>num2;
<span style="color: #007020; font-weight: bold;">var</span> options <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Array</span>();
options.push(desired);
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span> ; i <span style="color: #666666;"><</span> <span style="color: #40a070;">5</span> ; <span style="color: #666666;">++</span>i)
{
<span style="color: #007020; font-weight: bold;">var</span> candidate <span style="color: #666666;">=</span> desired <span style="color: #666666;">+</span> getRandomNumber(<span style="color: #666666;">-</span><span style="color: #40a070;">5</span>,<span style="color: #40a070;">5</span>);
<span style="color: #007020; font-weight: bold;">var</span> ok <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">true</span>;
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> j <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span> ; j <span style="color: #666666;"><</span> options.length <span style="color: #666666;">&&</span> ok ; j<span style="color: #666666;">++</span>)
{
<span style="color: #007020; font-weight: bold;">if</span>( options[j] <span style="color: #666666;">==</span> candidate )
{
i<span style="color: #666666;">--</span>;
ok <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">false</span>;
}
}
<span style="color: #007020; font-weight: bold;">if</span>( ok )
{
options.push( candidate );
}
}
options.sort();
result <span style="color: #666666;">+=</span> <span style="color: #4070a0;">","</span>;
result <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<table>"</span>;
result <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<tr>"</span>;
<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span>;
<span style="color: #007020; font-weight: bold;">for</span>( ; i <span style="color: #666666;"><</span> options.length<span style="color: #666666;">/</span><span style="color: #40a070;">2</span> ; <span style="color: #666666;">++</span>i)
{
result <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<td><button onclick='Push("</span> <span style="color: #666666;">+</span> options[i] <span style="color: #666666;">+</span> <span style="color: #4070a0;">")'> "</span> <span style="color: #666666;">+</span> options[i] <span style="color: #666666;">+</span> <span style="color: #4070a0;">" </button></td>"</span>;
}
result <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"</tr>"</span>;
result <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<tr>"</span>;
<span style="color: #007020; font-weight: bold;">for</span>( ; i <span style="color: #666666;"><</span> options.length ; <span style="color: #666666;">++</span>i)
{
result <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<td><button onclick='Push("</span> <span style="color: #666666;">+</span> options[i] <span style="color: #666666;">+</span> <span style="color: #4070a0;">")'> "</span> <span style="color: #666666;">+</span> options[i] <span style="color: #666666;">+</span> <span style="color: #4070a0;">" </button></td>"</span>;
}
result <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"</tr>"</span>;
result <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"</table>"</span>;
<span style="color: #007020; font-weight: bold;">if</span>(error)
{
result <span style="color: #666666;">+=</span> <span style="color: #4070a0;">","</span> <span style="color: #666666;">+</span> question <span style="color: #666666;">+</span> <span style="color: #4070a0;">" "</span> <span style="color: #666666;">+</span> expected ;
}
<span style="color: #007020; font-weight: bold;">return</span> result;
}
</pre></div><div><br /></div>
No vaciléis en hacerme llegar vuestras propuestas. Si sabéis de algún niño que le cueste aprender las tablas de multiplicar no os lo penséis y probad con este juego<div><br /></div><div>Nos vemos</div>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com0tag:blogger.com,1999:blog-3233877562970007107.post-1219013881543416672021-01-11T23:37:00.002+00:002021-09-08T21:33:00.549+01:00Seleccionar fecha actual al abrir un sheet con Google Apps Script <div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2020/12/omo-cambiar-permisos-de-un-fichero-con-google-apps-script.html'> <<<< Como cambiar permisos de un fichero con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html'> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<div class='cajaAll'><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html'> Google Apps Script </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-scripts-google-sheets.html'> Google Sheets </a><a class='caja' href='https://www.tutorialesgoogleappscripts.com/p/apps-script-javascript.html'> JavaScript </a></div>
En muchas ocasiones nos puede ser útil que se haga una tarea automáticamente al abrir nuestro spreadsheet en referencia al día actual usando Google Apps Script: Marcar ciertas celdas, aplicar formatos, setear textos, etc...<div><br /></div><div>En este ejemplo vamos a montar un sistema que cada día nos seleccione una columna con la fecha actual tal y como podemos ver en este imagen:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUptafJAuzvvjiICQqHfRw55H_zwiVBtGFq_JsoQ6FM-nh-6MVI-TTj3zG2flNQGUSxdxx_ZD_GlmcvcvBMtlwF6sJDX2y0ZvTIUolz5ubwjTbGkjdWTrKF0jWvPJa_nwICq3q2gCArsE/s608/autottimer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Autoselección de columnas" border="0" data-original-height="56" data-original-width="608" height="58" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUptafJAuzvvjiICQqHfRw55H_zwiVBtGFq_JsoQ6FM-nh-6MVI-TTj3zG2flNQGUSxdxx_ZD_GlmcvcvBMtlwF6sJDX2y0ZvTIUolz5ubwjTbGkjdWTrKF0jWvPJa_nwICq3q2gCArsE/w640-h58/autottimer.png" title="Selección de columnas con Google Apps Script" width="640" /></a></div><br /><div><br /></div><div><br />
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> onOpen()
{
MarkToday();
}
<span style="color: #007020; font-weight: bold;">function</span> MarkToday()
{
<span style="color: #007020; font-weight: bold;">var</span> today <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Date</span>();
<span style="color: #007020; font-weight: bold;">var</span> today_day <span style="color: #666666;">=</span> today.getDate();
<span style="color: #007020; font-weight: bold;">var</span> today_month <span style="color: #666666;">=</span> today.getMonth();
<span style="color: #007020; font-weight: bold;">var</span> today_year <span style="color: #666666;">=</span> today.getFullYear();
<span style="color: #007020; font-weight: bold;">var</span> sheet <span style="color: #666666;">=</span> SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
<span style="color: #007020; font-weight: bold;">var</span> range <span style="color: #666666;">=</span> sheet.getRange(<span style="color: #40a070;">1</span>,<span style="color: #40a070;">1</span>,<span style="color: #40a070;">1</span>,sheet.getLastColumn() );
<span style="color: #007020; font-weight: bold;">var</span> caption <span style="color: #666666;">=</span> range.getValues()[<span style="color: #40a070;">0</span>];
<span style="color: #60a0b0; font-style: italic;">//Buscamos el indice de columna que nos concuerda con el dia actual</span>
<span style="color: #007020; font-weight: bold;">var</span> index <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span>;
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span> ; i <span style="color: #666666;"><</span> caption.length ; <span style="color: #666666;">++</span>i)
{
<span style="color: #007020; font-weight: bold;">var</span> d <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Date</span>(caption[i]);
<span style="color: #60a0b0; font-style: italic;">//Compensamos la diferencia horaria entre el servidor de Google y nuestra situación.</span>
<span style="color: #60a0b0; font-style: italic;">//De no compensar esta diferencia nos puede marcar dias diferentes de los reales.</span>
d.setTime( d.getTime() <span style="color: #666666;">+</span> <span style="color: #40a070;">12</span><span style="color: #666666;">*</span><span style="color: #40a070;">60</span><span style="color: #666666;">*</span><span style="color: #40a070;">60</span><span style="color: #666666;">*</span><span style="color: #40a070;">1000</span> );
<span style="color: #007020; font-weight: bold;">if</span>(today_day <span style="color: #666666;">==</span> d.getDate() <span style="color: #666666;">&&</span> today_month <span style="color: #666666;">==</span> d.getMonth() <span style="color: #666666;">&&</span> today_year <span style="color: #666666;">==</span> d.getFullYear())
{
index <span style="color: #666666;">=</span> i<span style="color: #666666;">+</span><span style="color: #40a070;">1</span>;
<span style="color: #007020; font-weight: bold;">break</span>;
}
}
<span style="color: #60a0b0; font-style: italic;">//Eliminamos marcas que pudieramos tener</span>
range.setBackground(<span style="color: #4070a0;">"white"</span>);
<span style="color: #60a0b0; font-style: italic;">//Marcamos el dia actual</span>
sheet.getRange(<span style="color: #40a070;">1</span>,index).setBackground(<span style="color: #4070a0;">"yellow"</span>);
}
</pre></div>
<br /></div><div>Como podéis ver el código no es complicado y se puede adaptar a lo que necesitéis. Se os ocurre alguna otra funcionalidad que se podría aplicar?</div><div><br /></div><div>No vaciléis en hacerme llegar vuestras dudas.</div><div><br /></div><div>Nos vemos</div><div><br /></div><div><br /></div>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com2tag:blogger.com,1999:blog-3233877562970007107.post-46668704239098465972020-12-16T17:31:00.004+00:002021-07-06T18:27:25.286+01:00Como cambiar permisos de un fichero con Google Apps Script<div class="Menu">
<ul id="nav">
<li><a href="https://www.tutorialesgoogleappscripts.com/2020/12/como-detectar-que-el-usuario-ha-anadido-una-nueva-fila-con-google-apps-script.html"> <<<< Como detectar que el usuario ha añadido una nueva linea con Google Apps Script</a></li>
<li><a href="https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html"> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<div class="cajaAll"><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-script-google-apps-script.html"> Google Apps Script </a><a class="caja" href="https://www.tutorialesgoogleappscripts.com/p/apps-script-google-drive.html"> Google Drive </a></div>
<p>En muchas ocasiones nos puede resultar útil poder modificar los permisos de un fichero de Google ( spreadsheets sobre todo ), así como copias para ciertos usuarios , o durante la preparación para distribuir información a un grupo de personas. Con Google Apps Script podemos automatizar de una forma muy sencilla la asignación de permisos a un fichero.</p><p>Primero de todo, hemos de tener claro que toda la gestión se hace a través de DriveApp, es decir, si queremos dar permisos a un spreadsheet o un doc, por ejemplo, primero deberemos obtener su id.</p><p>Ya veréis que es muy sencillo: </p><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> SetPermisos()
{
<span style="color: #007020; font-weight: bold;">var</span> spreadsheet <span style="color: #666666;">=</span> SpreadsheetApp.getActiveSpreadsheet();
<span style="color: #007020; font-weight: bold;">var</span> id <span style="color: #666666;">=</span> spreadsheet.getId();
DriveApp.getFileById(id).setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
}
</pre></div>
<p>El tipo de acceso puede tener diferentes opciones:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_hNQotcGdf6HvdLVcx6yIVONc7rv3PuhniV3_MxJvyHy4Ku9QpfBCO0z_EKzkGtjUZLmxQQKET7ewISnMa0XNG-kPHLx5pFxr-0pzUhgMLtkkti6-qKcg-Cz8NvVDuI0yQ9hClbI1lDs/s437/permisos1.png" style="margin-left: 1em; margin-right: 1em;"><img alt="tipos de acceso google apps script" border="0" data-original-height="97" data-original-width="437" height="142" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_hNQotcGdf6HvdLVcx6yIVONc7rv3PuhniV3_MxJvyHy4Ku9QpfBCO0z_EKzkGtjUZLmxQQKET7ewISnMa0XNG-kPHLx5pFxr-0pzUhgMLtkkti6-qKcg-Cz8NvVDuI0yQ9hClbI1lDs/w640-h142/permisos1.png" title="Tipos de acceso documentos Google" width="640" /></a></div>ANYONE, ANYONE_WITH_LINK,DOMAIN,DOMAIN_WITH_LINK, PRIVATE<div><br /></div><div>De la misma manera podemos asignar diferentes tipos de permisos:<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnllystIKpGODB1nQwQMZ__yk4DWNB78h1MAtEAtcXhvQkQyiJZQEb4qjgBwiXGPrqoOXGjvhmd0_qQAMa502HyFUluK3YkTBM4OWIm29fqDGZJgZfPexdK5LMnr7JXY8m2KOYoGb8oyg/s405/permisos2.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Tipos de permisos Google Apps Script" border="0" data-original-height="131" data-original-width="405" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnllystIKpGODB1nQwQMZ__yk4DWNB78h1MAtEAtcXhvQkQyiJZQEb4qjgBwiXGPrqoOXGjvhmd0_qQAMa502HyFUluK3YkTBM4OWIm29fqDGZJgZfPexdK5LMnr7JXY8m2KOYoGb8oyg/w640-h208/permisos2.png" title="Tipos de permisos documentos de Google" width="640" /></a></div>COMMENT, EDIT, FILE_ORGANIZER,NONE,ORGANIZER,OWNER,VIEW<br /><p><br /></p><p>Como veis es muy sencillo cambiar permisos de un fichero de Drive con Google Apps Script.</p><p>Si lo que necesitas es cambiar permisos en todo un árbol de carpetas, tal vez puede interesarte este otro artículo que te enseñará a <a href="https://www.tutorialesgoogleappscripts.com/2021/07/como-cambiar-permisos-de-forma-recursiva-con-google-apps-script.html" target="_blank">cambiar permisos de forma recursiva con Google Apps Script</a></p><p>No vaciléis en hacerme llegar vuestras dudas</p><p>Nos vemos!</p><p><br /></p><p><br /></p><p><br /></p></div>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com3tag:blogger.com,1999:blog-3233877562970007107.post-37414897882062350322020-12-13T18:15:00.000+00:002020-12-13T18:15:02.879+00:00Como leer datos de un webhook con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2020/10/como-comunicar-javascript-con-google-apps-script.html'> <<<< Como comunicar JavaScript con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-crear-una-web-con-google-apps.html'> Como crear una web con Google Apps Script >>>> </a></li>
</ul>
</div>
<br />
<p>Una aplicación bastante interesante de Google Apps Script es recibir callbacks de un WebHook. Un WebHook básciametne es un servicio web que atacará a la url que nosotros le digamos ( generalmente haciendo un POST ) cuando pase un cierto evento.</p><p>Es decir, un webhook nos informará de eventos que pasen en algún servicio externo: pagos recibidos, mensajes pendientes, errores en servicios, etc....</p><p>Ahora bien, una cosa que no está demasiado bien documentada y que siempre trae algún quebradero de cabeza es como obtener la información del callback. La solución es fácil, salvo que nos indiquen lo contrario el webhook llamará a nuestra url con un método POST cuyo payload será un JSON con la información que necesitamos. Cada servicio implementará su protocolo y su forma de enviar la información dentro del JSON, pero lo básico es lo que os acabo de explicar.</p><p>Así pues el código para procesar esa llamada es extremadamente fácil:</p><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> doPost(e)
{
<span style="color: #007020; font-weight: bold;">var</span> jsonString <span style="color: #666666;">=</span> e.postData.getDataAsString();
<span style="color: #007020; font-weight: bold;">var</span> data <span style="color: #666666;">=</span> JSON.parse(jsonString);
<span style="color: #60a0b0; font-style: italic;">// AQUI VA TU GESTION</span>
}
</pre></div>
<p>Con esté código ya tenéis la estructura básica para saber como procesar los JSON que nos vengan de un webhook. Si algo no lo tenéis claro os recomiendo que reviséis mi post sobre <a href="https://www.tutorialesgoogleappscripts.com/2020/11/como-usar-json-con-google-apps-script.html" target="_blank">como trabajar con JSON en Google Apps Script</a></p><p>No vaciléis en hacerme llegar cualquier duda que tengáis.</p><p>Nos vemos</p><p><br /></p><p><br /></p>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com0tag:blogger.com,1999:blog-3233877562970007107.post-2788657436539834872020-12-04T18:01:00.003+00:002021-07-19T09:51:30.319+01:00Como detectar una nueva línea con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2020/12/como-convertir-indices-de-columna-a-letras-con-google-apps-script.html'> <<<< Como convertir índices de columna a letras con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html'> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<br />
<p>En muchas ocasiones nos puede resultar muy útil usar Google Apps Script para saber cuando alguien inserta una nueva fila. Ya sea Zapier generando una nueva fila, otro script que tengamos o que el mismo usuario inserten una nueva fila, con el código que os enseñaré podréis detectar este hecho y hacer lo que necesitéis (cambiar formatos de celdas, setear timestamps, crear logs, etc...)</p><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> CrearTriggerOnChange()
{
<span style="color: #007020; font-weight: bold;">var</span> sheet <span style="color: #666666;">=</span> SpreadsheetApp.getActive();
ScriptApp.newTrigger(<span style="color: #4070a0;">"onChange"</span>)
.forSpreadsheet(sheet)
.onChange()
.create();
}
<span style="color: #007020; font-weight: bold;">function</span> onChange(e)
{
<span style="color: #007020; font-weight: bold;">if</span>(e.changeType<span style="color: #666666;">==</span><span style="color: #4070a0;">"INSERT_ROW"</span>)
{
SpreadsheetApp.getUi().alert(<span style="color: #4070a0;">"Se ha insertado una fila nueva"</span>);
}
}
</pre></div>
<p>Usamos el evento onChange (parecido, pero diferente al evento onEdit) para detectar cuando alguien inserta una nueva fila. Este evento tiene muchos más usos, pero por ahora, con este ya podemos hacer.</p><p>En el ejemplo concreto que os muestro lo que ocurre es que cada vez que alguien cree una nueva fila aparecerá un mensaje informando que se ha creado una nueva fila, algo de este estilo:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC2hmn5yd_no2WamH8-nsC8WWawoV_HzrHSbHxZFyHFwvZBB6MsTFmjsNvGDJ_bEus872ddqvJsHqR3a9cpe3HUvS284-v_R0hVG7JaRXxxTmdr9oh2A-9x_FhOAqGEshi7GW3yLBpPmc/s500/newrow.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Como detectar una nueva fila con Google Apps Script" border="0" data-original-height="230" data-original-width="500" height="294" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC2hmn5yd_no2WamH8-nsC8WWawoV_HzrHSbHxZFyHFwvZBB6MsTFmjsNvGDJ_bEus872ddqvJsHqR3a9cpe3HUvS284-v_R0hVG7JaRXxxTmdr9oh2A-9x_FhOAqGEshi7GW3yLBpPmc/w640-h294/newrow.png" title="Mensaje informativo cuando alguien añade una nueva fila" width="640" /></a></div><br /><p>En otros artículos os explicaré más usos del onChange.</p><p>Solo un último detalle. Al contrario del evento onEdit, el evento de onChange es necesario instalarlo. Es por ello que os he dejado la función de CrearTriggerOnChange. La tendréis que ejecutar una vez para que se instale el trigger ( solo una vez :) ). Si lo necesitáis tengo otro artículo que explica muy claramente como funcionan los <a href="https://www.tutorialesgoogleappscripts.com/2020/09/como-crear-triggers-con-google-apps-script.html" target="_blank">triggers</a></p><p>No vaciléis en hacerme llegar vuestras dudas</p><p>Nos vemos</p><p><br /></p><p><br /></p><p><br /></p><p><br /></p>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com0tag:blogger.com,1999:blog-3233877562970007107.post-84321082869112550782020-12-03T18:20:00.001+00:002020-12-13T18:20:54.327+00:00Como convertir índices de columna a letras con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2020/11/como-hacer-un-timestamp-cuando-alguien-modifica-una-celda-con-google-apps-script.html'> <<<< Como hacer un timestamp cuando alguien modifica una celda con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2020/12/como-detectar-que-el-usuario-ha-anadido-una-nueva-fila-con-google-apps-script.html'> Como detectar que el usuario ha añadido una nueva linea con Google Apps Script >>>> </a></li>
</ul>
</div>
<br />
Un problema que podemos tener a veces cuando programamos en Google Apps Script es que trabajamos con índices de columna pero necesitamos las columnas en notación con letras (por ejemplo cuando queremos construir fórmulas de forma dinámica) y esta conversión no es fácil.<div><br /></div><div>El código que os dejo a continuación se encarga de hacer esa conversión. Si lo miráis con detenimiento veréis como funciona. Básicamente convierte directamente cada índice con la letra del abecedario que le toca (1-> A, 2-> B, etc...). En el supuesto que el índice sea superior a la letra Z se convertirá lo que se pueda y se generarán las próximas letras de forma cíclica :<div><br /></div>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> ConvertirIndiceALetra(column, row)
{
<span style="color: #007020; font-weight: bold;">var</span> temp, letra <span style="color: #666666;">=</span> <span style="color: #4070a0;">''</span>;
<span style="color: #007020; font-weight: bold;">var</span> first_index <span style="color: #666666;">=</span> <span style="color: #007020;">String</span>(<span style="color: #4070a0;">'A'</span>).charCodeAt(<span style="color: #40a070;">0</span>);
<span style="color: #007020; font-weight: bold;">var</span> last_index <span style="color: #666666;">=</span> <span style="color: #007020;">String</span>(<span style="color: #4070a0;">'Z'</span>).charCodeAt(<span style="color: #40a070;">0</span>);
<span style="color: #007020; font-weight: bold;">var</span> num_letras <span style="color: #666666;">=</span> last_index <span style="color: #666666;">-</span> first_index;
<span style="color: #007020; font-weight: bold;">while</span> (column <span style="color: #666666;">></span> <span style="color: #40a070;">0</span>)
{
temp <span style="color: #666666;">=</span> (column <span style="color: #666666;">-</span> <span style="color: #40a070;">1</span>) <span style="color: #666666;">%</span> num_letras;
letra <span style="color: #666666;">=</span> <span style="color: #007020;">String</span>.fromCharCode(temp <span style="color: #666666;">+</span> first_index) <span style="color: #666666;">+</span> letra;
column <span style="color: #666666;">=</span> (column <span style="color: #666666;">-</span> temp <span style="color: #666666;">-</span> <span style="color: #40a070;">1</span>) <span style="color: #666666;">/</span> num_letras;
}
<span style="color: #007020; font-weight: bold;">return</span> letra <span style="color: #666666;">+</span> row;
}
</pre></div>
<div><br /></div><div>Aquí tenéis un ejemplo de como queda:</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRE2tyUVXoOiBHeQ0dld6sdb-E3C_9OyheMF1Uufiv1bxT5fRyFn1BYl00Uye9tTdOJeojmkJoCTO9p0OWcx2Fyp6SvKUjYCSjLNupS-GEJ9GRj_5UfY_dy1keMP5J8ftZLWzBcZ6z5Ls/s474/convertirletra.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Tabla de ejemplos de conversión a letras" border="0" data-original-height="474" data-original-width="281" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRE2tyUVXoOiBHeQ0dld6sdb-E3C_9OyheMF1Uufiv1bxT5fRyFn1BYl00Uye9tTdOJeojmkJoCTO9p0OWcx2Fyp6SvKUjYCSjLNupS-GEJ9GRj_5UfY_dy1keMP5J8ftZLWzBcZ6z5Ls/w380-h640/convertirletra.png" title="Conversión índices a columnas" width="380" /></a></div><br /><div><br /></div><div>Espero que os sirva, no vaciléis en hacerme llegar cualquier duda.</div></div>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com0tag:blogger.com,1999:blog-3233877562970007107.post-38763991127510283262020-11-24T18:17:00.004+00:002021-07-06T23:37:40.277+01:00Como hacer un timestamp con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2020/11/como-enviar-correo-cuando-alguien-rellena-un-formulario-con-google-apps-script.html'> <<<< Como enviar correo cuando alguien rellena un formulario con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html'> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<br />
Una aplicación muy sencilla pero útil de Google Apps Script en el ámbito empresarial es montar un sistema que nos permita tener un timestamp de cuando alguien modifica una celda.<div><br /></div><div>Utilizaremos el evento onEdit y nos limitaremos a apuntar la fecha actual en la primera columna del spreadsheet cuando se haga alguna modificación en alguna de las filas del documento.</div><div><br /></div><div>El código para hacer esto es muy sencillo:</div><div><br /></div>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> onEdit(e)
{
<span style="color: #007020; font-weight: bold;">var</span> range <span style="color: #666666;">=</span> e.range;
<span style="color: #007020; font-weight: bold;">var</span> sheet <span style="color: #666666;">=</span> range.getSheet();
<span style="color: #007020; font-weight: bold;">var</span> row <span style="color: #666666;">=</span> range.getRow();
<span style="color: #007020; font-weight: bold;">var</span> col <span style="color: #666666;">=</span> range.getColumn();
<span style="color: #007020; font-weight: bold;">if</span>(col <span style="color: #666666;">></span> <span style="color: #40a070;">1</span> <span style="color: #666666;">&&</span> row <span style="color: #666666;">></span> <span style="color: #40a070;">1</span>)
{
sheet.getRange(row,<span style="color: #40a070;">1</span>).setValue(<span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Date</span>());
}
}
</pre></div>
<div><br /></div><div>Si os fijáis en el código hemos hecho, la primera fila ( las cabeceras) y la primera columna ( donde tenemos los timestamps) no aplican para el cálculo de tiempo. Podéis poner las limitaciones que queráis.</div><div><br /></div><div>Así es como se vería el resultado:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5dSahnV3aNbJVf9ZHupvucTubh1_wr8MSCM8ibkJFKrCTS1D3bnfpoXVeg58Pw_pmEHS13QAldFO1wRo85po-ZHXK2X5AkAhWDTI2XssawBhdzW83mVo2ZIGWtsQYuyfS8LpRMSo8u9A/s625/timestamp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="timestamp con Google Apps Script" border="0" data-original-height="216" data-original-width="625" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5dSahnV3aNbJVf9ZHupvucTubh1_wr8MSCM8ibkJFKrCTS1D3bnfpoXVeg58Pw_pmEHS13QAldFO1wRo85po-ZHXK2X5AkAhWDTI2XssawBhdzW83mVo2ZIGWtsQYuyfS8LpRMSo8u9A/w640-h222/timestamp.png" title="TimeStamp en un spreadsheet" width="640" /></a></div><br /><div><br /></div><div>Una cosa que no se puede hacer en este código ( seguro que muchos lo querríais :) ) es apuntar quien ha hecho la modificación. El motivo es por que el onEdit trabaja sin permisos ( nadie tiene que dar permisos al script para funcionar ) así que no podemos obtener el usuario actual por que no le hemos pedido que nos otorgue esa capacidad.</div><div><br /></div><div>Espero que os sirva!</div><div><br /></div><div>Nos vemos</div><div><br /></div><div><br /></div>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com0tag:blogger.com,1999:blog-3233877562970007107.post-55573397352214809892020-11-23T21:52:00.003+00:002021-02-03T17:52:43.135+00:00Notificación cuando alguien rellena un formulario con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2020/11/diferencias-entre-getvalues-y-getdisplayvalues-con-google-apps-script.html'> <<<< Diferencias entre getValues y getDisplayValues en Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html'> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<br />
Una cosa que a veces puede ir muy bien es que cada vez que alguien responda a un formulario se pueda <a href="https://www.tutorialesgoogleappscripts.com/2020/09/como-enviar-una-plantilla-html-por-email-con-google-apps-script.html" target="_blank">enviar un correo</a> a "alguien" con cierta información de la respuesta. Ese alguien puede ser un administrador, un gestor, o el mismo que ha enviado la respuesta. La información que enviemos puede ser lo que queramos: un resumen de las respuestas, un <a href="https://www.tutorialesgoogleappscripts.com/2020/10/como-generar-un-pdf-y-enviarlo-por-email-con-google-apps-script.html" target="_blank">PDF</a>, el acceso a una carpeta de Drive,etc...<div><br /></div><div>Con Google Apps Script podemos enviar un correo cuando alguien hace un submit en un GoogleForm y lo mejor de todo, es que hacerlo es muy sencillo!</div><div><br /></div><div>Aquí tenéis el código:</div><br />
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> InstallTrigger()
{
<span style="color: #007020; font-weight: bold;">var</span> spreadsheet <span style="color: #666666;">=</span> SpreadsheetApp.getActiveSpreadsheet();
<span style="color: #007020; font-weight: bold;">var</span> triggers <span style="color: #666666;">=</span> ScriptApp.getUserTriggers(spreadsheet);
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> t <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span> ; t <span style="color: #666666;"><</span> triggers.length ; <span style="color: #666666;">++</span>t )
{
ScriptApp.deleteTrigger(triggers[t]);
}
ScriptApp.newTrigger(<span style="color: #4070a0;">"SendMessageWhenSubmit"</span>)
.forSpreadsheet(spreadsheet.getId())
.onFormSubmit()
.create();
}
<span style="color: #007020; font-weight: bold;">function</span> SendMessageWhenSubmit(e)
{
<span style="color: #007020; font-weight: bold;">var</span> values <span style="color: #666666;">=</span> e.values;
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span> ; i <span style="color: #666666;"><</span> values.length ; <span style="color: #666666;">++</span>i)
{
<span style="color: #007020; font-weight: bold;">if</span>(values[i] <span style="color: #666666;">==</span> <span style="color: #4070a0;">"yes"</span> <span style="color: #666666;">||</span> values[i] <span style="color: #666666;">==</span> <span style="color: #4070a0;">"Yes"</span> <span style="color: #666666;">||</span> values[i] <span style="color: #666666;">==</span> <span style="color: #4070a0;">"YES"</span>)
{
SendMessage();
<span style="color: #007020; font-weight: bold;">break</span>;
}
}
}
<span style="color: #007020; font-weight: bold;">function</span> SendMessage()
{
<span style="color: #007020; font-weight: bold;">var</span> html <span style="color: #666666;">=</span> <span style="color: #4070a0;">"<html>"</span>;
html <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<body>"</span>;
html <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<h1>Report</h1>"</span>;
html <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"<p>Test</p>"</span>;
html <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"</body>"</span>;
html <span style="color: #666666;">+=</span> <span style="color: #4070a0;">"</html>"</span>;
<span style="color: #007020; font-weight: bold;">var</span> title <span style="color: #666666;">=</span> <span style="color: #4070a0;">"Titulo de ejemplo"</span>;
MailApp.sendEmail(<span style="color: #4070a0;">"bablablabl@gmail.com"</span>, title, <span style="color: #4070a0;">''</span>, {
name<span style="color: #666666;">:</span> title,
subject<span style="color: #666666;">:</span> <span style="color: #4070a0;">"Report"</span>,
htmlBody<span style="color: #666666;">:</span> html,
<span style="color: #60a0b0; font-style: italic;">// attachments: [pdfFile.getAs(MimeType.PDF)] //Aqui pondriamos los adjuntos si los necesitaramos</span>
});
}
</pre></div>
<br /><div>El trigger que nos informará de cuando alguien ha rellenado un formulario es un <a href="https://www.tutorialesgoogleappscripts.com/2020/09/como-crear-triggers-con-google-apps-script.html" target="_blank">trigger instalable</a> . Si ejecutais els InstallTriggers todo el trabajo lo tendreis hecho.</div><div><br /></div><div>La función SendMessageWhenSubmit será llamada cuando alguien responda al formulario con el parámetro e que contendrá la información de la respuesta. En este ejemplo concreto enviaremos un correo cuando alguien responda a alguna pregunta con un "yes", pero la condición la podríamos hacer como quisiéramos.</div><div><br /></div><div>Como podéis observar el código es muy sencillo y es extremadamente fácil de adaptar a lo que necesitéis.</div><div><br /></div><div>No vaciléis en hacerme llegar vuestras dudas.</div><div><br /></div><div>Nos vemos!</div><div><br /></div><div><br /></div>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com2tag:blogger.com,1999:blog-3233877562970007107.post-19170364276829282422020-11-22T17:26:00.001+00:002021-07-19T09:56:34.076+01:00getValues vs getDisplayValues en Google Apps Script<div class="Menu">
<ul id="nav">
<li><a href="https://www.tutorialesgoogleappscripts.com/2020/11/como-filtrar-filas-usando-filter-con-google-apps-script.html"> <<<< Como filtrar filas usando filter con Google Apps Script</a></li>
<li><a href="https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html"> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<br />
<p> Generalmente cuando queremos <a href="https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html" target="_blank">leer un hoja de cálculo con Google Apps Script</a> usamos la función getValues del range. Esto en casi todos lo casos funciona como esperamos , pero hay ciertos casos en los que nos puede dar problemas, sobretodo cuando hablamos de datos formateados ( por ejemplo fechas o monedas)</p><p>El caso de las fechas en Google Sheets es paradigmático. Podemos ver un ejemplo en la siguiente imagen, todas las celdas tienen el mismo valor pero su representación es claramente diferente en cada celda por que depende del formato:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWYgWFc30bD18_e5Xvl9zOs4P31oHc2sp_gGXbvZBppJpDxZxHl0r4pTvlNLlJG0eaZN_H3EmZZGDm-xzgnEoRBor47-KT9m8zbjN_6uGsa-vTCASCrYL_w-r0s0u41kl62yKnUhJda0o/s286/getDisplayValues.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Diferencias de formato con celdas con los mismo valores" border="0" data-original-height="205" data-original-width="286" height="459" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWYgWFc30bD18_e5Xvl9zOs4P31oHc2sp_gGXbvZBppJpDxZxHl0r4pTvlNLlJG0eaZN_H3EmZZGDm-xzgnEoRBor47-KT9m8zbjN_6uGsa-vTCASCrYL_w-r0s0u41kl62yKnUhJda0o/w640-h459/getDisplayValues.png" title="Mismo valores, diferentes visualizaciones" width="640" /></a></div><br /><p>Lo gracioso de estas celdas es que si obtienes los valores con <b>getValues </b>obtendremos siempre el mismo valor. Si queremos obtener el valor tal y como se ve en la celda tendremos que usar la función <b>getDisplayValues.</b></p><p>Para hacer la prueba podemos usar este código:</p><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> TestDisplayValues()
{
<span style="color: #007020; font-weight: bold;">var</span> sheet <span style="color: #666666;">=</span> SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
<span style="color: #007020; font-weight: bold;">var</span> range <span style="color: #666666;">=</span> sheet.getDataRange();
<span style="color: #007020; font-weight: bold;">var</span> values <span style="color: #666666;">=</span> range.getValues();
<span style="color: #007020; font-weight: bold;">var</span> display_values <span style="color: #666666;">=</span> range.getDisplayValues();
sheet.getRange(<span style="color: #40a070;">1</span>, <span style="color: #40a070;">2</span>, values.length, values[<span style="color: #40a070;">0</span>].length).setValues(values);
sheet.getRange(<span style="color: #40a070;">1</span>, <span style="color: #40a070;">3</span>, display_values.length, display_values[<span style="color: #40a070;">0</span>].length).setValues(display_values);
}
</pre></div>
<p>Básicamente este código obtiene un rango y copia en otras columnas lo que obtenemos con el getValues y con el getDisplayValues.</p><p>Este es el resultado:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-k6BwpIFwArzN4J24DVDnUlMriy8gZTj2Wwp9coJObuKjNhZSpk-KRiKKt8Epy_NhTbJN3kzrOX-gLWk5KaPMY2gPK_8oXxYUiXAZuIjAb9gikC6dFFP6P4yUnKHz0grVo-XmUlJCKjg/s669/displayvalues.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Diferencias entre getValue y getDisplayValues" border="0" data-original-height="186" data-original-width="669" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-k6BwpIFwArzN4J24DVDnUlMriy8gZTj2Wwp9coJObuKjNhZSpk-KRiKKt8Epy_NhTbJN3kzrOX-gLWk5KaPMY2gPK_8oXxYUiXAZuIjAb9gikC6dFFP6P4yUnKHz0grVo-XmUlJCKjg/w640-h178/displayvalues.png" title="Cuando usar getDisplayValues" width="640" /></a></div><br /><p>Como podéis ver en la columna B hemos puesto los valores que vienen del getValues, mientras que lo que hay en la columna C hay los valores que vienen del getDisplayValues.</p><p>Es un tema bastante más complejo de lo que puede parecer en un inicio, no vaciléis en hacerme llegar vuestras dudas.</p><p>Nos vemos</p><p><br /></p><p><br /></p><p><br /></p>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com4tag:blogger.com,1999:blog-3233877562970007107.post-36400475610095108292020-11-18T16:19:00.002+00:002020-11-18T16:19:41.409+00:00Como filtrar filas usando filter con Google Apps Script<div class='Menu'>
<ul id='nav'>
<li><a href='https://www.tutorialesgoogleappscripts.com/2020/11/como-eliminar-un-caracter-de-un-spreadsheet-con-google-apps-script.html'> <<<< Como eliminar un carácter de un spreadsheet con Google Apps Script</a></li>
<li><a href='https://www.tutorialesgoogleappscripts.com/2015/02/como-leer-una-hoja-de-calculo-con.html'> Como leer una hoja de calculo con Google Apps Scripts >>>> </a></li>
</ul>
</div>
<br />
<p> Una operación muy común cuando programamos con Google Apps Script es filtrar filas. Obtenemos todas las filas de una hoja y nos quedamos solo con aquellas que nos interesan: las que tiene un cierto valor en una columna en concreto, las que tienen vacía cierta celda, etc...</p><p>Implementar un código con Google Apps Script que filtre filas es bastante fácil. De hecho sería algo como esto:</p>
<!--HTML generated using hilite.me--><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> FilterRows(values)
{
<span style="color: #007020; font-weight: bold;">var</span> out <span style="color: #666666;">=</span> <span style="color: #007020; font-weight: bold;">new</span> <span style="color: #007020;">Array</span>();
<span style="color: #007020; font-weight: bold;">for</span>(<span style="color: #007020; font-weight: bold;">var</span> i <span style="color: #666666;">=</span> <span style="color: #40a070;">0</span> ; i <span style="color: #666666;"><</span> values.length ; <span style="color: #666666;">++</span>i)
{
<span style="color: #007020; font-weight: bold;">var</span> row <span style="color: #666666;">=</span> values[i];
<span style="color: #007020; font-weight: bold;">if</span>( row[<span style="color: #40a070;">0</span>] <span style="color: #666666;">==</span> <span style="color: #4070a0;">"A"</span> )
{
out.push(row);
}
}
<span style="color: #007020; font-weight: bold;">return</span> out;
}
</pre></div>
<p>Fàcil no? Recibe un array (como por ejemplo el que podríamos obtener de un range.getValues() ) y revisa fila por fila la condición que nos interese (en nuestro caso, solo nos quedaremos con las filas cuya primera celda sea una "A"). Lo que devolverá la función será un array con solamente las filas que nos interesan.</p><p>El código es eficiente, funciona bien y no da problemas, pero... son bastantes líneas de código que en ciertos proyectos pueden llegar a molestar.</p><p>Solución? Utilizar la función filter que nos da JavaScript y que podemos usar sin problemas dentro de Google Apps Script. </p><p>El código quedaría tal que así:</p><div style="background: rgb(240, 240, 240); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #007020; font-weight: bold;">function</span> FilterRow(values)
{
<span style="color: #007020; font-weight: bold;">return</span> values.filter(row <span style="color: #666666;">=></span> row[<span style="color: #40a070;">0</span>] <span style="color: #666666;">==</span> <span style="color: #4070a0;">'A'</span>);
}
</pre></div>
<p>Antes que recordad que <b>values </b>una matriz de datos que representa la información de un sheet, es decir, es un array de arrays de datos. Cada elemento de <b>values </b>es una fila de información.</p><p><b>.filter</b> es una funcionalidad de los arrays de Java(GoogleApps)Script que devuelve solo los elementos del array que cumplan la condición que se le da</p><p>En est caso <b>row </b>es la variable de iteración, es decir, la variable que usará el <b>filter </b>para comprobar si se acepta o no ese elemento.</p><p>El formato de la condición de <b>filter </b>siempre será el mismo: var => condicion</p><p><b><br /></b></p><p><b>Que es mejor?</b></p><p>A nivel de rendimiento , es más o menos lo mismo, he hecho bastantes pruebas y no sabría decir cual sería una mejor opción ( al menos en Google Apps Script). Ambas opciones son bastante comparables.</p><p>Ahora bien, a nivel de calidad de código, usar filter nos permite reducir muchísimas líneas de código, de hecho, eliminar funciones directamente por que nos permitiría tener el código más compacto sin tener que ir creando funciones.</p><p>Hacedlo como queráis, pero yo personalmente os aconsejaría que usarais el filter. A la que lo hayáis hecho un par de veces lo veréis mucho más natural y las ventajas que da en el mantenimiento del código son evidentes.</p><p>Espero que os haya servido de ayuda. </p><p>Nos vemos!</p><p><br /></p><p><br /></p><p><br /></p><p><br /></p>LordPakushttp://www.blogger.com/profile/10396031062672881371noreply@blogger.com2