Como filtrar filas usando filter con Google Apps Script


 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...

Implementar un código con Google Apps Script que filtre filas es bastante fácil. De hecho sería algo como esto:

function FilterRows(values) 
{
  var out = new Array();
  
  for(var i = 0 ; i < values.length ; ++i)
  {
     var row = values[i];
     
     if( row[0] == "A" )
     {
       out.push(row);
     }
  }
  
  return out;
}

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.

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.

Solución? Utilizar la función filter que nos da JavaScript y que podemos usar sin problemas dentro de Google Apps Script. 

El código quedaría tal que así:

function FilterRow(values)
{
   return values.filter(row => row[0] == 'A');
}

Antes que recordad que values una matriz de datos que representa la información de un sheet, es decir, es un array de arrays de datos. Cada elemento de values es una fila de información.

.filter 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

En est caso row es la variable de iteración, es decir, la variable que usará el filter para comprobar si se acepta o no ese elemento.

El formato de la condición de filter siempre será el mismo: var => condicion


Que es mejor?

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.

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.

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.

Espero que os haya servido de ayuda. 

Nos vemos!





2 comentarios:

  1. Hola, gracias por tu aportacion.
    Estoy intentando correr tus codigos pero me manda los siguientes errores:

    TypeError: Cannot read properties of undefined (reading 'filter')
    FilterRow @ Código.gs:10

    y para el codigo de abajo:

    TypeError: Cannot read properties of undefined (reading 'length')
    AutoFill @ Código.gs:5

    Es como si Apps Script no identificara las funcionalidades.
    Tendras alguna sugerencia o solucion.



    ResponderEliminar
    Respuestas
    1. Parece que no estas llamando correctamente a la función. Como la estás llamando?

      Eliminar

Tal vez te interese