Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

APIs Google Discussion :

Exécution boucle trop longue


Sujet :

APIs Google

  1. #1
    Futur Membre du Club
    Homme Profil pro
    VDI
    Inscrit en
    mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : VDI

    Informations forums :
    Inscription : mars 2015
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Exécution boucle trop longue
    Bonjour, j’espère être sur le bon forum.

    je débute depuis peu sur les macros dans les tableaux Google Sheet, j'ai écrit un code pour automatisé l'un de mes tableurs et le code fonctionne parfaitement, MAIS il est très long à s’exécuter. cela se passe au niveau de la boucle For quand je recherche une valeur dans le tableau. si la valeur rechercher se trouve au début du tableau cava mais si elle est à la fin cela mes presque 1min pour la trouver. est il possible d'optimisé cela?? peut être existe il une fonction qui recherche directement une valeur dans un tableau???

    merci de votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    function ChoixPokestop() {
      var spreadsheet = SpreadsheetApp.getActive();
      var app = SpreadsheetApp;
      var classeur = app.getActiveSpreadsheet(); 
      var feuille = classeur.getActiveSheet();
      var lastrow = feuille.getLastRow();
      var ville = feuille.getRange('Feuil1!A2').getValue();
      var pokestop = feuille.getRange('Feuil1!B2').getValue();
      var quete = feuille.getRange('Feuil1!C2').getValue();
      var currentstop = "";
     
    if (pokestop != "")
      {
        if (quete != "")
        {
     
          pokestop = ville + ': ' + pokestop;
          // app.getUi().alert(pokestop);
     
          for(var i=4; i<=lastrow; i++)
          {
            currentstop = feuille.getRange(i, 1).getValue();
            //app.getUi().alert(currentstop);
     
            if (currentstop == pokestop)
            {
              feuille.getRange(i, 2).setValue(quete);
              Exit();
            }
     
          else
            {
              //app.getUi().alert("Vous devez d'abord choisir un Pokestop");
              feuille.getRange('Feuil1!C2').clearContent();
              feuille.getRange('Feuil1!B2').clearContent();
            }
         }
    feuille.getRange('Feuil1!B2').clearContent();
    feuille.getRange('Feuil1!C2').clearContent();
       }
     
     
      }

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    juin 2010
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 3 029
    Points : 6 559
    Points
    6 559
    Par défaut
    Bonjour,
    j’imagine que ce sera plus efficace, en effet, en utilisant une fonction de l’API. Essaye Range.createTextFinder()
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    VDI
    Inscrit en
    mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : VDI

    Informations forums :
    Inscription : mars 2015
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    bonjour Watilin,

    je ne comprend pas grand chose a cette fonction. Pour commencer j'imagine qu'elle vient en remplacement de ma boucle For!!?
    qu'est ce qu'est censé renvoyé firstOccurence? un String? un Range?
    la ligne app.getUi().alert(firstOccurrence); me renvoie "Range"

    et ma variable range est elle bien renseignée?

    je suis un peu perdu la

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    function ChoixPokestop() {
      var spreadsheet = SpreadsheetApp.getActive();
      var app = SpreadsheetApp;
      var classeur = app.getActiveSpreadsheet();  
      var feuille = classeur.getActiveSheet();
      var lastrow = feuille.getLastRow();
      var ville = feuille.getRange('Feuil1!A2').getValue();
      var pokestop = feuille.getRange('Feuil1!B2').getValue();
      var quete = feuille.getRange('Feuil1!C2').getValue();
      var currentstop = "";
      var range = feuille.getRange('A4:A'+lastrow);
     
    if (pokestop != "")
      {
        if (quete != "")
        {
     
          pokestop = ville + ': ' + pokestop;
          // app.getUi().alert(pokestop);
     
          var textFinder = range.createTextFinder(pokestop);
          var firstOccurrence = textFinder.findNext();
          app.getUi().alert(firstOccurrence);
     
    //      for(var i=4; i<=lastrow; i++)
    //      {
    //        currentstop = feuille.getRange(i, 1).getValue();
    //        //app.getUi().alert(currentstop);
    //        
    //        if (currentstop == pokestop)
    //        {
    //          feuille.getRange(i, 2).setValue(quete);
    //          Exit();
    //        }
     
    //      else
    //        {
    //          //app.getUi().alert("Vous devez d'abord choisir un Pokestop");
    //          feuille.getRange('Feuil1!C2').clearContent();
    //          feuille.getRange('Feuil1!B2').clearContent();
    //        }
           }
     
    //feuille.getRange('Feuil1!B2').clearContent();
    //feuille.getRange('Feuil1!C2').clearContent();
       }
     
     
      //}
     
     
     
     
    }

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    juin 2010
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 3 029
    Points : 6 559
    Points
    6 559
    Par défaut
    Citation Envoyé par ju89100 Voir le message
    je ne comprend pas grand chose a cette fonction. Pour commencer j'imagine qu'elle vient en remplacement de ma boucle For!!?
    Oui.
    qu'est ce qu'est censé renvoyé firstOccurence? un String? un Range?
    Un Range, comme indiqué dans la doc de findNext().

    et ma variable range est elle bien renseignée?
    Ta variable range doit correspondre à l’ensemble des cellules que ta boucle for visitait. Le textFinder va te renvoyer la première ou toutes les cellules contenant le texte recherché, selon que tu utilises findNext() ou findAll(). Avec cette dernière méthode, la valeur renvoyée est un tableau, il faut boucler dessus.

    Tu auras peut-être besoin de Range.getColumn() ou Range.getRow(). N’oublie pas que tu peux utiliser la notation R1C1, qui s’avère plus pratique que A1 dans certains cas.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

Discussions similaires

  1. Ameliorer code : Boucle trop longue
    Par diego45 dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/12/2014, 11h55
  2. Boucle trop longue
    Par Vivien57 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 11/05/2011, 09h49
  3. Réponses: 9
    Dernier message: 24/12/2007, 12h27
  4. [debutant] boucle trop longue?
    Par dolu02 dans le forum Langage
    Réponses: 3
    Dernier message: 30/04/2007, 17h17
  5. Requete trop longue à exécuter
    Par fguilbert dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/06/2006, 11h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo