Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O objetivo dos Scripts do Office é automatizar uma série de tarefas frequentemente executadas para poupar tempo. Um script lento pode parecer que não acelera o fluxo de trabalho. Na maioria das vezes, o script estará perfeitamente bem e será executado conforme esperado. No entanto, existem alguns cenários evitáveis que podem afetar o desempenho.
Reduzir o número de chamadas de leitura ou escrita
A razão mais comum para um script lento é a comunicação excessiva com o livro. Isto é particularmente percetível ao utilizar Excel na Web. Em determinadas alturas, o script sincroniza os respetivos dados locais com os do livro. Isto significa que quaisquer operações de escrita (como workbook.addWorksheet()) só são aplicadas ao livro quando esta sincronização nos bastidores ocorre. Da mesma forma, todas as operações de leitura (como myRange.getValues()) só obtêm dados do livro para o script nessas alturas. Em ambos os casos, o script obtém informações antes de agir nos dados. Por exemplo, o seguinte código irá registar com precisão o número de linhas no intervalo utilizado.
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 no livro ou script são precisos e atualizados quando necessário. Não precisa de se preocupar com estas sincronizações para que o script seja executado corretamente. No entanto, a deteção desta comunicação script-to-cloud pode ajudá-lo a evitar chamadas de rede desnecessárias.
Ler dados de livros fora de um ciclo
Qualquer método que obtenha dados do livro pode acionar uma chamada de rede. Em vez de efetuar repetidamente a mesma chamada, deve guardar os dados localmente sempre que possível. Isto é especialmente verdade ao lidar com ciclos.
Considere um script para obter a contagem de números negativos no intervalo utilizado de uma folha de cálculo. O script tem de iterar todas as células no intervalo utilizado. Para tal, precisa do intervalo, do número de linhas e do número de colunas. Deve armazená-las como variáveis locais antes de iniciar o ciclo. Caso contrário, cada iteração do ciclo forçará o regresso ao livro.
/**
* 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 uma experimentação, tente substituir usedRangeValues no ciclo por usedRange.getValues(). Poderá reparar que o script demora consideravelmente mais tempo a ser executado ao lidar com intervalos grandes.
Evite utilizar try...catch blocos nos ciclos adjacentes ou
Não recomendamos a utilização try...catch de instruções em ciclos ou ciclos adjacentes. Esta é a mesma razão pela qual deve evitar ler dados num ciclo: cada iteração força o script a sincronizar com o livro para se certificar de que não foi emitido nenhum erro. A maioria dos erros pode ser evitada ao verificar os objetos devolvidos a partir do livro. Por exemplo, o script seguinte verifica se a tabela devolvida pelo livro 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 registo da consola é uma ferramenta vital para depurar os scripts. No entanto, força o script a sincronizar com o livro para garantir que as informações registadas estão atualizadas. Considere remover instruções de registo desnecessárias (como as utilizadas para testes) antes de partilhar o script. Normalmente, isto não causa um problema de desempenho percetível, a menos que a console.log() instrução esteja num ciclo.
Colocar os cálculos em pausa enquanto os scripts são executados
Se o script alterar muitos valores, poderá acionar recálculos excessivos. Controle o motor de cálculo do Excel ao definir o modo de cálculo como "manual" enquanto o script é executado. Utilize Application.setCalculation para mudar o Excel para recalcular fórmulas manualmente. Certifique-se de que devolve o livro ao modo de cálculo original quando terminar.
O exemplo seguinte mostra como alterar o modo de cálculo. Também demonstra como recalcular manualmente o livro 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 o Power Automate, cartões ajustáveis e outras funcionalidades de vários produtos, os detalhes da comunicação script-livro tornam-se mais complexos. Se precisar de ajuda para tornar a execução do script mais rápida, contacte o Microsoft Q&A. Certifique-se de que identifica a sua pergunta com "office-scripts-dev" para que os especialistas a possam encontrar e ajudar.