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 :

Signification de formule.match(/\((.*)\;/).pop() [Google Sheets]


Sujet :

APIs Google

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Par défaut Signification de formule.match(/\((.*)\;/).pop()
    Bonjour,
    J'ai trouvé, sur internet (forum Google+), un script écrit en JavaScript pour compter, dans une feuille de calcul, le nombre de cellules d'une couleur donnée dans une plage donnée. Je déteste faire du copier-coller sans comprendre (mon langage habituel étant Delphi). Voici cette fonction :

    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
    function CompteCouleurs(plage,couleur) {
      var activeRange = SpreadsheetApp.getActiveRange();
      var activeSheet = activeRange.getSheet();
      var formule = activeRange.getFormula();
     
     
      var laplage = formule.match(/\((.*)\;/).pop();
      var range = activeSheet.getRange(laplage);
      var bg = range.getBackgrounds();
      var values = range.getValues();
     
      var lacouleur = formule.match(/\;(.*)\)/).pop();
      var colorCell = activeSheet.getRange(lacouleur);
      var color = colorCell.getBackground();
     
     var count = 0;
     
     
      for(var i=0;i<bg.length;i++)
        for(var j=0;j<bg[0].length;j++)
          if( bg[i][j] == color )
          count=count+1;
          return count;
    };
    J'ai 2 ou 3 questions sur cette fonction :
    1) Pourquoi les variables "plage" et "couleur", transmis en paramètre, ne sont-ils jamais utilisé dans le code de la fonction ?
    2) Que signifie précisément le passage formule.match(/\((.*)\;/).pop() ? Je sais que la méthode "match" s'applique sur une chaîne de caractères pour chercher une occurrence dans une expression régulière, mais là, je n'y comprends rien !
    3) La variables tableau "values" est sans doute inutile ici, n'est-ce pas ?


    Merci de m'éclairer.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Par défaut
    J'ai commencé à trouver des réponses à mes questions :
    1) Les paramètres "plage" et "couleur" ne servent à rien ! On peut les supprimer sans dommage pour le fonctionnement de la fonction. Leur seule utilité est de rappeler à l'utilisateur qu'il doit rentrer 2 paramètres, comme par exemple =SommeCouleurs(A1:C7;A9) où A1:C7 est la plage de cellules diversement colorées et A9 est la cellule dont le fond correspond à la couleur cherchée. Je trouve très étonnant qu'un langage puisse autoriser de telles imprécisions...
    2) La ligne 6 qui contient var laplage = formule.match(/\((.*)\;/).pop(); m'a donné beaucoup plus de fil à retordre. La chaîne passée en paramètre de la méthode match contient une série de caractères encadrés par 2 slashs. Cette méthode match, appliquée à la chaîne de caractères formule, produit un tableau de 2 chaînes, dans l'ordre "(A1:C7;" et "A1:C7". Je crois comprendre que les caractères \( et \; servent de délimiteurs et que les caractères (.*) indiquent "texte quelconque entre les délimiteurs". La méthode pop() retire alors la dernière des 2 chaînes, soit la référence de la plage à explorer A1:C7.
    Je ne comprend pas pourquoi on ne pourrait pas tout simplement remplacer cette ligne 6 par "laplage = plage" en utilisant le premier paramètre de la fonction !

    Je marque "résolu" mais j'aimerais bien que quelqu'un me confirme si j'ai bien compris ou si j'ai loupé quelque chose.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    1 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 616
    Par défaut
    je sais pas trop ce que te renvoie getFormula() mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var laplage = formule.match(/\((.*)\;/).pop();
    teste dans la string une expression régulière (ou rationnelle) constituée d'une parenthèse, puis de n'importe quels caractères et enfin se terminant par ";". match() te renvoie un tableau des correspondances, il retire du tableau la dernière (de toute façon il n'y en a qu'une, la recherche n'est pas globale) avec pop()et te la retourne, et donc cette chaine de caractère est ensuite stockée dans la variable laplage

    un peu le même principe avec lacouleur, sauf qu'il va chercher la valeur après le ";"

    A mon sens, effectivement de toute façon, les paramètres de la fonction ne servent à rien, mais en réalité le script va chercher ces paramètres directement dans ton "SpreadsheetApp.getActiveRange()", donc les cases sélectionnées je présume.

    Tu as compris la suite ?

    Quel est ce tableur que l'on peut programmer en javascript stp ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Par défaut
    Quel est ce tableur que l'on peut programmer en javascript stp ?
    Il s'agit de Google sheets. J'avais déjà utilisé VBA sur Excel mais, pour le tableur Google Sheets, la programmation se fait en Javascript. J'ai du mal à m'habituer à ce langage, mais c'est normal quand on débute. L'intérêt principal de ce tableur c'est qu'il s'agit d'une application où les documents sont partageables par plusieurs utilisateurs distants. Les documents sont donc enregistrés dans le cloud de Google.

    Tu as compris la suite ?
    Oui à peu près. Cependant, dans la double itération "for", qui parcourt la plage de cellules, le nombre bg.length doit retourner la taille du tableau bg. Or bg est un tableau de cellules (par exemple la plage A1:C7) et, la taille doit être de 21 (dans mon exemple) je suppose. Ensuite, combien vaut bg[0].length ? La longueur longueur de la ligne 0 (3 dans mon exemple). Donc l'instruction intérieure va être exécutée 63 fois ? C'est curieux ...
    Enfin, dans la ligne total = total+(values[i][j]*1), je suppose que la multiplication par 1 permet d'obliger javascript à considérer qu'il s'agit d'un nombre (les variables ne sont pas typées au moment de leur déclaration).

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    1 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 616
    Par défaut
    oui le "*1" doit obliger à une conversion en nombre

    Visiblement getBackgrounds() te renvoie un tableau à 2 dimensions des codes de couleurs, d'où cette double boucle pour parcourir ce tableau. bg.length ne te renvoie que la longueur de la 1ère dimension du tableau, bg[0].length la seconde. Pour ton exemple 3 et 7 ou inversement

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Par défaut
    Bon j'ai maintenant à peu près tout compris.
    Je trouve quand même que c'est bien compliqué, le Javascript. Le passage des paramètres dans une fonction est vraiment très compliqué, pour ne pas dire imbuvable : ce qu'on gagne en souplesse (une même fonction peut avoir un nombre variable de paramètres, une variable n'a de type qu'au moment où on l'utilise, les noms des paramètres qui ne servent à rien) on le perd en complexité ... Mais bon, je ne suis pas forcément impartial
    Merci pour l'aide apportée.

  7. #7
    Membre expérimenté
    Inscrit en
    Août 2006
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 191
    Par défaut
    Salut,

    Je dirais que le bout de code trouvé est en cours de développement et donc incomplet et donc pas adapté à tes besoins.

    Je te propose donc plutôt de nous décrire tes besoins et nous te guiderons dans la réalisations de ton script.

    Mais si tu veux rapidement comprendre.

    1) aucune raison de les laissé là. le code n'est pas optimisé.
    2) en gros on prend une formule on en extrait tous les blocs entre une parenthèse et un point virgule et on garde la dernière occurrence trouvé. (EX: "DEBUT(1;(2;(3;(4;(5;(6;);FIN" le tableau d élément retournera ceci
    1 => "(1;(2;(3;(4;(5;(6;);" La chaine correspondant à l'intégralité de la regexp
    2 => "1;(2;(3;(4;(5;(6;)" La valeur correspondant à la capture (si tu as besoin d'explication sur la regexp n hésite pas à demander )

    la fonction retournera "1;(2;(3;(4;(5;(6;)"

    3) tu as entièrement raison, ça ne sert a rien (Sans doute la même explication que la première question)

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Par défaut
    Merci Showie

    Au bout de quelque jours, je me suis aperçu que je n'avais peut-être pas posé ma question dans le bon forum. Je l'avais donc reposée dans le sous-forum API Google car il s'agit d'une question concernant Google Apps Script qui est un sur ensemble de javascript adapté aux applications Google (notamment Google Maps, Google Sheets, Google Docs). Dans ce sous-forum, j'ai eu plusieurs réponses qui m'ont permis de comprendre presque tout. Il n'y a qu'une seule chose que je n'ai pas compris :

    Mon but était de mettre dans la cellule C9 du tableur la formule suivante : =CompteCouleurs(A1:C7;A9) où le décompte se ferait sur la plage A1:C7 et la couleur de référence serait la couleur de fond de la cellule A9. Naïvement, j'avais pensé qu'en invoquant cette formule (avec le code que j'avais trouvé), je pourrais obtenir un résultat plus simplement. Malheureusement, en examinant le debugger de Google Sheets, j'ai vu que les 2 plages A1:C7 et A9 n'étaient pas transmises dans les variables plage et couleur indiquées dans la définition de la fonction : ces variables restent "undefined" tout au long de l'exécution. C'est la raison pour laquelle on ne retrouve pas ces variables dans le code et que celui-ci les recalcule avec l'utilisation de la méthode "match" appliquée à la chaîne de caractères "formule" (correspondant à la formule récupérée dans la cellule active). Mon incompréhension vient évidemment du fait que je suis novice en javascript en ce qui concerne la transmission de valeurs aux paramètres d'une fonction. Quand j'utilisais Excel, j'étais beaucoup plus à l'aise avec le langage VBA pour lequel je retrouvais mes automatisme habituels (variables typées avant d'être affectées, transmissions des paramètres par valeur ou par variable ...)

    Encore merci pour tes explications sur les expressions régulières, mais ça, on me l'avait bien expliqué dans l'autre forum

  9. #9
    Invité de passage
    Homme Profil pro
    Photographe
    Inscrit en
    Novembre 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Photographe
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2020
    Messages : 1
    Par défaut
    Bonjour Patrice,

    je suis à la recherche du même script que vous pour compter les couleurs dans le tableur Google Doc, j' ai trouvé multiple script sur le web mais aucun ne fonctionne, avez-vous trouvé une solution?

    Cordialement.

    Phil

    Citation Envoyé par Showie Voir le message
    Salut,

    Je dirais que le bout de code trouvé est en cours de développement et donc incomplet et donc pas adapté à tes besoins.

    Je te propose donc plutôt de nous décrire tes besoins et nous te guiderons dans la réalisations de ton script.
    "bonjour
    je suis à la recherche de ce script, je ne suis pas Dev, mais un photographe qui a besoin de cette fonction pour faire un tableau de suivi de shoot.
    Pouvez vous m'aider.
    Merci


    Mais si tu veux rapidement comprendre.

    1) aucune raison de les laissé là. le code n'est pas optimisé.
    2) en gros on prend une formule on en extrait tous les blocs entre une parenthèse et un point virgule et on garde la dernière occurrence trouvé. (EX: "DEBUT(1;(2;(3;(4;(5;(6;);FIN" le tableau d élément retournera ceci
    1 => "(1;(2;(3;(4;(5;(6;);" La chaine correspondant à l'intégralité de la regexp
    2 => "1;(2;(3;(4;(5;(6;)" La valeur correspondant à la capture (si tu as besoin d'explication sur la regexp n hésite pas à demander )

    la fonction retournera "1;(2;(3;(4;(5;(6;)"

    3) tu as entièrement raison, ça ne sert a rien (Sans doute la même explication que la première question)

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/05/2020, 03h16
  2. [XL-2010] Formule "Match" pour creer une matrice de couverture
    Par tofoo dans le forum Excel
    Réponses: 4
    Dernier message: 26/07/2017, 10h50
  3. [Toutes versions] Problème avec Formule MATCH/EQUIV multicritères
    Par joel.drigo dans le forum Excel
    Réponses: 2
    Dernier message: 30/12/2016, 19h21
  4. [XL-2010] Formule "Match" (Equiv)
    Par toftaf dans le forum Excel
    Réponses: 3
    Dernier message: 03/08/2011, 11h01
  5. Signification ="";""; dans formule Excel
    Par vérokit dans le forum Excel
    Réponses: 4
    Dernier message: 04/02/2008, 12h08

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