jueves, 17 de diciembre de 2020

Insertar logo en pestaña (código y proceso extraño)

Estoy haciendo una aplicación para crear actas y necesito que en la pestaña de cada acta aparezca como encabezado el logo del centro.

Quiero, además, que la imagen del logo esté en drive.

Como cada pestaña con cada acta se crea por código, no me vale el menú insertar-imagen-en celda, ya que, que yo sepa, no hay forma de hacerlo desde código.

Pero si puedo utilizar la función "image(url;[]) 

Pero la url que nos da drive de una imagen, utilizando "conseguir enlace" no funciona con esta función. 

Me funciona, sin embargo, la combinación de https://drive.google.com/uc?export=view&id= con el id de cada imagen.

Para hacerle la vida más fácil al usuario, le pido la url de "conseguir enlace" y mediante este trozo de código la convierto al tipo de enlace que he descrito en el anterior párrafo:

  

  var herramienta = SpreadsheetApp.getActiveSpreadsheet()

  var imagen_url = herramienta.getRangeByName('imagen').getValue()
  var imagen_primera_parte = "https://drive.google.com/uc?export=view&id="       
  var imagen_id imagen_url.match(/[-\w]{25,}/)
  var imagen = imagen_primera_parte+imagen_id

pestana.getRange('A1').setValue('=image("'+imagen+'";1)')

 

El código funciona perfectamente: desde la url extrae el id de la imagen y después la añade al enlace especial. Con la última fila del código, insertamos la imagen en la celda A1 con la función image.


Pero, me he encontrado con la SORPRESA que hay veces que la imagen aparece y otras que no.

Después de investigar y probar diferentes situaciones, me he encontrado con que aparece siempre la imagen si utilizamos un proceso muy particular.

 El proceso funciona así:

  1. Debemos subir la imagen desde el ordenador
  2. Debemos darle permiso público a la imagen(cualquiera con el enlace)

Sorprendentemente, no me ha funcionado con imágenes que ya estaban de antemano en mi Drive y, por supuesto, ninguna imagen que no tenga dado el permiso público de antemano.

lunes, 30 de noviembre de 2020

Regexmatch (Comportamiento extraño de la fórmula?!)

¡Cuidado con el orden de los datos en la fórmula!

El resultado no es el mismo

La formula regexmatch la traducimos así:  Resultado de(texto donde se busca; texto a buscar)

 Hay que tener claro  que en la primera parte se define "donde" "dentro de" 

Y en la segunda parte el "que"

Os planteo un caso real en la herramienta de reservas del aula de informática en un centro con horario tanto de mañana como de tarde. Esto es importante ya que las horas a reservar van desde las 8:30 a las 20:30

Vamos a ver si ( 18:30; todas las horas) nos da dos resultados: 8:30 y 18:30

En este busca cada hora del día si cabe en "18:30" y encuentra que tanto 8:30 como 18:30 caben

Pero, al revés, ( todas las horas; 18:30) nos da solamente 18:30

En este caso busca la hora 18:30 si cabe en alguna hora del día y solamente encuentra 18:30

En resumen: 

El orden de los parámetros de la fórmula es al revés de como lo formulamos, primero en donde buscamos y, segundo el qué.


jueves, 1 de octubre de 2020

Conseguir el enlace para poder editar una respuesta de formulario (Más sencillo)

   Para conseguir editar una respuesta mandada por formulario, podemos guardar la url en la hoja de cálculo con este pequeño código

 

 var herramienta = SpreadsheetApp.getActiveSpreadsheet() 

  var pestana_datos = herramienta.getRangeByName('datos').getSheet() // Hemos creado un intervalo con nombre en dicha pestaña, llamado datos, evitamos el problema de cambio de nombre a la pestaña

  var ultima_fila = pestana_datos.getRange('A1').setValue('=filter(row(a2:a);a2:a=max(a2:a))').getValue() // Suponemos que en A está la marca temporal

var url_form = SpreadsheetApp.getActiveSpreadsheet().getFormUrl()
  var respuestas = FormApp.openByUrl(url_form).getResponses()
  var cuantas = respuestas.length
pestana_datos.getRange(ultima_fila, columa_donde_guardar_url).setValue(respuestas[cuantas-1].getEditResponseUrl())

miércoles, 9 de septiembre de 2020

Fórmula para unir contenido de varias columnas en una sola (No código)

 En este artículo NO vamos a hablar de código, pero si de una pequeña fórmula que nos soluciona la vida cuando después de hacer un super-formulario con varias páginas condicionales (por ejemplo, una página por cada grupo de alumnos y una pregunta anterior, condicional que según el grupo que se elija el formulario te manda a una página u otra). 

La ingrata sorpresa, después de todo el trabajo hecho en el diseño del formulario, es que cada contestación se refleja en la hoja de respuestas en una columna diferente. 

Y nosotros queremos que solamente estén los datos en una sola columna.

Bueno, aquí va la solución por medio de una fórmula:

=arrayformula(f2:f&g2:g&h2:h) 

Es decir, nos aparecerá los datos de estas tres columnas en una sola.

martes, 3 de marzo de 2020

Comportamientos extraños desde el Formulario

Las respuestas de un formulario van, si queremos, a una hoja de cálculo, y, gracias a ello, podemos crear aplicaciones que vayan cambiando dependiendo de los datos que metan los usuarios.

Para ello, sabemos que existe una pestaña en la hoja de cálculo no creada por nosotros, sino propia de cada formulario, y que recibe un nombre de forma automática: "Respuestas de formulario" (1)(2)...

En este artículo voy a hacer una recopilación de todos los comportamientos automáticos extraños que tiene dicha pestaña, y, en algunos casos, la solución que podemos dar a dichos casos.

Como introducción, debemos  tener en cuenta que no todas las acciones que llevemos a cabo en el formulario van a tener reflejo en la pestaña de la hoja de cálculo, entre ellas: borrado de preguntas y cambio de orden. Sí que se refleja: cambio en el título de las preguntas, añadir nuevas preguntas.

Vamos por partes:


1- Borrado de preguntas en formulario.

   Problema:  Como he comentado en la introducción, una vez que se crea una pregunta en un formulario esta ocupa una columna en la pestaña de la hoja de cálculo, pero no al contrario. Si borramos una pregunta, en la hoja de cálculo dicha pregunta no desaparece y sigue ocupando su columna. Eso sí, no recoge ningún dato.
  Solución: La verdad que no influye en nada que dicho resto sea visible. Solamente nos ocupa espacio. Podemos ocultar la columna o/y moverla al final de todas las columnas a la derecha.


2- Cambio de orden de preguntas en formulario

   Problema: Los formularios son sencillos de crear y nos permite facilmente añadir, cambiar, mover y borrar preguntas. Pero tampoco el cambio de orden de las preguntas se refleja en la hoja de cálculo. Si no intervenimos, nos encontraremos las preguntas en el orden de creación, no en el real. También es verdad que los datos si que van a cada columna correspondiente, si que saben en que orden tienen que ir. El problema no es de datos sino de orientación nada más.
  Solución: En la pestaña de respuestas de formulario podemos, sin preocuparnos de fastidiar nada, ordenar nosotros manualmente las preguntas, arrastrándo cada columna detrás o delante de la que nos interese. Eso sí, al ser manual, debemos controlar el orden en que lo hemos hecho en el formulario. Podemos aprovechar para deshacernos de las preguntas borradas moviéndolas a la derecha.

3- Añadir nuevas preguntas al formulario

    Problema: Imaginaros que tenemos una aplicación con un formulario que, automáticamente crea medias, desviaciones, etc... según la valoración que se mande a través del formulario. Pero tenemos la costumbre de añadir preguntas nuevas al tiempo. Las medias, desviaciones, etc.. de estas preguntas nuevas no van a aparecer ya que las fórmulas ya hechas se refieren solamente (como es lógico) a las preguntas existentes en su momento. Qué pena que el formulario no sea tan inteligente que en cuanto metemos una pregunta nueva cree automáticamente en la hoja de cálculo todo lo necesario para ella.
   Solución: Tenemos un truco que nos puede permitir que hasta las preguntas nuevas vayan asociándose a las fórmulas que ya tenemos de forma automática. Los pasos son los siguientes:
         1.- Creamos en la pestaña de respuestas de formulario una columna por nuestra cuenta y le llamamos, por ejemplo "XXX", es decir, si la columna es la Z, escribimos en la celda Z1 las letras "XXX", como si fuera una pregunta del formulario. Parece que lo importante es que sea la de después de la última de las columnas utilizadas por el formulario para escribir las preguntas suyas.
        2.- Creamos alguna pregunta nueva en el formulario. Como verás, estas preguntas no se colocan en la pestaña detrás de nuestra pregunta "XXX", sino siempre delante y la desplazan a la derecha, quedando esta siempre la última. Nos aprovechamos, pues, de este comportamiento extraño de las preguntas de formulario.
         3.- Cuando creemos cualquier fórmula (tipo array) incluiremos la pregunta "XXX", pero con un filtro que la excluya, por ejemplo, =filter('Respuestas de formulario1'A1:Z1;'Respuestas de formulario1'A1:Z1<>"XXX"). Así, la pregunta XXX desaparecerá, pero todas las demás aparecerán, y aunque el formulario, al añadir preguntas nuevas, la desplace de columna y pase a la AA, o la AB, la referencia se actualiza automáticamente y siempre pilla todas las preguntas a la izquierda de XXX


4- Editar datos en la pestaña

    Problema: En la pestaña de respuestas de formulario se pueden editar los datos: añadir nuevos, borrar, cambiar, etc.., siempre teniendo en cuenta que el formulario no se entera y que los datos que guarda el formulario y los de la pestaña ya no coincidirán. Eso nos lleva a, por ejemplo, no usar los gráficos del resumen de formulario, ya que no serían los datos correctos.
   Solución: Esta es siempre manual. Ten en cuenta y acepta que, aunque parezca lo contrario, los datos del formulario no están realmente conectados con los de la pestaña y que solamente se vierten en ella. Por lo tanto, si queremos que sean iguales unos y otros, una de dos, o no cambiamos nada en la pestaña o los cambios que hagamos los debemos hacer también en los datos del formulario, y eso solamente funciona en caso de borrado, no de editado. Aún y todo, como el formulario te deja descargar sus datos en .csv siempre se pueden "recuperar" los datos del formulario. De todas formas, "que más nos da"

5- Borrado de filas en la pestaña

    Problema: Hay que tener cuidado en la edición de los datos de la pestaña "Respuestas de formulario" como hemos visto en el punto anterior, pero especialmente a la hora de borrar filas enteras. 
Os habréis fijado que a la hora de borrar filas enteras de datos tenemos no una sino dos opciones que son: eliminar filas y borrar datos de la fila. En el primer caso se borran los datos y, además, se lleva la fila una más arriba. En el segundo, simplemente desaparecen los datos y queda un fila en blanco en medio de donde hemos borrrado. 
Para lo que nos atañe, es decir, en la pestaña respuestas de formulario esta decisión de quitar filas provoca ciertos consecuencias "raras". Por ejemplo, a partir de eliminar ciertas filas, el formulario deja de añadir los nuevos datos al final y los incluye entre filas de datos antiguos. Esto supone que no podemos saber cual ha sido la última entrada de formulario simplemente apuntando a la última fila de datos.
Solución: Debemos utilizar la función max del campo marca_temporal para asegurarnos que apunta a donde queremos.

5bis - Borrado de filas en la pestaña 
     
    Problema:  También provoca que si hacemos referencia en una fórmula a los datos de formulario, y eliminamos todas las filas, a partir de ese momento, la fórmula en cuestión va ir cambiando automáticamente la referencia de 2 a 3, de 3 a 4, y así sucesivamente, provocando que nunca entre la referencia en el rango de datos en cuestión.
Solución: Más que solución, un truco que recomiendo vivamente es el de no eliminar nunca la fila 2 de la pestaña de respuestas de formulario. Si es necesario utilizad "borrar datos de la fila"

 

6-  Inclusión de columnas no pertenecientes al formulario.

   Problema: En esta pestaña, las columnas se crean automáticamente según lo que añadamos en el formulario. Pero, a veces, necesitamos crear columnas no dependientes de dicho formulario. Y, si además, queremos referenciarlas dentro del código, nos encontraremos con el problema que el número de columna irá cambiando según vayamos cambiando el formulario, con lo que no podremos conseguir un código eficaz o deberíamos de acordarnos de cambiarlo cada vez.
Solución: Podemos incluir columnas nuestras en la parte izquierda, sin ningún temor a que nos cambien de índice de columna.


7- Usuarios que mandan respuestas mediante formulario repetidas

Problema:A veces ocurre que un usuario no está seguro de que su respuesta va a llegar, o se ha equivocado en algo, o no se acuerda si la ha mandado, o vete a saber, pero la consecuencia es que detectamos que existen respuestas repetidas que no deberíamos incluir en nuestra gestión
Solución: Nos viene muy bien la fórmula de max(marca_temporal) para solamente incluir los datos de la última enviada por cada usuario


jueves, 16 de enero de 2020

Mensaje emergente con html

En vez de browser.msgbox, es decir, en vez de un mensaje emergente con pocas opciones de configuración, podemos utilizar mensajes de diálogo con código html integrado, pudiendo incluir, por supuesto, imágenes, tablas, enlaces, etc...

Esta función muestra un ejemplo sencillo

function mostrarHtml() {
// Escribimos una URL para el enlace que queremos que aparezca en el mensaje
var url = 'https://drive.google.com/drive/folders/1zOkH9gbqhox5ezwTcnZGBoTeHQXYQ8nq'

// Escribimos el nombre que queremos que aparezca como mensaje
var name ='google'

// En una variable metemos todo el código html más la url y el nombre
  var html = '<html><div><img src="https://www.andalucialab.org/wp-content/uploads/2013/11/sostenibilidad-estrategia-negocio.jpg " width="112" height="119" align="top"/>&nbsp; &nbsp;&nbsp;<a href="'+url+'" target="blank">'+name+'</a></div></html>';

// Con este código creamos el mensaje
  var ui = HtmlService.createHtmlOutput(html)
// Tenemos dos opciones de mostrar 
      // En el centro de la pantalla

  SpreadsheetApp.getUi().showModalDialog(ui, 'Car')
     // Como barra lateral derecha
  SpreadsheetApp.getUi().showSidebar(ui)

    // Existe otra tercera más, que aunque el mensaje aparece encima de la pantalla, permite seguir trabajando sin tener que cerrarlo
SpreadsheetApp.getUi().showModelessDialog(ui)

}

Por supuesto, hay que conocer el código html, pero podemos casi obviar este aprendizaje con esta herramienta online: https://html-online.com/editor/

Crear PDF horizontal

El código que vamos a mostrar aquí no ha sido creado por nosotros, sino que lo hemos encontrado en Internet. Objetivo: Publicar una pesta...