Quiero verificar que un rango de celdas esté vacío o tenga algún valor, uso esto for loop :
for (let i = 0; i <= namesRange.getCellCount(); i++) { if (namesRange.getCell(i,0).getText() == "") { break; } bookedCount += 1; } Sin embargo, esta iteración es extremadamente lenta (al igual que el uso de Range.getValue , pero la consola le advierte que la iteración con .getValue es lenta, no le advierte con getText ). Se tarda varios segundos en iterar sobre una lista muy corta de 10 elementos. .
¿Hay alguna forma de verificar los valores de una celda de manera rápida usando ExcelScripts?
¿Significa esto que, incluso si desarrollo un UDF o un complemento de cinta con office.js y Node.js, también será extremadamente lento para iterar sobre las celdas?
¿Hay alguna manera de hacer esto más rápido?
Otra alternativa a la primera respuesta es usar el enfoque forEach para cada celda en el rango de valores.
Puede reducir la cantidad de variables que necesita para lograr el resultado deseado.
function main(workbook: ExcelScript.Workbook) { let worksheet = workbook.getActiveWorksheet(); let usedRange = worksheet.getUsedRange().getValues(); usedRange.forEach(row => { row.forEach(cellValue => { console.log(cellValue); }); }); }La razón por la que es probable que su código funcione lentamente es que las llamadas a getCell() y getText() son costosas. En lugar de realizar estas llamadas cada vez en el ciclo, puede probar un enfoque diferente. Un enfoque es obtener una matriz de los valores de celda e iterar sobre eso. Puede usar su variable namesRange para obtener la matriz de valores. Y también puede usarlo para obtener el recuento de filas y el recuento de columnas para el rango. Con esta información, debería poder escribir bucles for anidados para iterar sobre la matriz. He aquí un ejemplo de cómo podrías hacerlo:
function main(workbook: ExcelScript.Workbook) { let namesRange: ExcelScript.Range = workbook.getActiveWorksheet().getRange("A1"); let rowCount: number = namesRange.getRowCount(); let colCount: number = namesRange.getColumnCount(); let vals: string[][] = namesRange.getValues() as string[][]; for (let i = 0; i < rowCount; i++) { for (let j = 0; j < colCount; j++) { if (vals[i][j] == "") { //additional code here } } } }