Widgets d’enquête pour Grist

Cinq widgets à ajouter dans un document Grist (vue « widget personnalisé ») pour construire et gérer un formulaire d’enquête.

⚠️ Prérequis indispensable — donner accès au compte du serveur : le serveur d’enquête lit et écrit dans votre document via la clé API d’un compte Grist dédié. Vous devez partager votre document avec ce compte, en tant qu’Éditeur (menu Partager du document). Sans cet accès, rien ne fonctionne : ni la vérification du formulaire, ni l’enregistrement des réponses, ni l’open data, ni les pièces jointes. Demandez l’adresse e-mail de ce compte à l’administrateur du serveur.
On les utilise dans cet ordre :
  1. Création & vérification du formulaire et de sa table de réponses
  2. Lien public à envoyer aux répondants
  3. Aperçu d’une réponse
  4. Open data : publication des résultats
  5. Synchronisation open data : rapatrier un flux open data dans une autre table Grist (optionnel, côté destination)
1
Création / vérification

Éditeur & correspondance

Crée et modifie le formulaire avec l’éditeur visuel SurveyJS, puis vérifie et répare la correspondance avec la table de réponses Grist. Le cadre liste les modifications qui seront appliquées (colonnes à créer, types à changer) et le bouton qui les applique est juste en dessous.

Importer depuis un lien recopie le questionnaire d’un autre formulaire, même dans un autre document. Collez l’URL publique du formulaire source — celle que donne son widget « Lien formulaire public », de la forme https://serveur/instance/document/numéro — et non le lien du document Grist. Ni les réponses ni les colonnes ne sont copiées : les colonnes restent à créer ensuite.

2
Lien public

Lien formulaire public

Génère l’URL publique du formulaire à partir de la table de réponses : un lien pré-rempli pour la ligne sélectionnée (paramètre ?cle=), ou un lien « nouvelle réponse ». À copier et envoyer aux répondants.

3
Aperçu des résultats

Visualiseur

Affiche la réponse sélectionnée en lecture seule, mise en forme comme le formulaire (pièces jointes comprises). Pour relire ou contrôler une réponse sans risque de la modifier.

Comme le widget « Lien public », il suit la ligne que vous cliquez seulement si « SÉLECTIONNER PAR » est réglé sur la table des réponses, dans « Données sources » (panneau de droite). Sans ce réglage, Grist ne lui transmet aucune ligne.

4
Open data

Open data

Publie une table en JSON via un lien public, en ne diffusant que les colonnes choisies. Pour la réutilisation externe des résultats (open data). Une même table peut porter plusieurs flux, chacun avec ses colonnes et ses métadonnées.

5
Synchronisation open data

Synchronisation open data

Rapatrie un flux open data (créé à l’étape 4, éventuellement dans un autre document) vers la table liée, dans un seul sens. Vérifie au chargement si la table est à jour ; sinon affiche les différences et propose une mise à jour. Les lignes ajoutées à la main sont préservées.

Ce widget n’efface jamais rien. Une ligne qui quitte le flux est conservée : sa case « Dans le flux » est simplement décochée. Vous voyez donc ce qui appartient encore au flux et ce qui en est sorti, et vous décidez quoi en faire. Supprimer d’un coup reste possible à la main : filtrez sur cette case, sélectionnez, supprimez. L’inverse ne le serait pas — et effacer casserait au passage les références des autres tables vers ces lignes. Si une ligne revient plus tard, elle est simplement recochée, sans changer d’identifiant.

Construire le formulaire

Champs spéciaux à autocomplétion

Deux types de questions sont disponibles dans la boîte à outils de l’éditeur, en plus des types SurveyJS habituels. Ils fonctionnent comme une liste déroulante, mais les propositions viennent d’une base de référence pendant la frappe (à partir de 3 caractères).

Adresse (BAN)
Propose les adresses de la Base Adresse Nationale. En plus de la colonne de l’adresse, le serveur remplit tout seul 7 colonnes : code postal, ville, département, région, code INSEE, latitude, longitude. Ne les remplissez jamais à la main : elles sont recalculées à chaque enregistrement.
Lieu (tiers-lieux)
Propose les lieux de la base nationale des tiers-lieux. La colonne reçoit le nom du lieu (lisible), et une colonne …_identifiant_national reçoit son identifiant stable. Les propositions affichent « nom · commune · structure gestionnaire » pour distinguer les homonymes, fréquents.

Sur ces deux champs, vous pouvez cocher « Autre » dans les propriétés de la question : le répondant peut alors saisir librement une adresse ou un lieu absent de la base. Sa saisie va dans une colonne …_autre.

Nommer les questions

Le nom d’une question devient le nom d’une colonne. Deux règles :

Vous pouvez regrouper des questions dans un panneau : chaque question du panneau a sa propre colonne, le panneau lui-même n’en crée pas.

Plusieurs formulaires sur une même table

Une table de réponses peut porter plusieurs formulaires. Le bouton « + Nouveau formulaire » de l’éditeur en crée un de plus (il ne remplace jamais l’existant) ; un sélecteur apparaît alors pour passer de l’un à l’autre. Le Visualiseur et le widget « Lien formulaire public » ont le même sélecteur.

Préparer une nouvelle version
Créez le nouveau formulaire, décochez actif pendant que vous le composez (le serveur refuse d’y répondre tant qu’il est inactif), puis basculez : cochez le nouveau, décochez l’ancien. Les réponses déjà collectées ne bougent pas.
Deux formulaires complémentaires
Par exemple une « fiche d’identité » et un « recensement annuel » qui remplissent des colonnes différentes de la même ligne. C’est sans risque : chaque formulaire n’écrit que ses propres colonnes, et les deux mettent à jour la même ligne du répondant.

Chaque formulaire a son numéro (affiché « Formulaire #2 ») et donc sa propre URL publique : pensez à copier le lien du bon formulaire.

Qui peut répondre : le mode de réponse

Un seul réglage, dans l’éditeur (« Configuration & actions »). Il répond à deux questions à la fois : comment le répondant est reconnu, et ce qu’il a le droit de faire — créer une ligne, en modifier une, ou les deux.

L’identifiant de ligne
Chaque formulaire désigne la colonne qui identifie une réponse — par défaut UUID. C’est elle que le serveur compare pour savoir quelle réponse pré-remplir et quelle ligne mettre à jour. Elle se choisit dans l’éditeur, dans une liste des colonnes de la table : l’éditeur vérifie au passage qu’elle identifie bien chaque réponse, c’est-à-dire sans doublon ni case vide — sinon le formulaire ouvrirait la mauvaise ligne, ou aucune.
En changer sur un formulaire qui a déjà des réponses rend inopérants tous les liens déjà distribués : ils ne désignent plus rien. L’éditeur rappelle combien de réponses sont concernées avant que vous ne le fassiez.
Formulaire public d’ajout
Aucun lien à distribuer : un seul lien pour tout le monde. Chaque visiteur crée une nouvelle ligne et poursuit sa saisie, sans jamais pouvoir ouvrir celle d’un autre — c’est le serveur qui garde le fil, la clé ne circule pas. La table alloue elle-même l’identifiant.
Lien avec clé — ajout seulement
Le lien porte la clé de la ligne à créer (?cle=) ; il ne rouvre jamais une ligne existante. Présenter la clé d’une réponse déjà là ne l’ouvre pas.
Lien avec clé — modification seulement
La ligne doit déjà exister : une clé inconnue est refusée, rien n’est créé. C’est le mode des campagnes où les lignes sont préparées à l’avance dans Grist.
Lien avec clé — ajout et modification
La première réponse crée la ligne de cette clé, les suivantes la mettent à jour.
Lien signé — ajout seulement
Invitation à se déclarer : le destinataire crée sa ligne, sans pouvoir toucher aux autres.
Lien signé — modification seulement
Le plus strict : une invitation ne met à jour qu’une ligne existante. Un identifiant inconnu est refusé plutôt que de créer une ligne — à choisir quand les identifiants viennent d’ailleurs (un annuaire, une base nationale).
Lien signé — ajout et modification
Lien personnel signé, généré par le portail d’invitations.

Clé ou lien signé ? Avec une clé, qui a le lien a la ligne : à réserver aux clés non devinables, et à ne jamais publier. Avec un lien signé, l’identifiant n’est plus un secret — il est infalsifiable parce que signé — ce qui permet de publier cette colonne en open data. Un lien ?cle= est alors refusé par le serveur, et le widget « Lien formulaire public » n’en propose pas.

Si vous choisissez un mode « avec clé » alors qu’un flux open data publie justement la colonne clé, l’éditeur vous avertit : les identifiants seraient lisibles dans le jeu de données, et chacun pourrait ouvrir la réponse de n’importe qui.

Ce qui est enregistré, et quand

Cela dépend du mode, et la différence est voulue :

Sur invitation ou avec une clé : en continu
Les réponses partent automatiquement pendant la saisie, sans que le répondant ait à valider. S’il ferme la page, ce qui est saisi est déjà enregistré, et son lien le ramène à sa réponse : remplir en plusieurs fois est le cas normal.
Formulaire public d’ajout : tout à la validation
Rien n’est écrit tant que le visiteur n’a pas validé ; la ligne est créée d’un coup. Une visite abandonnée ne laisse donc aucune fiche à moitié remplie dans la table. Ici l’enregistrement continu n’aurait rien protégé : sans lien personnel, le visiteur ne pourrait de toute façon pas revenir à sa ligne, qui resterait dans la base sans que personne puisse l’atteindre. Sa saisie est gardée dans son navigateur le temps qu’il remplisse (les fichiers choisis sont à redéposer s’il revient plus tard). Rien du tout n’atteint le document avant le clic, pas même un fichier : une visite abandonnée ne laisse aucune trace.

Si des colonnes manquent dans la table, le formulaire est bloqué et affiche les colonnes à créer, plutôt que de perdre des réponses. Le bouton « Créer / compléter la table » de l’éditeur les ajoute.

Publier en open data

Plusieurs flux sur une même table

Comme pour les formulaires, une table peut porter plusieurs flux open data. Le bouton « + Nouveau flux » en crée un de plus ; un sélecteur apparaît alors pour passer de l’un à l’autre. Chaque flux a son numéro, donc son propre lien public, ses colonnes, ses métadonnées et sa case « actif ».

Utile pour diffuser deux extraits différents des mêmes données : par exemple un annuaire grand public réduit à quelques colonnes, et un extrait complet destiné à un partenaire.

Choisir les champs d’un flux
Deux sources au choix, dans « Source des colonnes à publier » : la liste à cocher du widget (tous les champs de la table, avec un filtre et « tout cocher / tout décocher »), ou une vue grille du document — ses colonnes visibles sont alors suivies en direct, pratique si la vue existe déjà.
Choisir les lignes d’un flux
Par défaut toutes les lignes de la table sont publiées. Pour n’en publier qu’une partie, ajoutez à votre table une colonne à cocher (type Booléen) et désignez-la dans « Lignes à publier » : seules les lignes où elle vaut vrai partent dans le flux.
Le plus souvent on y met une formule Grist, par exemple $region == "La Réunion" : Grist la recalcule tout seul quand la donnée change, et vous voyez dans votre table exactement ce qui est publié. Le widget affiche en permanence « N ligne(s) publiée(s) sur M » — le chiffre à regarder avant de diffuser.
La colonne condition n’est jamais publiée : elle vaut vrai sur toutes les lignes du flux, elle n’apprendrait rien. Et si vous la renommez ou la supprimez, le flux cesse de répondre plutôt que de publier tout : en open data, publier plus que prévu ne se rattrape pas, une panne visible se répare.
Les cases sont propres au flux
Elles se cochent dans le widget, pas dans le panneau de configuration de Grist : chaque flux garde ainsi ses propres champs. Le champ qui sert de clé d’accès est signalé en rouge dans la liste. Les champs sont publiés dans l’ordre des colonnes de la table.

La colonne qui identifie une réponse n’est retirée d’office du flux que lorsqu’elle sert de laissez-passer, c’est-à-dire avec un lien à clé : là, la publier permettrait à n’importe qui d’ouvrir et de modifier toutes les réponses. Une case permet malgré tout de l’autoriser, et l’éditeur du formulaire signale la contradiction.
Avec un lien signé ou un formulaire public, c’est l’inverse : le serveur refuse (ou ignore) toute clé passée dans l’URL, l’identifiant n’ouvre donc rien. Il est publié comme n’importe quelle autre colonne — et c’est souhaitable, car c’est lui qui permet de rapprocher votre jeu de données d’autres sources. Sans identifiant stable, un jeu open data ne se joint à rien.

Décrire le jeu de données (métadonnées)

La section « Métadonnées du jeu de données » du widget reprend les métadonnées de data.gouv.fr. Elles sont publiées à part, sur le lien du flux suivi de /metadata, et servent à ceux qui réutilisent les données.

Obligatoires
Titre (il sert aussi de nom du flux dans le sélecteur), description et fréquence de mise à jour — la fréquence prévue, même approximative. Le widget indique en permanence ce qu’il reste à compléter.
Recommandées
Producteur, contact, licence (par défaut, préférez la Licence Ouverte 2.0 ; l’ODbL si vous exigez le partage à l’identique), mots-clés, couverture spatiale et granularité, couverture temporelle, page web de référence.

Licence, fréquence et granularité sont enregistrées avec les identifiants de data.gouv.fr (lov2, annual, fr:commune…) : le flux reste directement réutilisable par une plateforme open data. Dans le widget, vous ne voyez que les libellés en français.