Meilleures pratiques en matière de scripts Office

Ces modèles et pratiques sont conçus pour aider vos scripts à s’exécuter correctement à chaque fois. Utilisez-les pour éviter les pièges courants lorsque vous commencez à automatiser votre workflow Excel.

Utiliser l’enregistreur d’actions pour découvrir de nouvelles fonctionnalités

Excel fait beaucoup de choses. La plupart d’entre eux peuvent être scriptés. L’enregistreur d’actions enregistre vos actions Excel et les traduit en code. Il s’agit du moyen le plus simple d’en savoir plus sur le fonctionnement des différentes fonctionnalités avec les scripts Office. Si vous avez besoin de code pour une action spécifique, basculez vers l’enregistreur d’actions, effectuez les actions, sélectionnez Copier en tant que code et collez le code obtenu dans votre script.

Volet des tâches de l’enregistreur d’actions avec le bouton « Copier en tant que code » en surbrillance.

Importante

Parfois, l’enregistreur d’actions peut utiliser une API qui n’est pas prise en charge en dehors de Excel sur le Web. Les utilisateurs de ce script sur d’autres plateformes reçoivent un avertissement lors de l’affichage de ce script.

Vérifier la présence d’un objet

Les scripts s’appuient souvent sur une certaine feuille de calcul ou table présente dans le classeur. Toutefois, ils peuvent être renommés ou supprimés entre les exécutions de script. En vérifiant si ces tables ou feuilles de calcul existent avant d’appeler des méthodes sur celles-ci, vous pouvez vous assurer que le script ne se termine pas brusquement.

L’exemple de code suivant vérifie si la feuille de calcul « Index » est présente dans le classeur. Si la feuille de calcul est présente, le script obtient une plage et procède. S’il n’est pas présent, le script enregistre un message d’erreur personnalisé.

// Make sure the "Index" worksheet exists before using it.
let indexSheet = workbook.getWorksheet('Index');
if (indexSheet) {
  let range = indexSheet.getRange("A1");
  // Continue using the range...
} else {
  console.log("Index sheet not found.");
}

L’opérateur TypeScript ? vérifie si l’objet existe avant d’appeler une méthode. Cela peut simplifier votre code si vous n’avez pas besoin de faire quelque chose de spécial lorsque l’objet n’existe pas.

// The ? ensures that the delete() API is only called if the object exists.
workbook.getWorksheet('Index')?.delete();

Valider d’abord l’état des données et du classeur

Assurez-vous que toutes vos feuilles de calcul, tables, formes et autres objets sont présents avant de travailler sur les données. À l’aide du modèle précédent, case activée pour voir si tout se trouve dans le classeur et correspond à vos attentes. Cela avant l’écriture des données garantit que votre script ne laisse pas le classeur dans un état partiel.

Le script suivant requiert la présence de deux tables nommées « Table1 » et « Table2 ». Le script vérifie d’abord si les tables sont présentes, puis se termine par l’instruction return et un message approprié si ce n’est pas le cas.

function main(workbook: ExcelScript.Workbook) {
  // These tables must be in the workbook for the script.
  const TargetTableName = 'Table1';
  const SourceTableName = 'Table2';

  // Get the table objects.
  let targetTable = workbook.getTable(TargetTableName);
  let sourceTable = workbook.getTable(SourceTableName);

  // Check if the tables are there.
  if (!targetTable || !sourceTable) {
    console.log(`Required tables missing - Check that both the source (${TargetTableName}) and target (${SourceTableName}) tables are present before running the script.`);
    return;
  }

  // Continue...
}

Si la vérification se produit dans une fonction distincte, vous devez quand même mettre fin au script en émettant l’instruction return à partir de la main fonction . Le retour à partir de la sous-fonction ne met pas fin au script.

Le script suivant a le même comportement que le précédent. La différence est que la main fonction appelle la inputPresent fonction pour tout vérifier. inputPresent retourne une valeur booléenne (true ou false) pour indiquer si toutes les entrées requises sont présentes. La main fonction utilise cette valeur booléenne pour décider de la poursuite ou de la fin du script.

function main(workbook: ExcelScript.Workbook) {

  // Get the table objects.
  if (!inputPresent(workbook)) {
    return;
  }

  // Continue...
}

function inputPresent(workbook: ExcelScript.Workbook): boolean {
  // These tables must be in the workbook for the script.
  const TargetTableName = 'Table1';
  const SourceTableName = 'Table2';

  // Get the table objects.
  let targetTable = workbook.getTable(TargetTableName);
  let sourceTable = workbook.getTable(SourceTableName);

  // Check if the tables are there.
  if (!targetTable || !sourceTable) {
    console.log(`Required tables missing - Check that both the source (${TargetTableName}) and target (${SourceTableName}) tables are present before running the script.`);
    return false;
  }

  return true;
}

Quand utiliser une throw instruction

Une throw instruction indique qu’une erreur inattendue s’est produite. Il met fin au code immédiatement. Dans la plupart des cas, vous n’avez pas besoin de le faire à throw partir de votre script. En règle générale, le script informe automatiquement l’utilisateur que l’exécution du script a échoué en raison d’un problème. Dans la plupart des cas, il suffit de terminer le script avec un message d’erreur et une return instruction de la main fonction.

Toutefois, si votre script s’exécute dans le cadre d’un flux Power Automate, vous souhaiterez peut-être arrêter la poursuite du flux. Une throw instruction arrête le script et indique au flux de s’arrêter également.

Le script suivant montre comment utiliser l’instruction throw dans l’exemple de vérification de table.

function main(workbook: ExcelScript.Workbook) {
  // These tables must be in the workbook for the script.
  const TargetTableName = 'Table1';
  const SourceTableName = 'Table2';

  // Get the table objects.
  let targetTable = workbook.getTable(TargetTableName);
  let sourceTable = workbook.getTable(SourceTableName);

  // Check if the tables are there.
  if (!targetTable || !sourceTable) {
    // Immediately end the script with an error.
    throw `Required tables missing - Check that both the source (${TargetTableName}) and target (${SourceTableName}) tables are present before running the script.`;
  }
  

Quand utiliser une try...catch instruction

L’instruction try...catch est un moyen de détecter si un appel d’API échoue et de continuer à exécuter le script.

Prenons l’extrait de code suivant qui effectue une mise à jour de données volumineuse sur une plage.

range.setValues(someLargeValues);

Si someLargeValues est plus grand que Excel sur le Web peut gérer, l’appel setValues() échoue. Le script échoue ensuite également avec une erreur d’exécution. L’instruction try...catch permet à votre script de reconnaître cette condition, sans mettre immédiatement fin au script et afficher l’erreur par défaut.

Une approche pour offrir à l’utilisateur de script une meilleure expérience consiste à lui présenter un message d’erreur personnalisé. L’extrait de code suivant montre une try...catch instruction enregistrant plus d’informations sur les erreurs pour mieux aider le lecteur.

try {
    range.setValues(someLargeValues);
} catch (error) {
    console.log(`The script failed to update the values at location ${range.getAddress()}. Please inspect and run again.`);
    console.log(error);
    return; // End the script (assuming this is in the main function).
}

Une autre approche pour traiter les erreurs consiste à avoir un comportement de secours qui gère le cas d’erreur. L’extrait de code suivant utilise le catch bloc pour essayer une autre méthode pour diviser la mise à jour en morceaux plus petits et éviter l’erreur.

Conseil

Pour obtenir un exemple complet sur la mise à jour d’une grande plage, consultez Écrire un jeu de données volumineux.

try {
    range.setValues(someLargeValues);
} catch (error) {
    console.log(`The script failed to update the values at location ${range.getAddress()}. Trying a different approach.`);
    handleUpdatesInSmallerBatches(someLargeValues);
}

// Continue...
}

Remarque

L’utilisation try...catch d’une boucle à l’intérieur ou autour d’une boucle ralentit votre script. Pour plus d’informations sur les performances, consultez Éviter d’utiliser des try...catch blocs.

Voir aussi