Optimisation d'un script

Bonjour,

J'ai un script pour générer des combinaisons avec certaines contraintes, mais je trouve que celui ci met beaucoup de temps à les écrire sur ma feuille (plus ou moins 6 minutes pour générer et écrire 13125 combinaisons).

je n'ai que très peu de connaissance dans les scripts, j'ai donc utilisé ChatGPT pour m'aider a le faire.

Je recherche des pistes pour réduire au maximum la durée d'éxécution du script.

Merci à ceux qui prendront le temps de me lire et de m'aider.

Voici le document avec les scripts :

https://docs.google.com/spreadsheets/d/1abAkxOm47lVV1fIGUWRelJflMOy_2pPOnYMQnVGasqU/copy?gid=1614958...

Salut,

En effet, les scripts de ce fichier ne sont pas des plus optimisés, j'ai mis des timers et voici ce que donne une exécution de generateCombinations :

15:42:54    Avis    Exécution démarrée
15:42:55    Infos    generateCombinations OPEN
15:43:04    Infos    generateValidCombinations OPEN
15:43:04    Débogage    generateValidCombinations: 150ms
15:43:04    Infos    generateValidCombinations CLOSE
15:43:04    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 107ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 40ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 18ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 52ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 17ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 5ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 2ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 2ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 2ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 1ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 1ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 2ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 2ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 1ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 1ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 2ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 3ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 1ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 2ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 1ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 3ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 2ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Infos    generateValidCombinations OPEN
15:43:05    Débogage    generateValidCombinations: 1ms
15:43:05    Infos    generateValidCombinations CLOSE
15:43:05    Débogage    generateCombinations: 10236ms
15:43:05    Infos    generateCombinations CLOSE
15:43:05    Infos    insertValidCombinationsInBatches OPEN
15:47:30    Débogage    insertValidCombinationsInBatches: 265122ms
15:47:30    Infos    insertValidCombinationsInBatches CLOSE
15:48:20    Avis    Exécution terminée

Comme on peut le voir, c'est insertValidCombinationsInBatches qui pose le plus problème.

Voici un test, je pars de ta fonction initale qui est très couteuse en ressource car intervient sur la feuille à chaque ligne :

// Fonction pour insérer les combinaisons valides en petits blocs
function insertValidCombinationsInBatches(sheet, allValidCombinations) {
  console.time('insertValidCombinationsInBatches');
  console.log('insertValidCombinationsInBatches OPEN');

  if (allValidCombinations.length > 0) {
    const finalCombinations = allValidCombinations.map(row => row.slice(1)); // Supprimer la somme
    const batchSize = 500; // Insérer par lots de 500 combinaisons

    for (let i = 0; i < finalCombinations.length; i += batchSize) {
      const chunk = finalCombinations.slice(i, i + batchSize);
      sheet.getRange(2 + i, 1, chunk.length, 15).setValues(chunk);
    }

    // Alerte de fin d'exécution après que toutes les combinaisons aient été insérées
    SpreadsheetApp.getUi().alert("Le script s'est terminé avec succès. Combinaisons générées.");
  } else {
    SpreadsheetApp.getUi().alert("Aucune combinaison trouvée avec les contraintes actuelles.");
  }
  console.timeEnd('insertValidCombinationsInBatches');
  console.log('insertValidCombinationsInBatches CLOSE');
}

Le délaisest je pense dû à la ligne :

    const finalCombinations = allValidCombinations.map(row => row.slice(1)); // Supprimer la somme

Car elle intervient sur CHAQUE donnée de manière unitaire, essaye de gérer cela lors de la génération de allValidCombinations ?

Ensuite, au lieu de faire ça :

    const batchSize = 500; // Insérer par lots de 500 combinaisons

    for (let i = 0; i < finalCombinations.length; i += batchSize) {
      const chunk = finalCombinations.slice(i, i + batchSize);
      sheet.getRange(2 + i, 1, chunk.length, 15).setValues(chunk);
    }

Tu peux tout insérer en une étape :

    const range = sheet.getRange(2, 1, finalCombinations.length, finalCombinations[0].length);
    range.setValues(finalCombinations);

+ j'ai l'impression qu'il y a beaucoup de manipulations superflues.

Bonjour,

Merci pour votre réponse, j'ai mis en place les solutions que vous m'avez proposé et cela à réduit le temps d'éxécution de presque 40 secondes. Je vais éssayer de faire la chasse aux actions superflues pour l'optimiser un peu plus.

Encore merci !

Bonjour,

Je pense qu'il est possible, en repensant l'architecture de votre script d'améliorer grandement le temps d'exécution, là par exemple, je suis sur un fichier d'environ 38k lignes et un traitement se fait en moins de 30 secondes, il faut penser l'architecture globale puis, aller dans le détail.

Rechercher des sujets similaires à "optimisation script"