IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Recherche d'un mot dans la page [Google Sheets]


Sujet :

APIs Google

  1. #1
    Futur Membre du Club
    Homme Profil pro
    ThexProdige
    Inscrit en
    Février 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : ThexProdige
    Secteur : Service public

    Informations forums :
    Inscription : Février 2019
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Recherche d'un mot dans la page
    Bonjour,
    j'utilise google script depuis peu, et j'aimerais a l'aide d'un bouton ajouté dans une cellule précise sont contenu

    Voici comment ça se comporte :
    https://puu.sh/CPbih/d47997bdae.png

    Dans cette feuille je met simplement les informations à chercher et le "nombre" à ajouter dans la cellule qu'il aura trouvé.

    la feuille ou le script doit chercher les info est :

    https://puu.sh/CPbhT/83265bea39.png

    Donc dans cette exemple je souhaite que le script trouve "C3" et ajoute le contenu en conséquence.
    Merci de votre aide

  2. #2
    Futur Membre du Club
    Homme Profil pro
    ThexProdige
    Inscrit en
    Février 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : ThexProdige
    Secteur : Service public

    Informations forums :
    Inscription : Février 2019
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Résolu
    Après réflexion j'y suis arrivé seul!

    Si ça peut aidé les autres voici le code

    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
     
    function myFunction() {
      var ss = SpreadsheetApp.getActiveSpreadsheet() 
      var sheet = ss.getActiveSheet() //feuille active ou vas etre recuperer les donnees
     
      //--------------RECUP DONNEES-----------------
      var donnee = [] //tableau on stoks les données à appliquer
      var caseProduit = sheet.getRange(4,3).getValue();//Nom des produits cellule(C4)
     
      donnee[0] = sheet.getRange(4,2).getValue();//trouver la cellule (Ligne,Colonne) (B4) puis recuperer sa valeur du Nom
      donnee[2] = sheet.getRange(4,4).getValue();//Quantité de produits
     
      if (caseProduit == "Orges") { //simple comparaison pour déterminer la colonne de la feuille Stocks
        donnee[1] = 3;
     
      } else if (caseProduit == "Filets de poulets"){
        donnee[1] = 4; 
     
      } else {
        return 0;//fin de la fonction si aucun des deux
      }
     
     
       //sheet.getRange(9,2).setValue(range);//fonction de test
     
    //-------------------FIN RECUP DONNEES-----------------
     
     
      sheet = ss.getSheetByName("Stocks") //on selectionne la feuille de calcul
     
      var ligne = 3; //la ligne ou commence la recherche
      var range = sheet.getRange(ligne,2);
      var offset = range.getValue(); 
     
      while(offset != donnee[0]){ //tant que la valeur de offeset n'est pas egal a un nom
        ligne++;//incrementation de la ligne
     
        range = sheet.getRange(ligne,2);
        offset = range.getValue();
     
        if (ligne>14){//pour eviter la boucle infini 
          return 0;
        }
     
      }
     
      var contenu = sheet.getRange(ligne,donnee[1]).getValue(); //recupere le contenu de la cellule 
      sheet.getRange(ligne,donnee[1]).setValue(contenu + donnee[2]); //additionner le contenu en plus de la valeur
     
    }

  3. #3
    Membre confirmé

    Homme Profil pro
    Chomeur
    Inscrit en
    Juin 2006
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 347
    Points : 452
    Points
    452
    Par défaut
    Bonjour,

    Très bon réflexe de venir poster la solution trouvée !

    Juste une petite remarque en passant : l'algo est satisfaisant sous cette forme (parcours cellule à cellule) tant que le volume de données reste raisonnable. Mais si il doit y avoir plusieurs centaines de lignes à traiter, les performances vont s'effondrer (probablement plusieurs secondes de traitement). Il est alors possible de conserver les performances actuelles (probablement autour de 1 seconde) en utilisant "getValues" et "setValues" de façon à accéder le moins possible au spreadsheet (récupération de l'ensemble des valeurs, parcours et transformation en un tableau de résultats en pur JS/GS, puis ré-injection en une seule fois). Les premières webapp que j'ai développées en GAS ont toutes connues ce problème alors je crois que cela peut servir de faire un peu de prévention

    Bon courage !

  4. #4
    Futur Membre du Club
    Homme Profil pro
    ThexProdige
    Inscrit en
    Février 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : ThexProdige
    Secteur : Service public

    Informations forums :
    Inscription : Février 2019
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    D'accord, merci pour l'astuce. J'en prendrais compte !

    J'ai mit aussi dans ma boucle la condition SI mais normalement elle ne serre à rien, mais c'est une mesure de prévention

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2016
    Messages : 2
    Points : 5
    Points
    5
    Par défaut Même problème
    Bonjour,
    Je viens de tomber sur votre réaction à un problème de recherche et au temps de traitement. Il se trouve que je suis dans cette situation. Je débute plus ou moins en programmation, et je dois mettre au point un script qui me permet de trouver des valeurs (mails) dans un tableau de 1800 lignes pour les enregistrer dans un tableau de 1600 lignes. 15 minutes ne suffisent pas !

    Comment faites-vous pour créer un tableau de réponse et l'injecter en une seul fois ?
    La fonction 'Recherche et remplace' du tableau fonctionne très bien; est-il possible de faire appel à cette fonction dans le script ? Ou sommes-nous obligés de faire une recherche de valeur ligne à ligne ?

    Merci par avance

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 089
    Points : 44 660
    Points
    44 660
    Par défaut
    Bonjour,
    regarde l'approche faite dans cette discussion : Temps d'exécution tableau long.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2016
    Messages : 2
    Points : 5
    Points
    5
    Par défaut Solution
    Merci pour votre aide !
    En suivant cette idée de travailler sur les range() plutôt que dans le classeur, j'ai refait mon programme, que voici. Les anciennes commandes sont en commentaires ; j'y manipulais directement la feuille de calcul. C'était extrêmement long : 15min ne suffisaient pas à arriver au bout, avec des erreurs incompréhensibles à mon niveau.
    Avec le nouveau programme, il s'exécute en 35 secondes environ !!
    Pour rappel il s'agit de trouver des données dans un tableau de 1800 lignes qu'on enregistre ensuite dans un autre tableau de 1600 lignes et 17 colonnes.

    --------------------------------------------------------------
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    function mail_parents(){
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var Effectifs = ss.getSheetByName('Effectifs');
      var Listing = ss.getSheetByName('Listing');
      var Erreurs = ss.getSheetByName('Erreurs');
      var Test = ss.getSheetByName('Test');
      var range_Eff = Effectifs.getDataRange();
      var values_Eff = range_Eff.getValues();
      var range_List = Listing.getDataRange();
      var values_List = range_List.getValues();
      var id_List = "";
      var id_Eff = "";
      var mail1 = "";
      var mail2 = "";
      var compteur_Eff = 0;
      var nb_mail = 0;
     
      Logger.log("Début");  
     
     
      /* PARCOURIR LE LISTING ET ENREGISTRER L'ID DE CHAQUE ELEVE */
      var rang_List = 2;
      while(rang_List<values_List.length-2){ //values_List.length){
        id_List = values_List[rang_List][4]; //Listing.getRange(rang_List+3,5).getValue();
          //classe_List = Listing.getRange(rang_List+3,4).getValue();
     
          /* PARCOURIR EFFECTIF ET COMPARER A LA RECHERCHE DU BON ELEVE */
        var rang_Eff = 1; 
        id_Eff = values_Eff[rang_Eff][2]; //Effectifs.getRange(rang_Eff+2,3).getValue(); 
        while(rang_Eff<values_Eff.length-1 && id_Eff!=id_List){ //values_Eff.length-2 && id_Eff!=id_List){
            rang_Eff++;
            id_Eff = values_Eff[rang_Eff][2]; //Effectifs.getRange(rang_Eff+2,3).getValue(); //enregistrer l'identifiant
        }  //while rang_Eff
     
     
          /* On trouve une correspondance */
          if(id_List == id_Eff){
            /* Compter les mails déjà inscrits pour décaller */
            var compteur_mail = 0
            var m=12; //colonne L
            mail1 = values_List[rang_List][7]; //Listing.getRange(rang_List+3,8).getValue();
            mail2 = values_List[rang_List][10]; //Listing.getRange(rang_List+3,11).getValue();
     
            for(var p=0;p<7;p++){
              if(values_Eff[rang_Eff][p+m-1]!=""){     //Effectifs.getRange(rang_Eff+2,p+m).getValue()!=""){
                if(values_Eff[rang_Eff][p+m-1]==mail1){   //Effectifs.getRange(rang_Eff+2,p+m).getValue()==mail1){
                  mail1 = "";
                }
                if(values_Eff[rang_Eff][p+m-1]==mail2){ //Effectifs.getRange(rang_Eff+2,p+m).getValue()==mail2){
                  mail2 = "";
                }
                compteur_mail++;
              }
            }
            /* Enregistrement des mails des parents dans une case vide (max 6) */
     
            if(mail1==mail2){
              range_Eff.getCell(rang_Eff+1, m+compteur_mail).setValue(mail1); //Effectifs.getRange(rang_Eff+2,m+compteur_mail).setValue(mail1);
            }
            if(mail1=="" && mail2!=""){
              range_Eff.getCell(rang_Eff+1,m+compteur_mail).setValue(mail2); //Effectifs.getRange(rang_Eff+2,m+compteur_mail).setValue(mail2);
            }
            else{
              range_Eff.getCell(rang_Eff+1,m+compteur_mail).setValue(mail1); //Effectifs.getRange(rang_Eff+2,m+compteur_mail).setValue(mail1);
              range_Eff.getCell(rang_Eff+1,m+1+compteur_mail).setValue(mail2); //Effectifs.getRange(rang_Eff+2,m+1+compteur_mail).setValue(mail2);
            }
     
     
            }
        rang_List++;
          }
      //range_Eff.copyTo(Erreurs.getRange(1,1));  ---permet de copier l'ensemble RANGE (range_Eff) en une seule fois où l'on veut.
      Logger.log("Fin");
    }
    ----------------------------------------------

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche d'un mot dans la page
    Par splif dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/08/2013, 11h55
  2. recherche d'un mot dans une page web
    Par fraisa1985 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 23/10/2008, 15h59
  3. Réponses: 1
    Dernier message: 17/08/2007, 15h19
  4. module de recherche de mots dans une page html
    Par Drozo dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/08/2006, 09h57
  5. Recherche d'un mot dans une page
    Par Emcd dans le forum Langage
    Réponses: 4
    Dernier message: 12/01/2006, 18h25

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