Condition sur liste déroulante / FIltrer les choix affichés dans une liste déroulante

Pour filtrer les choix d’une colonne en fonction d’une autre colonne (ex : afficher les villes d’un département préalablement choisi au lieu de l’ensemble des villes), vous pouvez utiliser le champ « Condition de la liste déroulante », présent dans le panneau de création. Il faudra écrire une formule en utilisant le mot clé choice, pour cibler les options à afficher dans la liste.

Cas simple avec 3 tables :

On a une table de référence, qui sert de référence à la fois dans la table courante et dans la table de la colonne à filtrer. La formule est donc simple :

choice.Id_colonne_dans_la_table_à_filtrer == $Id_col_table_courante

Capture d’écran 2025-11-30 à 13.10.13

Ex ici : https://grist.incubateur.anct.gouv.fr/o/tutos-templates/mF5LgNLddVWo/Ex-filtre-condition-colonne/p/2

Documentation : https://support.getgrist.com/col-refs/#filtering-reference-choices-in-dropdown-lists

Cas plus complexe avec 4 tables :

J’ai une table avec des CRTE qui appartiennent chacun à une région; et une table avec des leviers qui appartiennent chacun à une région. Dans ma table « Projets », pour chaque CRTE, je peux choisir un levier. Je ne veux afficher que les leviers qui correspondent à la région du CRTE. Par exemple, si je suis sur une ligne d’un CRTE d’Occitanie, je ne veux voir dans la colonne « leviers » que la liste des leviers d’occitanie

  • Rapporter la colonne « Region » de la table « CRTE » dans la table « Projets »

  • Dans la colonne de référence « leviers », ajouter une formule de condition déroulante :
    choice.Region == $CRTE_Region

Exemple ici : https://grist.incubateur.anct.gouv.fr/o/tutos-templates/mF5LgNLddVWo/Ex-filtre-condition-colonne/p/1
Capture d’écran 2025-11-30 à 13.01.20

Cas de références multiples

Voir ici : https://forum.grist.libre.sh/t/filtrer-les-choix-affiches-dans-une-liste-deroulante-reference-en-fonction-dune-autre-liste-deroulante-reference/606/5?u=audezu

3 « J'aime »

Bonjour
je souhaite adapter ce principe à ma situation mais je bute. Mes deux colonnes sont des références multiples et je voudrais donc que l’ensemble des références me soient proposées dans ma liste de choix. Cela vous parait possible ?

Bonjour, si je comprends bien votre question, alors la réponse est dans ma FAQ :

Les conditions de liste déroulante sont moins puissantes que les formules Grist, il n’est par exemple pas possible d’évaluer une Référence ou d’utiliser des noms de tables. Il faut donc transformer les références multiples en choix multiple (formule =$A dans une colonne de type Choix multiple) et ajouter des conditions comme ceci :

"DRV" in choice.Service_Laboratoire_en_choix_multiple or "DRI" in choice.Service_Laboratoire_en_choix_multiple

Bonjour et merci de la proposition.
Hélas, cela ne résout pas mon problème. Ma référence multiple est appelée à évoluer et l’ajout d’une colonne choix multiple fige, si je ne me trompe pas, cette évolution.
Je vais continuer à creuser !

Et merci pour la FAQ bien utile

Bonjour @Arnault, est-ce que ces exemples pourraient t’aider ? Sinon, n’hésite-pas à fournir un exemple minimal avec tes structures de tables.

2 réfs multiples

Pour 2 références multiples, on peut faire une formule qui fait l’intersection entre les 2 listes, et retourne la liste des noms de choix possibles, par ex :
list(c.choix for p in $Projet.deps for c in Choix.lookupRecords(deps=CONTAINS(p)))

Et ensuite mettre une condition sur liste déroulante de type :
choice.choix in $intersection_listes

J’ai fait un exemple ici : https://grist.incubateur.anct.gouv.fr/o/tutos-templates/uTJqRkHUPnZM/Ex-filtre-condition-colonne-copy/p/4

Capture d’écran 2025-11-30 à 13.15.36

1 réf simple + 1 réf multiple

Dans ce cas il faut ramener la réf multiple de la première colonne dans la table courante (dans l’ex, cette colonne rapportée est projet_dep), puis mettre une condition sur la colonne à filtrer qui va filtrer les choix dont la référence simple est présente dans la liste de références de la colonne précédemment choisie.

choice.dep in $projet_dep

Ex ici : https://grist.incubateur.anct.gouv.fr/o/tutos-templates/uTJqRkHUPnZM/Ex-filtre-condition-colonne-copy/p/3

Capture d’écran 2025-11-30 à 12.58.00

1 « J'aime »

Bonjour Aude et merci encore
En partant de ton document, j’ai pu reconstruire ce que je souhaite, voici un lien vers le document (je ne sais pas comment le mettre dans un bac à sable)

1 « J'aime »

Mille ans plus tard :slight_smile: mais pour info pour faire un modèle / bac à sable, il faut aller dans les paramètres du document > Type de document et choisir Modèle ou Tutoriel

1 « J'aime »

Bonjour, j’ai le besoin inverse, c’est à dire que j’ai une colonne référence multiple que je veux filtrer type recordset avec une colonne référence simple (record). Ma situation est de filtrer une liste qui fait référence multiple à une table compétence qui peut contenir plusieurs métiers (choice.Metier) à filtrer selon le métier de l’agent dont j’ai reporté la colonne dans le tableau (formule =$ID_Agent.Metier.Initule_metier). la fonction in ne fonctionne pas (recorset in record n’est pas possible) et contains n’a pas l’air de fonctionner dans les conditions de liste. Avez-vous des idées svp?

Bonjour !
J’ai réussi à implémenter une condition sur liste déroulante grâce à cette manipulation, mais quand je crée un formulaire cela ne prend en compte ce filtre, est-ce que cela est possible de faire cette condition sur un menu déroulant dans un formulaire ?

Merci d’avance

Bonjour, malheureusement ce n’est pas possible dans la vue formulaire :

Merci pour la réponse et la ref à la question déjà posée :wink:

Il est par contre possible de créer un champ qui reproduit les lignes que l’ont veut voir afficher dans le formulaire et rien pour les autres et, en utilisant une formule d’initialisation, récupérer la donnée saisie dans le formulaire dans la colonne qui contient toutes les lignes.
J’ai procédé ainsi pour une liste de formation, je ne voulais afficher que les formations à venir et pas la liste complète. J’ai une colonne booléenne qui contient false si la date du jour est dépassée et true dans les autres cas et dans la colonne présentée dans le formulaire, cette formule :
$Nom_de_la_formation if $A_venir else None

Ca peut peut-être à ton besoin ?