Descargas, guías, trucos, gameplays...

domingo, 10 de marzo de 2013

Google Apps Script: Guardar columna de Google Hoja de Cálculo en variable Array.



Esto es algo que aprendí hace poco a pura prueba. Algunas veces he tenido la necesidad de guardar varios valores de una columna en una variable Array en Google Apps Script, pero tener que acceder a cada momento a la Hoja de Cálculo para tomar los datos vuelve las aplicaciones lentas y es algo bastante molesto.

Para explicarme mejor, lo que hacia antes era, por ejemplo, algo como esto:


var hoja = SpreadsheetApp.openById("0AshRJMKOSRGddHNvSy10T2w5SzU3NT8g5hyj62XFrYXc").getSheetByName("Hoja1");
var Array_Rango =[hoja.getRange('A1').getValue(), hoja.getRange('A2').getValue(),......
                  ......,hoja.getRange('A100').getValue()];


Bueno al no ser un experto eso es lo que hacia, y volvía muy lentas mis aplicaciones al tener que acceder tanto a la Hoja de Cálculo. Esto lo he corregido usando el siguiente código en lugar del anterior:


var hoja = SpreadsheetApp.openById("0AshRJMKOSRGddHNvSy10T2w5SzU3NT8g5hyj62XFrYXc").getSheetByName("Hoja1");
var Array_Rango  =  new Array(100); //declaramos la variable como Array
Array_Rango = hoja.getRange(1, 1, 100, 1).getValues(); //guardamos los 100 valores del rango de una vez


con la última linea guardo los 100 valores en la variable Array de una vez. Tan grande es la mejora que en una aplicación donde tenia que guardar 800 valores en varias variables Array el tiempo de ejecución del código se redujo de 43 segundos, de espera para que se llenaran los Array, a solo 3 segundos de espera.

Espero les sea útil.






3 comentarios:

  1. muy interesante estimado, justo estoy armando un codigo, quizas me pueda ayudar, he planteado mi problema aqui:

    https://productforums.google.com/forum/#!category-topic/docs-es/google-apps-scripts/ljjXIOyD1Ls

    Se me ocurre que con esto puedo leer los valores de toda una fila, para luego segun el valor aplicar los cambios, pero no se como hacerlo.
    me podra ayudar?

    ResponderEliminar
    Respuestas
    1. Hola. Proba este código:

      function ColorCelda() {
      var libro = SpreadsheetApp.getActiveSpreadsheet();
      var hoja = libro.getSheets()[0];


      //FORMATO CONDICIONAL AVANZADO
      //COLOR DE CELDAS DEPENDIENDO DEL VALOR DE OTRA
      //al ejecutar el código veremos los cambios en la celda B11:S11 si A11 vale -4 u otro valor

      var rango = new Array()
      rango = hoja.getRange(2,1,999,1).getValues();

      for(var i=0; i<999; i++){
      if (rango[i] == -4){
      hoja.getRange(i + 2, 2, 1, 18).setBackground('#FF0000').setFontColor('#FFFFFF');//las instrucciones de color de relleno
      } //y texto pueden combinarse en una sola linea de código
      else if (rango[i] == -2){
      hoja.getRange(i + 2, 2, 1, 18).setBackground('#F781F3').setFontColor('#000000');
      }
      else if (rango[i] == 4){
      hoja.getRange(i + 2, 2, 1, 18).setBackground('#3ADF00').setFontColor('#000000');
      }
      else if (rango[i] == 2){
      hoja.getRange(i + 2, 2, 1, 18).setBackground('#FFFF00').setFontColor('#000000');
      }
      else{
      hoja.getRange(i + 2, 2, 1, 18).setBackground('#FE9A2E').setFontColor('#000000');
      }
      }
      }



      Le hice algunos cambios:

      La función getValue al ser usada demasiadas veces Google advierte que puede ralentizar la ejecución. Mejor guarde todos los valores de la columna A en la variable rango usando getValues.

      La función setBackgroundColor ya no debe usarse. google advierte que esta en desuso y podrían eliminarla en cualquier momento, en su lugar use setBackground.

      Eliminar
    2. muchas gracias, el codigo funciona a la perfección. gracias por la modificacion del codigo.
      Que me recomiendas para aprender a programar en este lenguaje, yo programo en php, pero aqui me quede duro.. jeje

      Eliminar