Compartir a través de


Mejora del rendimiento de los scripts de Office

El propósito de los scripts de Office es automatizar la serie de tareas que se realizan habitualmente para ahorrarle tiempo. Un script lento puede parecer que no acelera el flujo de trabajo. La mayoría de las veces, el script estará perfectamente bien y se ejecutará según lo esperado. Sin embargo, hay algunos escenarios evitables que pueden afectar al rendimiento.

Reducir el número de llamadas de lectura o escritura

La razón más común para un script lento es la comunicación excesiva con el libro. Esto es especialmente notable cuando se usa Excel en la Web. En determinados momentos, el script sincroniza sus datos locales con los del libro. Esto significa que las operaciones de escritura (como workbook.addWorksheet()) solo se aplican al libro cuando se produce esta sincronización en segundo plano. Del mismo modo, las operaciones de lectura (como myRange.getValues()) solo obtienen datos del libro para el script en ese momento. En cualquier caso, el script captura información antes de que actúe sobre los datos. Por ejemplo, el código siguiente registrará con precisión el número de filas en el intervalo usado.

let usedRange = workbook.getActiveWorksheet().getUsedRange();
let rowCount = usedRange.getRowCount();
// The script will read the range and row count from
// the workbook before logging the information.
console.log(rowCount);

Las API de Scripts de Office garantizan que los datos del libro o script son precisos y están actualizados cuando sea necesario. No es necesario preocuparse por estas sincronizaciones para que el script se ejecute correctamente. Sin embargo, un reconocimiento de esta comunicación de script a nube puede ayudarle a evitar llamadas de red innecesarias.

Leer datos del libro fuera de un bucle

Cualquier método que obtiene datos del libro puede desencadenar una llamada de red. En lugar de realizar repetidamente la misma llamada, debe guardar los datos localmente siempre que sea posible. Esto es especialmente cierto cuando se trabaja con bucles.

Considere la posibilidad de un script para obtener el recuento de números negativos en el rango usado de una hoja de cálculo. El script debe recorrer en iteración todas las celdas del intervalo usado. Para ello, necesita el intervalo, el número de filas y el número de columnas. Debe almacenarlos como variables locales antes de iniciar el bucle. De lo contrario, cada iteración del bucle forzará una devolución al libro.

/**
 * This script provides the count of negative numbers that are present
 * in the used range of the current worksheet.
 */
function main(workbook: ExcelScript.Workbook) {
  // Get the working range.
  let usedRange = workbook.getActiveWorksheet().getUsedRange();

  // Save the values locally to avoid repeatedly asking the workbook.
  let usedRangeValues = usedRange.getValues();

  // Start the negative number counter.
  let negativeCount = 0;

  // Iterate over the entire range looking for negative numbers.
  for (let i = 0; i < usedRangeValues.length; i++) {
    for (let j = 0; j < usedRangeValues[i].length; j++) {
      if (usedRangeValues[i][j] < 0) {
        negativeCount++;
      }
    }
  }

  // Log the negative number count to the console.
  console.log(negativeCount);
}

Nota:

Como experimento, intente reemplazar usedRangeValues en el bucle por usedRange.getValues(). Es posible que observe que el script tarda mucho más tiempo en ejecutarse cuando se trabaja con intervalos grandes.

Evitar el uso de try...catch bloques en bucles o alrededores

No se recomienda usar try...catch instrucciones en bucles ni bucles circundantes. Esta es la misma razón por la que debe evitar la lectura de datos en un bucle: cada iteración obliga al script a sincronizarse con el libro para asegurarse de que no se ha producido ningún error. La mayoría de los errores se pueden evitar comprobando los objetos devueltos desde el libro. Por ejemplo, el siguiente script comprueba que la tabla devuelta por el libro existe antes de intentar agregar una fila.

/**
 * This script adds a row to "MyTable", if that table is present.
 */
function main(workbook: ExcelScript.Workbook) {
  let table = workbook.getTable("MyTable");

  // Check if the table exists.
  if (table) {
    // Add the row.
    table.addRow(-1, ["2012", "Yes", "Maybe"]);
  } else {
    // Report the missing table.
    console.log("MyTable not found.");
  }
}

Eliminación de instrucciones innecesarias console.log

El registro de consola es una herramienta vital para depurar los scripts. Sin embargo, obliga al script a sincronizarse con el libro para asegurarse de que la información registrada está actualizada. Considere la posibilidad de quitar instrucciones de registro innecesarias (como las que se usan para las pruebas) antes de compartir el script. Normalmente, esto no provocará un problema de rendimiento notable, a menos que la console.log() instrucción esté en un bucle.

Pausar los cálculos mientras se ejecutan los scripts

Si el script cambia muchos valores, puede desencadenar cálculos excesivos. Controle el motor de cálculo de Excel estableciendo el modo de cálculo en "manual" mientras se ejecuta el script. Use Application.setCalculation para cambiar Excel para volver a calcular manualmente las fórmulas. Asegúrese de devolver el libro al modo de cálculo original cuando haya terminado.

En el ejemplo siguiente se muestra cómo cambiar el modo de cálculo. También se muestra cómo volver a calcular manualmente el libro con Application.calculate.

/**
 * This script adjusts the calculation mode of the workbook and makes a manual recalculation.
 * Wrap the CalculationMode changes around code that repeatedly updates values.
 */
function main(workbook: ExcelScript.Workbook) {
  const application = workbook.getApplication();

  // Turn off automatic calculations during the script.
  application.setCalculationMode(ExcelScript.CalculationMode.manual);

  // ... 

  // Perform a manual recalculation of the workbook.
  application.calculate(ExcelScript.CalculationType.fullRebuild);

  // ...

  // Resume automatic calculations after the script finishes.
  application.setCalculationMode(ExcelScript.CalculationMode.automatic);
}

Ayuda caso por caso

A medida que la plataforma scripts de Office se expande para trabajar con Power Automate, tarjetas adaptables y otras características entre productos, los detalles de la comunicación script-libro se vuelven más complejos. Si necesita ayuda para que el script se ejecute más rápido, póngase en contacto con Microsoft Q&A. Asegúrese de etiquetar su pregunta con "office-scripts-dev" para que los expertos puedan encontrarla y ayudar.

Consulte también