Cómo optimizar la lectura de spreadsheets con Google Apps Script


Artículo relacionado con la optimización de código de Google Apps Script

No hace mucho expliqué como optimizar las escrituras dentro de un spreadsheet, pero cuando hacemos una web dinámica con google apps script realmente lo que necesitamos es optimizar las lecturas dado que generalmente las webs que haremos serán extracciones de datos de hojas de cálculo de google.

La idea para optimizar las lecturas de hojas de cálculo es muy parecida a la usada para optimizar las escrituras, en vez de hacer la operación x veces la hacemos 1 sola vez y en vez de recoger los datos de toda la hoja , obtendremos los datos solo de la columnas y filas que nos interesen.

La lectura como tal mediante getDataRange es bastante rápida así que no podemos esperar ratios tan escandalosos como cuando optimizábamos las escrituras pero tal vez este truco pueda dar ese pequeño empujón a la aplicación para que vaya más fluida.

El código en versión "novata" y en versión optimizada lo tenéis aquí:

Versión "novata":
function TestVelocidadGetDataRange()
{
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getDataRange();
  var values = range.getValues();

  //Aquí pondriamos nuestro código que trabaja con los valores de la hoja de cálculo
}

Versión optimizada:
function TestVelocidadGetRange()
{
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getRange(2, 1, 10);
  var values = range.getValues();

  //Aquí pondriamos nuestro código que trabaja con los valores de la hoja de cálculo
}

Esta optimización se tiene que revisar bien para el tipo de datos que uses dado que la mejora de rendimiento depende del número de columnas de nuestra hoja. Si tenemos pocas columnas casi puede resultar más beneficioso usar el acceso "no óptimo".

Esta optimización solo tiene sentido si de una hoja muy grande solo queremos leer una columna (buscar ID's, ordenar datos, etc...) cosa que se usa bastante al hacer desplegables dentro de una web dinámica. Si nuestro objetivo es trabajar con bastantes columnas a la vez o bien el documento tiene pocas columnas se tiene que probar bien que realmente de beneficio.

A nivel de ejemplo, imaginando que tenemos una hoja de cálculo con 30 columnas de las que solo nos interesa 1 podéis ver la mejora de tiempos de esta optimización:
LECTURAS EN LAS QUE SOLO INTERESA UNA COLUMNA DE 30
NGetDataRangeGetRangeRatio
100,1140,0432,651162791
1000,1520,0742,054054054
2000,1880,0961,958333333
10001,6870,752,249333333

Como os he dicho la mejora no es abismal, pero da un poco de margen para que nuestros tiempos de carga disminuyan

Cualquier cosa, ya lo sabéis.

Nos vemos

NOTA: Si te ha gustado este tutorial tal vez también te interese el tutorial sobre las diferentes maneras de obtener una fila de un spreadsheet con Google Apps Script

3 comentarios:

  1. Hola, tengo este codigo, como hago para seleccionar el rango que yo le diga, ademas como hago para que en la tabla abra enlaces que yo ponga en la hoja de calculo

    function doGet() {
    return HtmlService.createHtmlOutputFromFile('Index')
    .setSandboxMode(HtmlService.SandboxMode.IFRAME);
    }
    /*
    * Obtiene los datos de la hoja de cálculo especificada por ID.
    */
    function getData() {
    return SpreadsheetApp
    .openById('1J2DdQN0cYYtj33NzXyIveoCX_3YJ3Jv5F9MvLTEWfv4ffd')
    .getActiveSheet()
    .getDataRange()
    .getValues()

    ResponderEliminar
    Respuestas
    1. 1. Rangos. Deberías usar el getRange(x,y,incx,incy) en vez del getDataRange()
      2. Para poner links

      Espero que con esto tengas pistas de como montarlo

      Eliminar
  2. function crearTablai(){
    var data = getData();

    var tablai = '\n';

    for(var i = 0; i < data.length; i++){

    tablai += '';
    for(var j = 0; j < data[0].length; j++){
    tablai += '' + data[i][j] + ''
    }
    tablai += '\n';
    }
    tablai += '';
    return tablai;
    }

    ResponderEliminar

Tal vez te interese