Tengo dos columnas en una hoja de Google, columna A y B.
La columna A contiene una "X" si queremos agregar validación de datos en la columna B. La columna A está en blanco si no queremos validación de datos en la columna B.
Creé el siguiente script, que funciona pero tarda alrededor de 2 minutos en ejecutar 500 filas. ¿Hay alguna forma de escribir el script de manera más eficiente para que se ejecute más rápido o esta es la mejor solución?
function AddDataValidation(){ var ss4 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet4'); for(row=2; row<=500; row++){ if (ss4.getRange('A'+row).getValue() == 'X'){ ss4.getRange('B'+row).setDataValidation(SpreadsheetApp.newDataValidation() .requireValueInList(['a', 'b', 'c'], true) .build()) } } }Descripción:
Para optimizar los scripts de hojas de cálculo, utilice siempre Range.getValues()/setValues(). Entonces obtengo todos los valores en lugar de individualmente. Esto se aplica a todas las demás categorías, por lo que, para su ejemplo, use Range.getDataValidations() y Range.setDataValidations(). Observe que he envuelto la regla entre paréntesis de matriz. Esto se debe a que las reglas deben ser una matriz 2D para configurarlas en la hoja de cálculo. Por favor, hágame saber la diferencia en el rendimiento.
Guion
function AddDataValidation() { var ss4 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet4'); var data = ss4.getDataRange().getValues(); var row = 0; var rule = SpreadsheetApp.newDataValidation().requireValueInList(['a', 'b', 'c']).build(); var rules = []; // data start in row 1 index 0 so skip header for( row=1; row<data.length; row++ ) { if( data[row][0] === 'X' ) { rules.push([rule]); } else { rules.push([null]); } } // assuming header in row 1 start in row 2 ss4.getRange(2,2,rules.length,1).setDataValidations(rules); }Referencias
Es posible que desee borrar las validaciones de datos primero
function AddDataValidation(){ const ss = SpreadsheetApp.getActive(); const sh = ss.getSheetByName('Sheet0'); const vs = sh.getRange(2,1,sh.getLastRow() - 1,2).getDisplayValues(); const rule = SpreadsheetApp.newDataValidation().requireValueInList(['a', 'b', 'c'], true).build(); let vo = vs.map((r,i) => { if(r[0] == "X") { return [rule]; } else { return [null]; } }) sh.getRange(2,2,vo.length,1).clearDataValidations().clearContent(); sh.getRange(2,2,vo.length,1).setDataValidations(vo); }Borré tanto las validaciones de datos como el contenido porque el contenido incorrecto puede causar problemas con la validación.