script à partir d'un query
Publié : 31 oct. 2023 15:55
Bonjour,
Dans un onglet nommé Donnees, j'ai...des données !
Dans un autre onglet que je nomme Rapprochement, je fais un query sur ces données, et notamment je demande les enregistrements dont le contenu de la colonne M est false
(BDD_All est la plage des données de la feuille Donnees):
dans la colonne A, il y a un id unique pour chaque enregistrement.
Dans la colonne P de l'onglet Rapprochement je mets une case à cocher, que je vais cocher pour indiquer que la ligne doit être traitée par ma macro
Chaque fois qu'une ligne est traitée, elle n'apparait donc plus dans la liste puisqu'elle ne répond plus aux exigence du query.
Le problème est que c'est sans doute à cause de cela que la macro ne prend qu'une ligne sur 2 et donc au final, seule la moitié des lignes cochées est traitée...
A votre avis, quel est le moyen d'arranger cela ?
Édit: je me disais peut-être en mettant le résultat de la boucle dans un tableau, puis, en faisant une autre boucle pour parcourir les lignes du tableau et mettre à jour ma feuille Données en une seule fois avec des setValues ?
Seulement sur ma feuille Données, les lignes à mettre à jour ne seront pas forcément contiguës. Est-ce que ça ne posera pas un problème ?
Re-edit: mon raisonnement me conduit à penser que je devrais peut-être faire un copier-coller des valeurs filtrées de mon onglet, dans une feuille temporaire puis de l'effacer à la fin ?
Dans un onglet nommé Donnees, j'ai...des données !
Dans un autre onglet que je nomme Rapprochement, je fais un query sur ces données, et notamment je demande les enregistrements dont le contenu de la colonne M est false
(BDD_All est la plage des données de la feuille Donnees):
=query(BDD_All;"select A,B,C,D,E,F,G,H,I,J,K,L,N,O,M where A>0 and M=false";1)
Dans la colonne P de l'onglet Rapprochement je mets une case à cocher, que je vais cocher pour indiquer que la ligne doit être traitée par ma macro
dans cette macro j'en utilise une autre dont voici le code:let FeuilRapprochement = classeur.getSheetByName('Rapprochement');
function majRapprochement() {
//cherche d'abord la dernière ligne non vide de la colonne A
const Avals = FeuilRapprochement.getRange("A1:A").getValues();
const lastRowA = Avals.filter(String).length;
Logger.log(lastRowA);
for (li=2; li<=lastRowA; li++) //parcours des lignes jusqu' à la dernière non vide
{
let idMouvmt = FeuilRapprochement.getRange('A'+li).getValue();
const numeroLigne = trouverMouvementParSonId(idMouvmt); //dans la feuille Données, cherche le n° de ligne où se trouve l'id du mouvement
if (numeroLigne > 0)
{ //si le mouvement est trouvé
let rapproch = FeuilRapprochement.getRange('P'+li).getValue(); //valeur de la case sur la ligne col P de la feuille Rapprochement
if (rapproch == true)
{ // si la case est sur True
cellCol = FeuilleDonnees.getRange('M' +numeroLigne); //va sur la cellule col M de la feuille Données pour cocher la case
rapprochActuels = cellCol.getValue();
cellCol.setValue(rapproch);
FeuilleDonnees.getRange('O' +numeroLigne).setValue(new Date()); //on met la date de modif
// FeuilRapprochement.getRange(li,16).setValue(false); //j'ai désactivé ça mais ça ne change rien au résultat sauf une case décochée
}
}
}
}
function trouverMouvementParSonId(Id){
//on va chercher le numéro de ligne où se trouve l'id de l'objet Mouvement
let data = FeuilleDonnees.getDataRange().getValues();
let trouverIndex = data.findIndex(Mouvement => Mouvement[0] == Id);
return ++trouverIndex;
}
Chaque fois qu'une ligne est traitée, elle n'apparait donc plus dans la liste puisqu'elle ne répond plus aux exigence du query.
Le problème est que c'est sans doute à cause de cela que la macro ne prend qu'une ligne sur 2 et donc au final, seule la moitié des lignes cochées est traitée...
A votre avis, quel est le moyen d'arranger cela ?
Édit: je me disais peut-être en mettant le résultat de la boucle dans un tableau, puis, en faisant une autre boucle pour parcourir les lignes du tableau et mettre à jour ma feuille Données en une seule fois avec des setValues ?
Seulement sur ma feuille Données, les lignes à mettre à jour ne seront pas forcément contiguës. Est-ce que ça ne posera pas un problème ?
Re-edit: mon raisonnement me conduit à penser que je devrais peut-être faire un copier-coller des valeurs filtrées de mon onglet, dans une feuille temporaire puis de l'effacer à la fin ?