Escribí un script de aplicación que copia valores de la hoja 2 a la hoja 1 solo si la celda de la columna A (en la hoja 1) contiene el valor "Copiar". Este script funciona bien, pero todo lo que tenga más de 50 filas se ejecuta bastante lento, ¿hay alguna forma de optimizar esta función para que se ejecute más rápido?
function CopyValues() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var Sheet1 = ss.getSheetByName('Sheet1'); var Sheet2 = ss.getSheetByName('Sheet2'); //If Column A = Copy then copy the values in Sheet 2 column B to W to sheet 1 for (var i=1; i<=1000; i = i + 1) if (Sheet1.getRange(i,1,100,1).getValue() == 'Copy'){ Sheet2.getRange(i,2,1,23).copyTo(Sheet1.getRange(i,2,1,23),SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false); }; };Creo que su objetivo es el siguiente.
En esta modificación, me gustaría reducir el costo del proceso del script por parte de Sheets API. Pensé que cuando se usa Sheets API para su situación, el costo del proceso podrá reducirse un poco.
Cuando Sheets API se refleja en su secuencia de comandos, se convierte en lo siguiente.
Antes de usar este script, habilite Sheets API en los servicios avanzados de Google .
function CopyValues2() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var Sheet1 = ss.getSheetByName('Sheet1'); var Sheet2 = ss.getSheetByName('Sheet2'); // Retrieve copied row index. var rows = Sheet1.getRange("A1:A" + Sheet1.getLastRow()).getValues().reduce((ar, [a], i) => { if (a == "Copy") ar.push(i); return ar; }, []); // Create a request body for using the batchUpdate method of Sheets API. var srcSheetId = Sheet2.getSheetId(); var dstSheetId = Sheet1.getSheetId(); var requests = rows.map(e => ({ copyPaste: { source: { sheetId: srcSheetId, startRowIndex: e, endRowIndex: e + 1, startColumnIndex: 1, endColumnIndex: 24 }, destination: { sheetId: dstSheetId, startRowIndex: e, endRowIndex: e + 1, startColumnIndex: 1 }, pasteType: "PASTE_NORMAL" } })); // Request Sheets API using the created request body. Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId()); }Prueba esto:
function CopyValues() { const ss = SpreadsheetApp.getActive(); const sh1 = ss.getSheetByName('Sheet1'); const sh2 = ss.getSheetByName('Sheet2'); const vs = sh1.getRange(1,1,sh1.getLastRow(),23).getValues().filter(r => r[0] == "Copy"); sh2.getRange(sh2.getLastRow() + 1, 1,vs.length,23).setValues(vs) }