Explication du code Naviguer dans les lignes filtrées avec Google Apps Script

 

Voici une explication claire et structurée de votre fonction Consulter_Client_visible() (et son complément pour "suivant" ou "précédent") destinée à être publiée sur un blog. Je vais la présenter étape par étape, avec des titres et une rédaction pédagogique :


🎯 Objectif : Consulter un client visible dans une feuille filtrée Google Sheets

Ce script Google Apps Script est conçu pour fonctionner dans une feuille de calcul nommée "Liste ECOLE". Il permet de :

  • Parcourir les lignes visibles (non masquées par un filtre).

  • Identifier les données d’un client dans la colonne G.

  • Remplir dynamiquement un formulaire (plages G2:R8).

  • Mémoriser la ligne actuelle pour navigation ultérieure (suivant / précédent).


📌 Structure du script

Le script est divisé en deux fonctions principales :

  1. Consulter_Client_visible() : Cherche la première ligne visible avec données à partir de la ligne 11.

  2. remplirDepuisLigne() : Remplit les champs du formulaire à partir des données de la ligne sélectionnée.


🔍 Détail du code

1. Consulter_Client_visible()

javascript

function Consulter_Client_visible() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName("Liste ECOLE"); const dataStartRow = 11; const lastRow = sheet.getLastRow(); const columnToCheck = 7; // Colonne G = 7
  • On récupère la feuille, et on définit la plage à analyser : à partir de la ligne 11 dans la colonne G (où se trouvent les noms des clients par exemple).

javascript

const headers = sheet.getRange(10, 1, 1, sheet.getLastColumn()).getValues()[0];
  • On récupère la ligne d’en-tête (ligne 10) pour savoir à quelles colonnes correspondent les noms utilisés dans les étiquettes dynamiques (ex. "Nom", "Ville"...).

javascript

for (let row = dataStartRow; row <= lastRow; row++) { const range = sheet.getRange(row, columnToCheck); if (!range.isPartOfMerge() && !range.isBlank() && !sheet.isRowHiddenByFilter(row)) { remplirDepuisLigne(sheet, headers, row); sheet.getRange("F1").setValue(row); SpreadsheetApp.getUi().alert("Client chargé depuis la ligne " + row); return; } }
  • Cette boucle parcourt les lignes visibles uniquement (grâce à isRowHiddenByFilter(row)).

  • Lorsqu'une ligne avec données est trouvée, on appelle la fonction de remplissage.


2. remplirDepuisLigne(sheet, headers, activeRow)

a. Nettoyage des anciennes valeurs

javascript

const zones = ["G2:G8", "J2:J8", "L2:L8", "N2:N8", "P2:P8", "R2:R8"]; zones.forEach(range => sheet.getRange(range).clearContent());
  • Les anciennes valeurs sont supprimées avant de remplir de nouvelles informations.

b. Fonction remplirCellule()

javascript

function remplirCellule(destinationRange, colName) { const index = headers.indexOf(colName); if (index !== -1) { const value = sheet.getRange(activeRow, index + 1).getValue(); sheet.getRange(destinationRange).setValue(value); } }
  • Cette fonction lit une valeur de la ligne active selon le nom de la colonne, puis la copie vers une cellule spécifique (comme G2, G3, etc.).

c. Blocs dynamiques

javascript

const blocks = [ { labelCol: "E", valueCol: "G", from: 2, to: 8 }, { labelCol: "I", valueCol: "J", from: 2, to: 8 }, ... ];
  • Chaque bloc contient :

    • Une colonne contenant des noms de champs (ex. "Nom", "Ville", "ICE"...).

    • Une colonne correspondante à remplir avec les données trouvées.

    • Une plage de lignes (2 à 8 ici).

  • On parcourt chaque bloc, puis chaque ligne de ce bloc :

javascript

for (let block of blocks) { for (let i = block.from; i <= block.to; i++) { const colName = sheet.getRange(block.labelCol + i).getValue(); if (colName) { remplirCellule(block.valueCol + i, colName); } } }

⏭ Aller au client suivant (en respectant le filtre)

Une autre fonction peut s’ajouter pour "suivant" :

javascript

function Consulter_Client_suivant() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Liste ECOLE"); const currentRow = sheet.getRange("F1").getValue(); const headers = sheet.getRange(10, 1, 1, sheet.getLastColumn()).getValues()[0]; let row = currentRow + 1; while (row <= sheet.getLastRow()) { if (!sheet.isRowHiddenByFilter(row) && sheet.getRange(row, 7).getValue() !== "") { remplirDepuisLigne(sheet, headers, row); sheet.getRange("F1").setValue(row); return; } row++; } SpreadsheetApp.getUi().alert("Aucun autre client visible."); }

Et la version "précédente" :

javascript

function Consulter_Client_precedent() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Liste ECOLE"); const currentRow = sheet.getRange("F1").getValue(); const headers = sheet.getRange(10, 1, 1, sheet.getLastColumn()).getValues()[0]; let row = currentRow - 1; while (row >= 11) { if (!sheet.isRowHiddenByFilter(row) && sheet.getRange(row, 7).getValue() !== "") { remplirDepuisLigne(sheet, headers, row); sheet.getRange("F1").setValue(row); return; } row--; } SpreadsheetApp.getUi().alert("Aucun client précédent visible."); }

✅ Résultat

Vous obtenez une navigation fluide entre les clients visibles, même si des filtres sont actifs dans votre tableau. Une belle alternative dynamique et professionnelle pour gérer vos données clients dans Google Sheets !

Commentaires

Posts les plus consultés de ce blog

🛠 Utilisation de CustomUIEditor pour Personnaliser le Ruban Excel

🗓️ Simulateur de Congés et Calendrier Collaboratif sous Google Sheets

Explication VBA : Facturation automatique Gestion client