Me encantan las fórmulas que utilizan los arrays, tanto arrayformula() que consigue que una fórmula se extienda a todas las celdas que queramos, como la más prosáica, pero muy potente {} que nos permite llevar, sin más, grupos de valores de un lado a otro, juntarlos, ponerlos unos al lado de otros, utilizando {a:a;c:c} (nos pone en la misma columna los contenidos de la columna A y luego los de la C) y {a:a\s:s} que pone dos columnas separadas una al lado de otra. Os la recomiendo vívamente.
Pero creo que, no estoy seguro del todo, los arrays provocan que se creen filas adicionales vacías. Os cuento mi caso:
Tengo un código que sirve para que los profesores envíen mediante formulario partes de convivencia. Al enviarse el formulario, el código manda un mensaje a la familia del alumno, otro al tutor y otro más al jefe de estudios.
El código no tiene bucles, ni grandes peticiones al servidor, por lo que se ejecuta en apenas unos segundos.
Pues, resulta, que empezó a dejar de funcionar ya que se pegaba un montón de tiempo ejecutándose y al final se cortaba.
Ayer estuve toda la mañana haciendo pruebas, corriendo el código por partes y volvía al mismo problema.
Probé a volver a crearlo en otra hoja de cálculo, poco a poco, y conseguí que funcionase sin problemas. Copié este código nuevo en la anterior hoja y, otra vez, se quedaba colgado ejecutándose, por lo que, por lógica, algo tenía la primera hoja que ralentizaba tanto la ejecución.
Se me ocurrió ir limpiando la hoja de cálculo de columnas y filas vacías y.. me encontré que en una pestaña de 800 registros había unas 40.000 filas blancas. Borré todas estas y... el código volvió a funcionar perfectamente.
Pero, me fijé que cada vez que corría el código, volvían a aparecer filas blancas en dicha pestaña. A estas alturas podéis imaginar que las fórmulas de esta pestaña estaban construídas con arrays y que debería haberme dado cuenta que un array, por ejemplo ={a:a;c:c}, te junta dos columnas en una sola, pero todas las filas vacías de cada una se unen y se duplican.
En conclusión y como solución, podemos decir que los arrays son muy potentes, pero pueden crear muchas filas vacías que, con el tiempo, pueden influir hasta tal punto que no dejen que un código sencillo funcione.
Medidas:
- En la fórmula con array es aconsejable meter un filtro que quite las filas vacías del resultado, algo como así: =FILTER({A2:D;L2:O};{A2:A;L2:L}<>"")
- Para curarnos en salud, es bueno tener una función que limpie las filas vacías y que se incluya en onOpen(), para que corra al abrir la herramienta. Yo la he definido así:
- function limpiar_filas(){
var aplicacion = SpreadsheetApp.getActiveSpreadsheet()
var exportar = aplicacion.getRangeByName('exportar').getSheet()
Logger.log(exportar.getRange('G1').getValue())
exportar.getRange('E1').setValue('=counta(Q:Q)')
var ultima_datos = exportar.getRange('E1').getValue()
Logger.log(ultima_datos)
var ultima = exportar.getLastRow()
Logger.log(ultima)
if (ultima > ultima_datos){ // Si no hacemos esta comparación nos ocurrirá que cuando todo esté limpio ultima y ultima_datos serán iguales y la función no correrá y dará error
exportar.deleteRows(ultima_datos+parseInt(1), ultima-ultima_datos)
}
}
No hay comentarios:
Publicar un comentario