Page 1 sur 2
Appendrow qui ne se fait pas
Publié : 30 oct. 2023 12:11
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.
Re: Appendrow qui ne se fait pas
Publié : 30 oct. 2023 12:18
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 !
Re: Appendrow qui ne se fait pas
Publié : 30 oct. 2023 13:09
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
Re: Appendrow qui ne se fait pas
Publié : 30 oct. 2023 13:18
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++
Re: Appendrow qui ne se fait pas
Publié : 30 oct. 2023 13:36
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
)
Re: Appendrow qui ne se fait pas
Publié : 30 oct. 2023 18:12
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 ?
Re: Appendrow qui ne se fait pas
Publié : 31 oct. 2023 09:24
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.
Re: Appendrow qui ne se fait pas
Publié : 31 oct. 2023 16:07
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 ?
Re: Appendrow qui ne se fait pas
Publié : 31 oct. 2023 16:30
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().
Re: Appendrow qui ne se fait pas
Publié : 31 oct. 2023 17:35
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 ?