Page 1 sur 1

script très lent

Publié : 30 oct. 2023 23:06
par TheZig
Bonjour,

J'ai 2 onglets: un appelé Donnees, et un autre appelé CH qui contient un query de la feuille Données ce qui donne une liste sur laquelle je rajoute une case à cocher à chaque bout de ligne.
Voici la macro que j'ai écrite:
function  majCH() {
const LastRow = FeuillCH.getLastRow();  // on trouve la dernière ligne
const cellDateEch = FeuillCH.getRange("E2").getValues();
 for (li=5; li<=LastRow; li++) //parcours des lignes 5 à dernière non vide
  {
    let idAdherent = FeuillCH.getRange('A'+li).getValue();
    const numeroLigne = trouverAdherentParSonId(idAdherent);

 Logger.log('numeroLigne: '+numeroLigne)

       if (numeroLigne > 0)
//si on trouve l'adhérent
      {
 //on va chercher la valeur de la case sur la ligne col G
        let rapproch = FeuillCH.getRange('G'+li).getValue(); 
       
          if (rapproch == true)   
// si la case est sur True
            {
          //on va dans la feuille Données sur la cellule de la colonne qui est indiquée en E2 sur CH (ex:Z pour Ech1)
             cellCol = FeuilleDonnees.getRange(cellDateEch+numeroLigne);
                 //on y insère la date du jour
            cellCol.setValue(new Date());
             FeuilleDonnees.getRange('AL' +numeroLigne).setValue(new Date());    //on ajoute la date du jour de modif
            FeuillCH.deleteRow(li); // on supprime toute la ligne traitée, mais en fait on ne supprime réellement que la case puisque la liste est issue d'un query           
          
      }
  } 
}
Le traitement est très lent, y aurait-il moyen de modifier le code pour le rendre plus rapide ?

Re: script très lent

Publié : 31 oct. 2023 09:29
par NC-Ahmet
Hello,

Oui ton script est trop lent pour une raison très simple : tu fais énormément de requêtes ! 🤯

Tu fais une boucle dans laquelle à chaque répétition tu fais un "getRange()", puis "setValue()", puis "getRange()" à nouveau, puis "deleteRow()". Et ce, à chaque itération !

Un conseil : fais plutôt setValues() en dehors de ta boucle. L'idée c'est que tu récupères une plage entière, tu la manipules en Apps Script puis tu la réinjectes dans Sheets.

Change ton approche.

Je t'invite à lire la page suivante qui évoque les meilleures pratiques à avoir dans Google Apps Script.

Bonne journée !

Re: script très lent

Publié : 31 oct. 2023 16:12
par TheZig
Merci pour le lien, je vais lire avec attention

J'ai bien compris le principe pour le setValues, mais...

justement, comme je l'ai écrit sur un autre fil, mon problème est très bête:  comment récupérer la plage entière après ma boucle ?

Edit: début de réponse sur le lien...

que pourrais-je lire comme doc qui m'explique un peu mieux cette histoire de tableau ? 

Re: script très lent

Publié : 31 oct. 2023 16:26
par NC-Ahmet
Hello,

Google ainsi que la documentation JavaScript officielle seront tes amis ! Sinon aujourd'hui on a des outils d'IA géniaux... Je pense notamment à ChatGPT, Google Bard, ou encore Phind.com (ce dernier étant très pratique pour le dev).

Tu peux directement effectuer des demandes, par exemple sur phind.com, en demandant "comment manipuler un tableau JS afin de faire ça, ça et ça, j'utilise Google Apps Script". Tu peux même y intégrer ton code et il t'aidera à le corriger.

Tu peux même lui demander de t'expliquer. Attention, garde toujours un esprit critique, l'IA peut se tromper parfois ! Mais son aide peut-être très précieuse aussi...

A+ et bon scripting ! :)

Re: script très lent

Publié : 31 oct. 2023 21:56
par TheZig
Ah oui, l'IA, ça fait un moment que j'y ai songé, et vu ce que tu me dis, qu'il peut expliquer (j'aime comprendre ce que je fais) je vais voir ça de plus près. Merci