La détection de doublons est un classique dans la gestion de la qualité des données. Si Grist propose une approche native très simple (no-code), on atteint vite ses limites dès que l’on complexifie les règles métier. Voyons comment améliorer cette détection.
L’approche no-code
Pour détecter rapidement des doublons sur une colonne unique (par exemple, une adresse email), Grist propose un type de colonne de raccourci très pratique : « Détecter les duplicats dans… », qui se met en place très simplement en quelques clics, sans une seule ligne de code.
Dans l’exemple ci-dessous, on recherche les doublons dans la colonne EMAIL.
L’ajout de cette colonne raccourci ajoute une nouvelle colonne de type « case à cocher » avec une mise en forme conditionnelle sur la cellule. Remarquons qu’il est possible de changer le style de la cellule, ou même des lignes, via les mises en forme conditionnelles pour faire ressortir visuellement les anomalies.
L’approche low-code
Cependant, cette fonctionnalité de colonne raccourci (no-code) montre ses limites dès que le besoin s’affine. Imagions que l’on souhaite enrichir ce système de contrôle avec des exigences plus fines, comme :
- Une recherche multicritère. Il peut être intéressant de rechercher un doublon n’ont pas sur la seule colonne
EMAIL, mais sur la combinaison de plusieursNOM+PRENOM+DATE_NAISSANCE. - Un contrôle des lignes vides
- Un message d’alerte plus explicite. Afficher par exemple directement dans la cellule, les numéros des lignes doublons détectés pour faciliter le nettoyage
Et c’est ici que l’approche low-code dans Grist avec des formules Python prend tout son sens.
Recherche de doublons sur plusieurs critères
Partons de la formule Python généré par la colonne de raccourci que nous avons ajouté sur l’email. On y constate l’emploi de la méthode lookupRecords avec le critère de recherche de colonne EMAIL, et la valeur courante de la ligne $EMAIL.
# Formule Python créé par la colonne raccourci
$EMAIL != "" and $EMAIL is not None and len(SYSTEME_AUTORISATIONS.lookupRecords(EMAIL=$EMAIL)) > 1
Il est aisé de l’adapter sur plusieurs critères en ajoutant des paramètres de recherche dans la méthode lookupRecords. Ces paramètres sont traités comme des AND. Ainsi pour rechercher des doublons sur la colonne NOM et PRENOM, ajoutons une nouvelle colonne VERIFICATION_DOUBLON avec la formule suivante.
duplicates = SYSTEME_AUTORISATIONS.lookupRecords(NOM=$NOM, PRENOM=$PRENOM)
if len(duplicates) > 1:
return "⚠️ Doublon détecté"
Pour bien comprendre le fonctionnement logique de
lookupRecords, voici l’équivalent conceptuel avec une approche par liste, fourni à titre purement illustratif.duplicates = [ item for item in SYSTEME_AUTORISATIONS.all if item.NOM == $NOM and item.PRENOM == $PRENOM ] if len(duplicates) > 1: return "⚠️ Doublon détecté"Précision qu’il faut toujours privilégier l’emploi de
lookupRecords, bien plus élégante et optimisé par rapport à un parcours de boucleforcomplet de la collectionSYSTEME_AUTORISATIONS.all. Cependant pour implémenter des logiques de test plus complexes (e.g.(A OR B) AND NOT C), dans ce cas on n’aura pas le choix et on devra utiliser un parcours totale de la collection dans une boucle via.all
Contrôle des lignes vides
Lorsqu’on met en place une détection de doublons multicritères, pour éviter de polluer le tableau avec de fausses alertes sur des lignes en cours de saisie (ou incomplète), on peut simplement vérifier si les champs clés sont vides au préalable.
if not $NOM or not $PRENOM:
return ""
duplicates = SYSTEME_AUTORISATIONS.lookupRecords(NOM=$NOM, PRENOM=$PRENOM)
if len(duplicates) > 1:
return "⚠️ Doublon détecté"
return "✅ Utilisateur unique"
Enrichir le message d’alerte
Pour améliorer le confort d’utilisation et l’efficacité du nettoyage, il est nécessaire que le message d’alerte soit le plus explicite possible. Plutôt qu’un simple avertissement (un test booléen sous la forme d’une case à cocher), nous allons configurer la détection pour :
- Repérer et pointer les lignes vides : Identifier instantanément les fiches incomplètes en affichant leur position (ligne correspondante dans le tableau).
- Quantifier l’anomalie : Compter précisément le nombre d’occurrences d’un même doublon.
- Lister toutes les lignes concernées : Fournir d’un seul coup d’œil les numéros de lignes (IDs) en conflit pour faciliter le nettoyage des données.
Voici la formule finale à insérer dans votre colonne de calcul.
# Vérifie si la ligne courante est vide (NOM ou le PRENOM est manquant)
current_position = list(SYSTEME_AUTORISATIONS.all).index(rec) + 1
if not $NOM and not $PRENOM:
return f"⚠️ Ligne vide détectée à la position {current_position }"
# Recherche de doublons multicritères (uniquement si les champs sont remplis)
if $NOM and $PRENOM:
duplicates = SYSTEME_AUTORISATIONS.lookupRecords(NOM=$NOM, PRENOM=$PRENOM)
if len(duplicates) > 1:
# Récupère les numéros de ligne de chaque doublon détecté
duplicate_positions = [list(SYSTEME_AUTORISATIONS.all).index(item) + 1 for item in duplicates]
positions_str = ", ".join(map(str, duplicate_positions))
return f"⚠️ Doublon détecté : présent {len(duplicates)} fois (lignes : {positions_str})."
# N'affiche rien si tout va bien
return ""
Si la ligne est unique et correctement renseignée, la formule retourne une chaîne vide. En cas de doublon, le message généré (par exemple : ⚠️ Doublon détecté : présent 3 fois (lignes : 5, 12, 18).) évite aux utilisateurs de données de chercher à l’aveugle dans le tableau le (ou les) doublons associés.
Ajouter une mise en forme conditionnelle au niveau d’une ligne et/ou d’une cellule des doublons
Maintenant que votre colonne de formule renvoie un texte d’alerte explicite, vous pouvez configurer la mise en forme conditionnelle de votre vue pour un confort visuel. Pour ce faire.
-
Rendez-vous dans les options de configuration de la table
-
Ajoutez une style de mise en forme conditionnelle pour une ligne avec la formule
$VERIFICATION_DOUBLON is not None and $VERIFICATION_DOUBLON != ""Choisissez par exemple un orange clair pour la couleur de fond de la ligne.
-
Vous pouvez faire de même dans les options de configuration de la colonne pour personnaliser le style conditionnel de la cellule de la colonne de verification. On utilise la même formule que pour la colonne.
Here we go !
Compléments
- Grist Help Center Mise en forme conditionnelle
Mise en forme conditionnelle - Grist Help Center- Grist comunity forum : ensure unique values or detect duplicates
Ensure unique values or detect duplicates - Showcase - Grist Creators





