Partilhar via


Melhorar o desempenho dos scripts do Office

A finalidade dos Scripts do Office é automatizar uma série de tarefas normalmente executadas para economizar tempo. Um script lento pode parecer que ele não acelera o fluxo de trabalho. Na maioria das vezes, seu script ficará perfeitamente bem e será executado conforme o esperado. No entanto, há alguns cenários evitáveis que podem afetar o desempenho.

Reduzir o número de chamadas de leitura ou gravação

O motivo mais comum para um script lento é a comunicação excessiva com a pasta de trabalho. Isso é particularmente perceptível ao usar Excel na Web. Em determinados momentos, seu script sincroniza seus dados locais com os da pasta de trabalho. Isso significa que todas as operações de gravação (como workbook.addWorksheet()) só são aplicadas à pasta de trabalho quando essa sincronização nos bastidores acontece. Da mesma forma, todas as operações de leitura (como myRange.getValues()) só obtêm dados da pasta de trabalho para o script nesses momentos. Em ambos os casos, o script busca informações antes de agir nos dados. Por exemplo, o código a seguir registrará com precisão o número de linhas no 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);

As APIs de Scripts do Office garantem que todos os dados na pasta de trabalho ou script sejam precisos e atualizados quando necessário. Você não precisa se preocupar com essas sincronizações para que seu script seja executado corretamente. No entanto, uma consciência dessa comunicação script-para-nuvem pode ajudá-lo a evitar chamadas de rede desnecessárias.

Ler dados de pasta de trabalho fora de um loop

Qualquer método que obtenha dados da pasta de trabalho pode disparar uma chamada de rede. Em vez de fazer repetidamente a mesma chamada, você deve salvar dados localmente sempre que possível. Isso é especialmente verdadeiro ao lidar com loops.

Considere um script para obter a contagem de números negativos no intervalo usado de uma planilha. O script precisa iterar em todas as células do intervalo usado. Para fazer isso, ele precisa do intervalo, do número de linhas e do número de colunas. Você deve armazená-los como variáveis locais antes de iniciar o loop. Caso contrário, cada iteração do loop forçará um retorno à pasta de trabalho.

/**
 * 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);
}

Observação

Como um experimento, tente substituir usedRangeValues no loop por usedRange.getValues(). Você pode notar que o script leva consideravelmente mais tempo para ser executado ao lidar com grandes intervalos.

Evitar o uso de try...catch blocos em loops ou ao redor

Não recomendamos usar try...catch instruções em loops ou loops ao redor. Isso é pelo mesmo motivo pelo qual você deve evitar a leitura de dados em um loop: cada iteração força o script a sincronizar com a pasta de trabalho para garantir que nenhum erro tenha sido gerado. A maioria dos erros pode ser evitada verificando objetos retornados da pasta de trabalho. Por exemplo, o script a seguir verifica se a tabela retornada pela pasta de trabalho existe antes de tentar adicionar uma linha.

/**
 * 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.");
  }
}

Remover instruções desnecessárias console.log

O log do console é uma ferramenta vital para depurar seus scripts. No entanto, ele força o script a sincronizar com a pasta de trabalho para garantir que as informações registradas sejam atualizadas. Considere remover instruções de log desnecessárias (como as usadas para testes) antes de compartilhar seu script. Normalmente, isso não causará um problema de desempenho perceptível, a menos que a console.log() instrução esteja em um loop.

Pausar cálculos enquanto os scripts são executados

Se o script alterar muitos valores, ele poderá disparar recalculações excessivas. Controle o mecanismo de cálculo do Excel definindo o modo de cálculo como "manual" enquanto o script é executado. Use Application.setCalculation para alternar o Excel para recalcular manualmente fórmulas. Certifique-se de retornar a pasta de trabalho ao modo de cálculo original quando concluída.

O exemplo a seguir mostra como alterar o modo de cálculo. Ele também demonstra como recalcular manualmente a pasta de trabalho com 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);
}

Ajuda caso a caso

À medida que a plataforma Scripts do Office se expande para trabalhar com Power Automate, Cartões Adaptáveis e outros recursos entre produtos, os detalhes da comunicação script-pasta de trabalho se tornam mais complexos. Se você precisar de ajuda para que seu script seja executado mais rapidamente, entre em contato com o Microsoft Q&A. Certifique-se de marcar sua pergunta com "office-scripts-dev" para que os especialistas possam encontrá-la e ajudar.

Confira também