🧠 Optimisez Vos Tableaux Google Sheets : Développez une Fonction Consulter_Client() Ultra-Réactive avec Google Apps Script

🧠 Optimisez Vos Tableaux Google Sheets : Développez une Fonction Consulter_Client() Ultra-Réactive avec Google Apps Script

🔍 Contexte

Lorsque vous développez des interfaces interactives dans Google Sheets, il est courant de vouloir charger dynamiquement des informations à partir d’une ligne sélectionnée. Le script Consulter_Client() vous permet précisément cela : en un clic, les données de la ligne active sont extraites et réparties intelligemment dans des blocs d’affichage bien définis. Et pour les perfectionnistes : cette version est hautement optimisée pour la performance.


🚀 Objectif

Créer une fonction rapide, dynamique et robuste qui :

  • Extrait les données de la ligne sélectionnée dans un tableau structuré à partir de l’en-tête (ligne 10).

  • Alimente des champs d’affichage répartis sur plusieurs colonnes.

  • Gère un cas spécial où le libellé d’un champ est dynamique (S2 → S3).

  • Évite les ralentissements liés à l’accès répétitif aux cellules.


🧩 Structure des Données

  • Ligne d’en-tête : ligne 10.

  • Données : à partir de la ligne 11.

  • Libellés dynamiques (ex. : "Nom", "Téléphone", etc.) sont définis dans certaines cellules (ex. G2:G8, I2:I8…).

  • Données extraites à partir de la ligne sélectionnée.

  • Résultat : remplissage des colonnes H, J, L, N, P, R, et S.


🔎 Code Complet Optimisé

javascript

function Consulter_Client() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();
  const ui = SpreadsheetApp.getUi();
  const activeRow = sheet.getActiveCell().getRow();
  const dataStartRow = 11;

  if (activeRow < dataStartRow || activeRow > sheet.getLastRow()) {
    ui.alert("Pas dans la plage, merci de sélectionner une ligne du tableau !");
    return;
  }

  // 1. Vider les plages
  const zones = ["H1", "G2:G8", "J2:J8", "L2:L8", "N2:N8", "P2:P8", "R2:R8", "S3"];
  zones.forEach(r => sheet.getRange(r).clearContent());

  // 2. Mémoriser ligne
  sheet.getRange("F1").setValue(activeRow);

  // 3. Lire toutes les données utiles
  const headers = sheet.getRange(10, 1, 1, sheet.getLastColumn()).getValues()[0];
  const rowData = sheet.getRange(activeRow, 1, 1, sheet.getLastColumn()).getValues()[0];

  // 4. Lire tous les libellés de blocs en une fois
  const libelles = sheet.getRangeList([
    "G1", "F2:F8", "I2:I8", "K2:K8", "M2:M8", "O2:O8", "Q2:Q8", "S2"
  ]).getRanges().map(r => r.getValues());

  const flatLabels = libelles.flat().map(row => row[0]);

  // 5. Calculer les cellules à remplir
  const destinations = [
    ["H1"],                             // G1 -> H1
    ...Array.from({ length: 7 }, (_, i) => [`G${i + 2}`]), // F2:F8 -> G2:G8
    ...Array.from({ length: 7 }, (_, i) => [`J${i + 2}`]),
    ...Array.from({ length: 7 }, (_, i) => [`L${i + 2}`]),
    ...Array.from({ length: 7 }, (_, i) => [`N${i + 2}`]),
    ...Array.from({ length: 7 }, (_, i) => [`P${i + 2}`]),
    ...Array.from({ length: 7 }, (_, i) => [`R${i + 2}`]),
    ["S3"]                             // S2 -> S3
  ].flat();

  // 6. Associer libellé → valeur
  const results = flatLabels.map(label => {
    const index = headers.indexOf(label);
    return index !== -1 ? rowData[index] : "";
  });

  // 7. Écrire en bloc les valeurs calculées
  destinations.forEach((cell, i) => {
    sheet.getRange(cell).setValue(results[i]);
  });

  // 8. Marquer A1
  sheet.getRange("A1").setValue("C");
     //monter faire défiler la feuille en haut
   sheet.setActiveRange(sheet.getRange("E11"));
}

🛠️ Points Techniques Clés

1. Optimisation du nombre d’appels

Au lieu de faire des getValue() multiples pour chaque cellule, on récupère toute la ligne et l’en-tête une seule fois. Cela réduit drastiquement le temps d’exécution.

2. Utilisation de indexOf()

Pour rendre le script dynamique même si les colonnes changent de position, on cherche les colonnes par leur libellé.

3. Blocs extensibles

Grâce à une structure en tableau (blocks), il est facile d’ajouter ou modifier des zones de saisie.

4. Cas dynamique (S2 → S3)

Ce cas illustre une logique conditionnelle intelligente, utile pour des modules flexibles.

 

5. Calculer les cellules à remplir

🎯 Contexte général

Ce code est utilisé pour préparer dynamiquement la liste des cellules de destination dans une feuille Google Sheets. L'objectif est de savoir où écrire les valeurs extraites, selon une structure de type "Libellé → Valeur".

Par exemple :

  • G1 est un libellé, et la valeur associée doit aller dans H1

  • F2 est un libellé, et la valeur doit aller dans G2

  • ...

  • S2 est un libellé dynamique, donc la valeur ira dans S3


🧩 Structure ligne par ligne

js

const destinations = [

On crée un tableau destinations qui contiendra les adresses des cellules à remplir avec les valeurs (les données utilisateurs, pas les libellés).


js

["H1"], // G1 -> H1

On commence avec la cellule H1 (destination de la valeur associée à G1, qui contient le libellé).


js

...Array.from({ length: 7 }, (_, i) => [`G${i + 2}`]), // F2:F8 -> G2:G8

Génère un tableau de 7 éléments : G2, G3, ..., G8.

🔁 Explication :

  • Array.from({ length: 7 }, (_, i) => ...) crée un tableau de 7 lignes.

  • Pour chaque index i de 0 à 6, on génère G${i + 2} → soit G2 à G8.


js

...Array.from({ length: 7 }, (_, i) => [`J${i + 2}`]), ...Array.from({ length: 7 }, (_, i) => [`L${i + 2}`]), ...Array.from({ length: 7 }, (_, i) => [`N${i + 2}`]), ...Array.from({ length: 7 }, (_, i) => [`P${i + 2}`]), ...Array.from({ length: 7 }, (_, i) => [`R${i + 2}`]),

Même logique que précédemment, mais pour les colonnes suivantes :

  • I2:I8 (libellés) → valeurs dans J2:J8

  • K2:K8L2:L8

  • etc.

Chaque paire correspond à une zone de données étiquetée horizontalement sur deux colonnes (ex. I2 = libellé, J2 = valeur).


js

["S3"] // S2 -> S3

Ajoute la cellule S3 comme dernière destination, pour le cas où S2 contient un libellé personnalisé (ajout récent dans le script).


js

].flat();

Utilisé pour aplatir le tableau de tableaux ([["G2"], ["G3"], ...]) en un simple tableau :

js

["H1", "G2", "G3", ..., "S3"]

Cela simplifie l'itération sur les cellules à remplir plus tard dans le script.


Résumé logique

LibelléValeur (destination)
G1H1
F2:F8G2:G8
I2:I8J2:J8
K2:K8L2:L8
M2:M8N2:N8
O2:O8P2:P8
Q2:Q8R2:R8
S2S3

🧠 À quoi sert cette liste ?

Elle permet à un script (par exemple une fonction remplirDepuisLigne()) de remplir toutes les cellules de droite avec les données récupérées, en se basant sur les libellés dynamiques saisis par l’utilisateur.



📌 Conclusion

La fonction Consulter_Client() optimisée est un exemple parfait d'une approche propre, rapide et évolutive pour développer des solutions avancées dans Google Sheets. En rationalisant les accès aux cellules et en centralisant la logique, vous pouvez obtenir des performances proches du temps réel même avec de grands tableaux. 

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