Association d'identifiants de différents onglets

a marqué ce sujet comme résolu.

Bonjour à tous,

Je travaille sur GoogleSheet, et je suis bloquée sur une fonction qui prend beaucoup beaucoup beaucoup de temps à s’exécuter (mon fichier fait 140 000 lignes !!!). J’utilise 2 boucles FOR et 1 boucle IF imbriquées, et je voulais savoir si il existait une autre manière d’écrire un programme similaire au mien, afin que l’exécution soit plus rapide (Dictionnaire de données ? Boucles While ? Utilisation de Booléens ?)

Je vous pose mon problème : Dans un onglet 1 contenant 140 000 lignes, j’ai des identifiants, que je dois associer à un nom. Dans un onglet 2 contenant 300 lignes, j’ai l’ensemble des identifiants ainsi que leur noms associés. Je dois donc, pour chaque identifiant de mon onglet 1, rechercher le même dans l’onglet 2 afin de lui associé son nom.

Voici mon code :

function import() {

for (var i = 2 ; i < 140000 ; i++) // compteur lignes onglet 1
{    var id_Onglet_1 = sheetOnglet1.getRange(i, 7).getValues() ;
     for (var j = 2 ; j < 300 ; j++ ) // compteur lignes onglet 2  
     {    var id_Onglet_2 = sheetOnglet2.getRange(j, 2).getValues() ;
          var nom_Onglet_2 = sheetOnglet2.getRange(j, 1).getValues() ;
            if (id_Onglet_1[0][0] === id_Onglet_2[0][0])
            {   sheet.getRange(i, 6).setValue(nom_Onglet_2) ; }  
    }         
} 

}

Je voulais également savoir si il existait une fonction équivalente à "Screen UpDating" d’Excel pour GogleSheet ? Je pense que cela ferait gagner du temps à l’exécution de ma fonction

Je vous remercie d’avance pour le temps que vous me consacrerez et n’hésitez pas si vous n’avez pas bien compris mes explications ! :)

Là, pour chaque ligne de la première feuille, tu re-parcours toutes les lignes de la seconde feuille pour retrouver l’identifiant. La seconde feuille est donc parcourue 140 000 fois, ce qui fait 42 millions de comparaisons !

Une solution pour éviter ça, supposant que les données de la seconde feuille ne changent pas lors de l’exécution, serait de la parcourir une fois au début, de stocker l’association dans un tableau associatif ID → Nom, et pour chacune des lignes de la première feuille, récupérer directement la valeur du tableau associée à l’ID. Ainsi, on ne refait pas une recherche du nom à chaque fois (l’association étant stockée une bonne fois pour toutes dans un tableau) et on diminue considérablement le nombre d’itération (de 42 millions à 140k).

Je voulais également savoir si il existait une fonction équivalente à "Screen UpDating" d’Excel pour GogleSheet ? Je pense que cela ferait gagner du temps à l’exécution de ma fonction

Je l’ignore, ne connaissant pas l’API offerte par Google Sheets. Mais je suppose qu’ils ont une documentation ? Sinon, je laisse quelqu’un d’autre répondre à cette question :) .

+2 -0

En réalité le terme que j’ai utilisé est impropre, par habitude d’autres langages (mes excuses). En JS, les “tableaux associatifs” sont en fait de simples objets littéraux.

En très rapide, voilà comment on utilise des objets comme “pseudo tableau associatif” (c’est vraiment un condensé ^^ ), mais n’hésite pas à aller trouver plus ample documentation sur internet (en particulier sur le Mozilla Developers Network, la bible).

>>> the_id = '7786f053'

// Création avec une paire d'accolades. On peut pré-remplir aussi : cf. doc.
>>> names = {}

// Ajout d'une valeur (une propriété, en soit)
// On peut aussi faire « names.ID = 'valeur', mais avec une variable
// (cf. après) il faut forcément utiliser les crochets. Or vu l'objectif,
// c'est ce dont tu vas avoir besoin =) .
>>> names['ID'] = 'valeur'

// Avec une variable, donc, crochets spécifiquement.
>>> names[the_id] = 'ZdS'

// Récupérer la valeur ; pareil, « names.ID » marche aussi pour des
// noms de propriétés littéraux et sans espaces.
>>> names['ID']
"valeur"

// Avec une variable, crochets.
>>> names[the_id]
"ZdS"

// Ça reste techniquement un objet avec ses propriétés qu'on utilise
// pour stocker des valeurs quelconques ; par suite, la méthode pour
// savoir si une propriété existe, c'est `hasOwnProperty`.
>>> names.hasOwnProperty('ID')
true

>>> names.hasOwnProperty('strange ID')
false

// Une autre façon de vérifier : toute tentative d'accès à une
// propriété inconnue renverra `undefined`.
>>> names['strange ID']
undefined


>>> names
Object { ID: "valeur", 7786f053: "ZdS" }
+1 -0

Un grand merci pour ton aide et de me consacrer du temps, sauf que je ne comprends pas bien ton code… Je ne manipule l’App Script seulement depuis 2 semaines, et je ne vois pas bien comment ton code peut enregistrer des noms et des identifiants que je rentre pas à la main, pour ensuite les associer à mes id de l’onglet d’origine

Mon code ne fait rien de tout ça, je comptais te laisser y réfléchir toi-même :) Je ne fais que lister les outils utilisables, ce n’est absolument pas une solution.

À toi de :

  1. boucler sur les 300 identifiants (ça tu le fais déjà, il faut juste déplacer la sous-boucle avant) ;
  2. les stocker dans un objet avec comme clef leur ID ;
  3. utiliser ce tableau plutôt que de reboucler à chaque fois sur la feuille de calculs.

Les moyens pour le faire, sont précisés plus haut et/ou sur le Mozilla Developer Network (lien plus haut également), mais je ne vais pas tout faire à ta place ^^ (sans compter que ce ne serait que bien peu formateur).

Je ne manipule l’App Script seulement depuis 2 semaines

Tu avais fait de la programmation avant, ou c’est aussi depuis deux semaines que tu y touches ?

+0 -0

J’ai donc essayé d’utiliser des tableaux pour les identifiants, en les incluant dans des boucles, et j’en suis arrivée au code suivant. Cependant il ne fonctionne pas, rien n’en ressort, et il n’y a pas de message d’erreur.

Même avec l’utilisation de tableaux, je suis obligée de faire des boucles FOR non ? Si oui, cela veut dire que à chaque fois la boucle entière est parcourue (et cela ne résout pas le problème du temps d’exécution si ?). Y aurait-il donc un moyen pour que l’on sorte de la boucle dès que l’identifiant est trouvé ?

(Pour essayer mon programme, j’ai réduit mon onglet 1 à 15 lignes au lieu de 140 000 et mon onglet 2 à 25 lignes au lieu de 300).

for (var i = 2 ; i < 25 ; i++) { // Compteur de ligne pour tableau des id (onglet 2)
var nomTableau = sheetOnglet2.getRange(i, 1).getValues() ;
var idTableau = sheetOnglet2.getRange(i, 2).getValues() ; 
for (var j = 2 ; j < 15 ; j++) { // Compteur de lignes pour l'onglet 1
  var id = sheetOnglet1.getRange(j, 2).getValues() ; 
  var arrayTableauId = [idTableau] ; 
  var arrayTableauNom = [nomTableau] ; 
  if ( id[0][0] === arrayTableauId[0][0] ) {
    sheetOnglet1.getRange(j, 1).setValue(arrayTableauNom) ; }

Sinon oui j’avais déjà fait de la programmation, mais avec des boucles très simples (en automatisant des petits calculs)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte