Appendrow qui ne se fait pas Le sujet est résolu

Avatar de l’utilisateur
TheZig
Messages : 32
Inscription : 18 mars 2023 18:08
A remercié : 7 fois
Remercié : 3 fois

Appendrow qui ne se fait pas

Message par TheZig »

Bonjour,

Dans un classeur source, j'ai un onglet avec x lignes de A5 à Gx. Dans la colonne G se trouve des cases à cocher.
Je voudrais récupérer les lignes dont les cases sont cochées, pour les placer dans l'onglet d'un autre classeur.
Je ne souhaite pas utiliser un query importrange , car je voudrais obtenir des données statiques et non pas dynamiques.

J'ai fait un code qui théoriquement devrait aller chercher chaque ligne dont la case est cochée, et faire ensuite un appendRow dans l'onglet cible.
Mais la macro ne fonctionne pas. J'ai dû me tromper quelque part ? Je pense que c'est dans la boucle mais j'ai fait plusieurs essais, et je ne trouve pas.
 Si vous pouviez m'aiguiller, cela m'aiderait grandement

Voici mon code:

function copieDansCompta() {

  const source = SpreadsheetApp.openById("idclasseursource"); 
  const formCH_Source = source.getSheetByName('CH');
  const cible = SpreadsheetApp.openById("idclasseurcible"); 
  const listeCH_Cible = cible.getSheetByName('CH_Adh');

// calcule le nombre de ligne du fichier source - 4 car les 1ères données sont en ligne 5
  const nbLi = formCH_Source.getLastRow()-4;

      // met dans une variable les données sources de la plage A1 à GnbLi
       const paiements = formCH_Source.getRange(5,1,nbLi,7).getValues();

//je fais une boucle pour parcourir les lignes 
  for (var li = 5; li <= nbLignesSource; li++)
    {
      cc = formCH_Source.getRange('G'+li).getValue();   // valeur des cases à cocher en col G  
 
      if (cc  == true)
      {

      // devrait inserer la ligne li
      listeCH_Cible.appendRow(paiements[li]);
       }

    } //fin de la boucle


}


 À noter qu'au final, je souhaiterais plutôt réunir toutes les lignes trouvées pour faire l'appendRow en une seule fois, ceci afin que la macro aille plus vite, mais enfin, j'aimerais bien comprendre pourquoi ce code-ci ne fonctionne pas.
Dernière modification par TheZig le 30 oct. 2023 13:19, modifié 2 fois.
Ce qui se conçoit bien, s'énonce clairement (Boileau) 
Avatar de l’utilisateur
NC-Ahmet

Coach Numericoach
Invétéré
Messages : 86
Inscription : 19 sept. 2022 14:09
A remercié : 16 fois
Remercié : 19 fois

Re: Appendrow qui ne se fait pas

Message par NC-Ahmet »

Hello TheZig,

Attention il semblerait que ton code n'est pas bien formaté, c'est très difficile à lire. De plus tu mets beaucoup de commentaires donc on ne sait pas ce qui est censé être lu par GAS et ce qui ne l'est pas.

Je t'invite à revoir ton code dans un premier temps, nous communiquer le message d'erreur que tu rencontres de manière plus exhaustive, etc.

Est-ce que la fonction ne s'exécute pas du tout car le code est syntaxiquement incorrect ? Est-ce que la fonction s'exécute mais pas comme tu le souhaites ?

Ton message manque d'informations, je t'invite vraiment à nous en dire +

Je précise également que la méthode appendRow() ajoute qu'une seule ligne à la fois. Si tu veux ajouter plusieurs lignes d'un coup, il vaut mieux utiliser setValues().

Bien à toi !
Avatar de l’utilisateur
TheZig
Messages : 32
Inscription : 18 mars 2023 18:08
A remercié : 7 fois
Remercié : 3 fois

Re: Appendrow qui ne se fait pas

Message par TheZig »

En fait, là j'ai envoyé le msg depuis mon smartphone, et je n'ai vu qu'après que ça a "déformaté" mon code.
dès que je serai à nouveau devant mon ordi, je rectifierai ça.

Pour le code, c'est la boucle qui semble ne pas fonctionner, car lorsque je fais un Logger.log(paiements[0]), par exemple, j'obtiens bien la première ligne d'enregistrement

appendRow ne peut donc pas insérer une plage de valeurs de plusieurs lignes en 1 seule fois ? J'ai du mal comprendre un topo...
n'y a-t-il pas une fonction writeMultipleRows() qui pourrait faire ça 
Ce qui se conçoit bien, s'énonce clairement (Boileau) 
Avatar de l’utilisateur
NC-Ahmet

Coach Numericoach
Invétéré
Messages : 86
Inscription : 19 sept. 2022 14:09
A remercié : 16 fois
Remercié : 19 fois

Re: Appendrow qui ne se fait pas

Message par NC-Ahmet »

Coucou,

En effet, c'est mieux ainsi. Attention je constate déjà une erreur ici : const paiements = formCH_Source.getRange(5,1nbLi,7).getValues();

À quoi correspond le "1nbLi" (deuxième paramètre de la méthode getRange) ? Je pense que tu voulais faire 'getRange(5,1,nbLi,7)' mais je me trompe peut-être, n'ayant pas ton fichier je ne peux pas vérifier.

En effet, appendRow "Ajoute une ligne en bas de la zone de données actuelle dans la feuille" d'après la documentation donc ce n'est pas adapté.

Je te conseille de faire un getRange(row, column, numRows, numColumns) avec les 4 arguments suivants :
1. row 
sera la dernière ligne de ta plage active +1 (avec getLastRow() +1)
2. column sera égal à  1 (pour commencer à la colonne A)
3. numRows qui a le même nombre de ligne que ton tableau de données (avec paiements.length)
4. numColumns qui a le même nombre de colonne que ton tableau de données (avec paiements[0].length)

Je pense que tu as de quoi faire là. Essaye de t'y pencher et tiens moi au courant

A++ 😁
Avatar de l’utilisateur
TheZig
Messages : 32
Inscription : 18 mars 2023 18:08
A remercié : 7 fois
Remercié : 3 fois

Re: Appendrow qui ne se fait pas

Message par TheZig »

formCH_Source.getRange(5,1nbLi,7).getValues();   était une erreur de recopiage, qui n'existait pas dans mon code, j'ai rectifié mon premier message:

lformCH_Source.getRange(5,1,nbLi,7).getValues();  qui sont les valeurs de la plage A5 à GnbLi

et ça fonctionne, car avant la boucle (et après aussi, d'ailleurs), quand je fais un Logger.log(paiements[0]), par exemple, j'obtiens bien la première ligne d'enregistrement, Logger.log(paiements[1]) la 2ème, etc


mais je ne sais pas ce qui se passe dans la boucle, car avec ce code,  je n'obtiens aucun message d'erreur: tout simplement on dirait que rien ne se passe...
et un Logger.log ne donne rien, je ne sais pas comment débogger ça


Autrement je pensais pouvoir insérer plusieurs lignes avec appendRow, au vu de cette discussion 
 Mais donc j'ai dû mal comprendre. Ça m'arrive souvent ;-))
Ce qui se conçoit bien, s'énonce clairement (Boileau) 
Avatar de l’utilisateur
TheZig
Messages : 32
Inscription : 18 mars 2023 18:08
A remercié : 7 fois
Remercié : 3 fois

Re: Appendrow qui ne se fait pas

Message par TheZig »

Bon, pour le code, c'était la boucle qui n'allait pas: comme un imbécile, je faisais comme si je bouclais sur toute la feuille en considérant qu'il y avait 4 lignes de titre, or en fait je bouclais sur "paiements" qui est un tableau où, pour tester, je n'avais mis que 3 lignes, et donc en mettant li=5 au lieu de li=0, forcément, j'étais en dehors de mes 3 lignes !!!

Après, j'ai fait également une petite correction
pour définir ma condition de case à cocher en colonne G. J'ai ecrit
if (paiements[li][6] == true {.  Etc }


Bon ça c'est fait.
Pour le reste, donc, si je veux mettre mes lignes en 1 seule fois, il faut que j'utilise setValues ? Mais donc cela veut dire aussi qu'il faut que je trouve d'abord la dernière ligne libre de la feuille cible (ça ce n'est pas un problème), et ensuite que je mettes toutes les lignes concernées dans une seule variable, or je n'ai pas idée de comment faire cela ?
 
Ce qui se conçoit bien, s'énonce clairement (Boileau) 
Avatar de l’utilisateur
NC-Ahmet

Coach Numericoach
Invétéré
Messages : 86
Inscription : 19 sept. 2022 14:09
A remercié : 16 fois
Remercié : 19 fois

Re: Appendrow qui ne se fait pas

Message par NC-Ahmet »

Hello,

Oui tu dois utiliser setValues(). Je t'invite à relire mon message précédent sur le sujet, je t'indique qu'il faut utiliser la méthode sheet.getLastRow() +1 qui permet de récupérer dynamiquement la dernière ligne active de ton tableau +1 (ce qui correspond à la première ligne dispo de ta feuille).

Tu vas renseigner 1 pour le deuxième argument (si c'est bien à la colonne A que tu commences l'écriture de tes données).

Ensuite tableau.length pour le nb de ligne et tableau[0].length pour le nb de colonne.
Avatar de l’utilisateur
TheZig
Messages : 32
Inscription : 18 mars 2023 18:08
A remercié : 7 fois
Remercié : 3 fois

Re: Appendrow qui ne se fait pas

Message par TheZig »

heu...y a des fois où je comprends des trucs très compliqués et d'autre fois, je comprends même pas des trucs très basiques  😓  : quand j'ai fait ma boucle, comment je fais (et à quel endroit) pour récupérer toutes les valeurs des lignes traitées, en un tableau ? 
Ce qui se conçoit bien, s'énonce clairement (Boileau) 
Avatar de l’utilisateur
NC-Ahmet

Coach Numericoach
Invétéré
Messages : 86
Inscription : 19 sept. 2022 14:09
A remercié : 16 fois
Remercié : 19 fois

Re: Appendrow qui ne se fait pas

Message par NC-Ahmet »

Hello,

Une méthode par exemple c'est de créer un tableau vide avant ta boucle, puis de l'incrémenter à chaque itération avec tableau.push().
Avatar de l’utilisateur
TheZig
Messages : 32
Inscription : 18 mars 2023 18:08
A remercié : 7 fois
Remercié : 3 fois

Re: Appendrow qui ne se fait pas

Message par TheZig »

Ah ok donc donc  j'écris par exemple:

var tableau
for (var li = 5; li <= nbLignesSource; li++) {
tableau.push()
}
nbLtab =tableau.length
nbCtab =tableau[0].length

Puis je cherche la dernière ligne dans ma feuille cible avec getLastRow
Mettons que ce soit la 4, et j'écris

listeCH_Cible.getRange(4,1, nbLtab,nbCtab).setValues(tableau[li]);

C'est ça ?
Dernière modification par TheZig le 31 oct. 2023 21:51, modifié 1 fois.
Ce qui se conçoit bien, s'énonce clairement (Boileau) 
Répondre

Rejoignez la discussion 💬

Vous devez être enregistré pour participer à la discussion et échanger avec les différents membres

Inscrivez-vous dès aujourd'hui

Vous n'êtes pas encore membre ? Rejoignez-nous gratuitement dès aujourd'hui et contribuer en postant votre réponse ou question sur tous les forums disponibles

Inscription

Connectez-vous