es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo optimizar esta función para un conjunto de datos grande (100k filas y 10 columnas) utilizando Google Apps Script?

Esta función funciona bien, pero solo para hasta 20k filas. ¿Qué podría cambiar para hacerla más rápida?

“`
const SOURCE_FILE_ID = ‘ID’;

function getData() {
const sourceSheet = SpreadsheetApp.openById(SOURCE_FILE_ID);
const sourceRng = sourceSheet.getSheetByName(‘ativcopiar’).getRange(1, 1, sourceSheet.getLastRow(), 9);
const sourceValues = sourceRng.getValues();

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(‘Ativ.’);
var destinationRng = sheet.getRange(1, 1, sheet.getLastRow(), 9);
destinationRng.clearContent();

destinationRng.setValues(sourceValues);
}

A veces, supera el límite de tiempo.

¡Agradezco cualquier ayuda!
Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay algunas cosas que podrías hacer para hacer que esta función se ejecute más rápido:

    1. Usar operaciones por lotes: en lugar de establecer o obtener valores una celda a la vez, usa operaciones por lotes para establecer o obtener valores para varias celdas a la vez. Los métodos Range.setValues() y Range.getValues() pueden manejar rangos grandes, por lo que puedes pasar todo el rango de datos de una sola vez.
    2. Usar range.clear() en lugar de range.clearContent(): el método clear() borra todo el contenido y formato del rango, mientras que clearContent() solo borra los valores y deja el formato intacto. Usar clear() en lugar de clearContent() puede acelerar el proceso.

    3. Reducir la cantidad de llamadas a otros servicios: llamar a servicios externos como SpreadsheetApp.openById() puede ser lento. Podrías intentar cachear el ID de la hoja de origen y solo buscar la hoja cuando sea necesario.

    4. Usar Range.getLastColumn() en lugar de codificar el número de columnas: si el número de columnas en el rango de origen cambia, la función fallará. Usar getLastColumn() asegurará que siempre se use el número correcto de columnas.

    Con estos cambios, el código modificado se vería así:

    const SOURCE_FILE_ID = 'ID';
    
    function getData() {
      const sourceSheet = SpreadsheetApp.openById(SOURCE_FILE_ID).getSheetByName('ativcopiar');
      const sourceRange = sourceSheet.getRange(1, 1, sourceSheet.getLastRow(), sourceSheet.getLastColumn());
      const sourceValues  = sourceRange.getValues();
    
      const destinationSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Ativ.');
      const destinationRange = destinationSheet.getRange(1, 1, destinationSheet.getLastRow(), destinationSheet.getLastColumn());
      destinationRange.clear();
    
      destinationRange.setValues(sourceValues);
    }
    

    Nota: estos cambios no necesariamente resolverán completamente el problema, pero deberían ayudar a mejorar el rendimiento de la función.

Comments are closed.