Partager via


Améliorer les performances de vos scripts Office

L’objectif des scripts Office est d’automatiser des séries de tâches couramment effectuées pour vous faire gagner du temps. Un script lent peut avoir l’impression qu’il n’accélère pas votre workflow. La plupart du temps, votre script sera parfaitement correct et exécuté comme prévu. Toutefois, il existe quelques scénarios évitables qui peuvent affecter les performances.

Réduire le nombre d’appels en lecture ou en écriture

La raison la plus courante d’un script lent est une communication excessive avec le classeur. Cela est particulièrement visible lors de l’utilisation de Excel sur le Web. À certains moments, votre script synchronise ses données locales avec celle du classeur. Cela signifie que toutes les opérations d’écriture (telles que workbook.addWorksheet()) sont appliquées au classeur uniquement lorsque cette synchronisation en arrière-plan se produit. De même, toutes les opérations de lecture (telles que myRange.getValues()) obtiennent uniquement les données du classeur pour le script à ce moment-là. Dans les deux cas, le script extrait les informations avant d’agir sur les données. Par exemple, le code suivant journalise avec précision le nombre de lignes dans la plage utilisée.

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);

Les API Scripts Office garantissent que toutes les données du classeur ou du script sont exactes et à jour si nécessaire. Vous n’avez pas besoin de vous soucier de ces synchronisations pour que votre script s’exécute correctement. Toutefois, une connaissance de cette communication script-à-cloud peut vous aider à éviter les appels réseau inutiles.

Lire des données de classeur en dehors d’une boucle

Toute méthode qui obtient des données à partir du classeur peut déclencher un appel réseau. Au lieu d’effectuer le même appel à plusieurs reprises, vous devez enregistrer les données localement dans la mesure du possible. Cela est particulièrement vrai lorsque vous traitez des boucles.

Envisagez un script pour obtenir le nombre de nombres négatifs dans la plage utilisée d’une feuille de calcul. Le script doit itérer sur chaque cellule de la plage utilisée. Pour ce faire, il a besoin de la plage, du nombre de lignes et du nombre de colonnes. Vous devez les stocker sous forme de variables locales avant de démarrer la boucle. Sinon, chaque itération de la boucle force un retour au classeur.

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

Remarque

En tant qu’expérience, essayez de usedRangeValues remplacer dans la boucle par usedRange.getValues(). Vous remarquerez peut-être que l’exécution du script prend beaucoup plus de temps lorsque vous traitez de grandes plages.

Évitez d’utiliser des try...catch blocs dans ou autour des boucles

Nous vous déconseillons d’utiliser des try...catch instructions dans des boucles ou des boucles environnantes. C’est pour la même raison que vous devez éviter de lire les données dans une boucle : chaque itération force le script à se synchroniser avec le classeur pour s’assurer qu’aucune erreur n’a été générée. La plupart des erreurs peuvent être évitées en vérifiant les objets retournés à partir du classeur. Par exemple, le script suivant vérifie que la table retournée par le classeur existe avant d’essayer d’ajouter une ligne.

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

Supprimer les instructions inutiles console.log

La journalisation de la console est un outil essentiel pour le débogage de vos scripts. Toutefois, il force le script à se synchroniser avec le classeur pour s’assurer que les informations journalisées sont à jour. Envisagez de supprimer les instructions de journalisation inutiles (telles que celles utilisées pour les tests) avant de partager votre script. Cela n’entraîne généralement pas de problème de performances notable, sauf si l’instruction console.log() est dans une boucle.

Suspendre les calculs pendant l’exécution des scripts

Si votre script modifie un grand nombre de valeurs, il peut déclencher des recalculs excessifs. Contrôlez le moteur de calcul Excel en définissant le mode de calcul sur « manuel » pendant l’exécution de votre script. Utilisez Application.setCalculation pour basculer Excel pour recalculer manuellement les formules. Veillez à retourner le classeur au mode de calcul d’origine lorsque vous avez terminé.

L’exemple suivant montre comment modifier le mode de calcul. Il montre également comment recalculer manuellement le classeur avec 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);
}

Aide au cas par cas

À mesure que la plateforme Scripts Office s’étend pour fonctionner avec Power Automate, les cartes adaptatives et d’autres fonctionnalités inter-produits, les détails de la communication script-classeur deviennent plus complexes. Si vous avez besoin d’aide pour accélérer l’exécution de votre script, contactez microsoft Q&R. Veillez à baliser votre question avec « office-scripts-dev » afin que les experts puissent la trouver et l’aider.

Voir aussi