Données d'un fichier dans un autre

Bonjour,

J'ai un tableau dans fichier A et un tableau dans le fichiet B.

Je voudrais comptabiliser le nombre d'occurence dans la colonne du tableau A pour l'afficher dans une colonne du fichier B.

Comment dois je m'y prendre ?

Bonjour,

Vous pouvez utiliser la Fonction Google Sheets : IMPORTRANGE

Bonjour,

Voici un exemple :

Fichier 1 :

image

Fichier 2 :

image

Pour ce faire, il faut :

  1. Importer les données du 1er fichier dans le 2nd fichier, à l'aide de la formule =IMPORTRANGE(
  2. Sélectionner le compte des données, à l'aide de QUERY(... ; "select COUNT(Col1)
  3. préciser qu'on le compte pour chaque élément et pas au global, en ajoutant une condition Si Col1 = B3 par ex pour pomme : where Col1 = '"&B3&"'
  4. on retire le label qui n'est pas utile ici label COUNT(Col1)''

Donc au final, la formule est, pour cet exemple : compter le nombre d’occurrence dans la colonne A de mon 1er fichier du mot situé dans mon 2nd fichier, en B3 est :

=query(IMPORTRANGE("https://docs.google.com/spreadsheets/d/18Lpvpmnzk1q2FZAqDHajjHtJudfgdzVNf_nDfgdfgkunY/edit?gid=0#gid=0";"Feuille 1!A1:A100");"select COUNT(Col1) where Col1 = '"&B3&"' label COUNT(Col1)'' ")

+ Il est possible de rendre la formule dynamique à une colonne pour ne pas la faire glisser avec un byrow + lambda mais là, on commencer à taper dans l'exotique :

=byRow(B3:B;lambda(fruit;SI(fruit<>"";query(IMPORTRANGE("https://docs.google.com/spreadsheets/d/18Lpvpmnzk1q2FZAqDHajjHtJudfgdzVNf_nDfgdfgkunY/edit?gid=0#gid=0";"Feuille 1!A1:A100");"select COUNT(Col1) where Col1 = '"&fruit&"' label COUNT(Col1)'' ");""))) 

Salut Pierre,

Juste pour compléter, pourquoi ne pas utiliser Group by et count dans la query directement ?

=QUERY(A3:A15;"SELECT Col1, COUNT(Col1) GROUP BY Col1 LABEL Col1 'Col. A', COUNT(Col1) 'Nb'")

Et pour le LAMBDA je paramétriserai la QUERY/IMPORTANGE dans un let car il y a un risque qu'elle soit réévalué à chaque call.

Salut Saboh,

Group By ne permet pas de compter par donnée précisément mais permet de faire une synthèse, si j'applique group by comme ceci :

=QUERY(IMPORTRANGE("https://docs.google.com/spreadsheets/d/18Lpvpmnzk1q2FZAqDHajjHtJudfgdzVNf_nDfgdfgkunY/edit?gid=0";"Feuille 1!A1:A100"); "SELECT Col1, COUNT(Col1) GROUP BY Col1 LABEL Col1 'Colonne A', COUNT(Col1) 'Nb'")

Voici le résultat :

image

On a une synthèse du tableau inital, mais pas un compte par item.

Pour ce qui est de transformer en LET, comme ceci ?

=LET(rows;B3:B;url;"https://docs.google.com/spreadsheets/d/18Lpvpmnzk1q2FZAqDHajjHtJudfgdzVNf_nDfgdfgkunY/edit?gid=0#gid=0";import;IMPORTRANGE(url;"Feuille 1!A1:A100");resultat; BYROW(rows; LAMBDA(fruit; SI(fruit<>""; QUERY(import; "select COUNT(Col1) where Col1 = '"&fruit&"' label COUNT(Col1)''");"")));resultat)

Cela permet un gain de performance ? Je me sers assez peu de LET(), hormis un gain de lisibilité qu'est ce que cette fonction apporte ?

Group By ne permet pas de compter par donnée précisément mais permet de faire une synthèse, si j'applique group by comme ceci :

J'ai peut-être mal compris la question, je pensais que l'objectif était de faire une synthèse. Bon peu importe, l'OP s'y retrouvera.

Pour ce qui est de transformer en LET, comme ceci ?

Pour LET, en toute honnêteté c'est une supposition, et à moins de travailler sur 100 000 lignes on ne verra sans doute pas de différence significative. Mais l'idée serait plutôt de stocker le résultat du IMPORTRANGE dans une variable, puis d'utiliser cette variable dans ton LAMBDA. Ainsi, tu t'assures que l'import n'est fait qu'une seule fois et non pas réévalué pour chaque ligne. C'est une supposition dans le sens où je ne sais pas si behind the scenes GSheets est assez malin pour voir que le LAMBDA utilise toujours le même tableau. Mais je sais qu'en utilisant le LET normalement t'as une variable en mémoire et évaluée 1x et réutilisée ensuite.

Donc au final, j'écrirai :

=LET(
  import; IMPORTRANGE(
    "https://docs.google.com/spreadsheets/d/18Lpvpmnzk1q2FZAqDHajjHtJudfgdzVNf_nDfgdfgkunY/edit?gid=0#gid=0";
    "Feuille 1!A1:A100"
  );
  BYROW(B3:B;
    LAMBDA(fruit;
      SI(fruit<>"";
        QUERY(import; "select COUNT(Col1) where Col1 = '"&fruit&"' label COUNT(Col1)''");
        ""
      )
    )
  )
)

Comme tu l'as fait, avec l'idée de garder l'import en mémoire.

alors faisons le test ?

Dans le fichier A, j'ai ajouté quelques données :

image

J'ai ensuite désactivé / réactivé la formule sans let, dans le fichier B et ça a mis environ 15 seconde à recharger les données.

J'ai fais de même avec la formule avec let, idem, même temps...

Bon, c'est pas la meilleurs méthodologie, avec les scripts c'est plus simple, on peut faire des milliers de tests et en faire un moyenne, pas là

Intéressant, donc il semblerait que GSheets soit intelligent et n'effectue le IMPORTRANGE qu'une seule fois pour toutes les lignes (Ou bien qu'il réévalue le LET à chaque itération mais ça le rendrait assez inutile…).

Donc a posteriori, dans ce cas, le LET n'a qu'une fonction de "lisibilité". Après en soit c'est logique, si GSheets fonctionne comme Excel, les fonctions sont évaluées "de l'intérieur vers l'extérieur", mais avec le LAMBDA+IMPORTRANGE je doutais de ce fonctionnement (car supposons que le IMPORTRANGE dépende du LAMBDA, par exemple on importe X lignes, alors il devrait être réévalué pour chaque ligne). Mais de toute évidence ça a bien été optimisé. Merci pour ton test, et je propose de continuer cette discussion en MP pour ne pas flood le fil.

Bonjour

Merci messieur pour ces solutions, je pense avoir compris ce qu'il faut que je fasse.

Je pensais que le mieux était de créer un onglet invisible et de faire un import range ...

Rechercher des sujets similaires à "donnees fichier"