Cartographie - Atlas Académique
Les procédures et les informations concernant la cartographie des établissements
Créer une carte
Procédures
Carte des détails
Administrateurs
Paramétrage de la fiche détail
Paramétrer la fiche détail de l'établissement en fonction des catégories et des champs
<Strong>Informations générales</Strong>
{{ name|gogo_text }}
{{ email|gogo_email(label = "Courriel:") }}
{{ address|gogo_text(label = "Adresse:") }} {{ originalAddress.addressLocality }}
Téléphone: {{ telephone}}
RNE: {{ rne }}
{{ nom_commune }}
Mise à jour: {{ date_maj_ligne }}
<Strong>Autres informations</Strong>
{% for value in groups["type_etablissement"].children %}
<div>Type d'établissement: {{ value.option.name }}</div>
{% endfor %}
{% for value in groups["nom_circonscription"].children %}
<div>Circonscription: {{ value.option.name }}</div>
{% endfor %}
{% for value in groups["pial"].children %}
<div>PIAL: {{ value.option.name }}</div>
{% endfor %}
{% for value in groups["statut_public_prive"].children %}
<div>Statut: {{ value.option.name }}</div>
{% endfor %}
Nombre d'élèves: {{ nombre_d_eleves }}
{% if college_de_secteur %} Collège de secteur: {{ college_de_secteur }} {% else%} {% endif %}
Version 27/05
<Strong>Informations générales</Strong>
{{ name|gogo_text }}
{{ email|gogo_email(label = "Courriel:") }}
{{ address|gogo_text(label = "Adresse:") }} {{ originalAddress.addressLocality }}
{{ files|gogo_text(label = "Toile:") }}
Téléphone: {{ telephone}}
RNE: {{ rne }}
{{ nom_commune }}
Mise à jour: {{ date_maj_ligne }}
<Strong>Autres informations</Strong>
{% for value in groups["type_etablissement"].children %}
<div>Type d'établissement: {{ value.option.name }}</div>
{% endfor %}
{% for value in groups["nom_circonscription"].children %}
<div>Circonscription: {{ value.option.name }}</div>
{% endfor %}
{% for value in groups["pial"].children %}
<div>PIAL: {{ value.option.name }}</div>
{% endfor %}
{% for value in groups["statut_public_prive"].children %}
<div>Statut: {{ value.option.name }}</div>
{% endfor %}
Nombre d'élèves: {{ nombre_d_eleves }}
{% if college_de_secteur %} Collège de secteur: {{ college_de_secteur }} {% else%} {% endif %}
{% if groups["labellisation"].children %}
<div>Labellisation : {% for value in groups["labellisation"].children %}
{{ value.option.name }}
{% endfor %}
</div>
{% else%}
{% endif %}
{% if groups["projet"].children %}
<div> ???? Projets : {% for value in groups["projet"].children %}
{{ value.option.name }}
<details> <summary>Les objectifs???? </summary> {{ objectif|gogo_text}} </details> </a>
<details> <summary>Les objectifs détaillés???? </summary> {{ objectifs_detailles|gogo_text}} </details> </a>
<details> <summary>Plan des actions???? </summary> {{ plan_action|gogo_text}} </details> </a>
{{ partenaires_du_projet|gogo_text(label = "Partenaires:")}}
{% endfor %}
</div>
{% else%}
{% endif %}
Version 3/07/2024 Intégration des données PIX avec %
<Strong>Informations générales</Strong>
{{ name|gogo_text }}
{{ email|gogo_email(label = "Courriel:") }}
{{ address|gogo_text(label = "Adresse:") }} {{ originalAddress.addressLocality }}
<a href="{{ files }}" target="_blank">Toile de l'établissement</a> </br>
Téléphone: {{ telephone}}
RNE: {{ rne }}
{{ nom_commune }}
{% if LUNDI_MATIN_DEBUT %}
{# Horaire de l'établissement #}
<div>
<details> <summary><Strong>Horaire de l'établissement????</Strong> </summary>
<table style="border-collapse: collapse; border: 1px solid black" >
<tr style="border-collapse: collapse; border: 1px solid black">
<th style="border-collapse: collapse; border: 1px solid black">Lundi</th>
<th style="border-collapse: collapse; border: 1px solid black">Mardi</th>
{% if MERCREDI_MATIN_DEBUT %}
<th style="border-collapse: collapse; border: 1px solid black">Mercredi</th>
{% else%} {% endif %}
<th style="border-collapse: collapse; border: 1px solid black">Jeudi</th>
<th style="border-collapse: collapse; border: 1px solid black">Vendredi</th>
{% if SAMEDI_MATIN_DEBUT %}
<th style="border-collapse: collapse; border: 1px solid black">Samedi</th>
{% else%} {% endif %}
</tr>
<tr style="border-collapse: collapse; border: 1px solid black">
<td style="border-collapse: collapse; border: 1px solid black">{{ LUNDI_MATIN_DEBUT.substring(0, 5) }} - {{ LUNDI_MATIN_FIN.substring(0, 5) }} </td>
<td style="border-collapse: collapse; border: 1px solid black">{{ MARDI_MATIN_DEBUT.substring(0, 5) }} - {{ MARDI_MATIN_FIN.substring(0, 5)}} </td>
{% if MERCREDI_MATIN_DEBUT %}
<td style="border-collapse: collapse; border: 1px solid black">{{ MERCREDI_MATIN_DEBUT.substring(0, 5) }} - {{ MERCREDI_MATIN_FIN.substring(0, 5)}} </td>
{% else%} {% endif %}
<td style="border-collapse: collapse; border: 1px solid black">{{ JEUDI_MATIN_DEBUT.substring(0, 5) }} - {{ JEUDI_MATIN_FIN.substring(0, 5)}} </td>
<td style="border-collapse: collapse; border: 1px solid black">{{ VENDREDI_MATIN_DEBUT.substring(0, 5) }} - {{ VENDREDI_MATIN_FIN.substring(0, 5)}} </td>
{% if SAMEDI_MATIN_DEBUT %}
<td style="border-collapse: collapse; border: 1px solid black">{{ SAMED_MATIN_DEBUT.substring(0, 5) }} - {{ SAMEDI_MATIN_FIN.substring(0, 5)}} </td>
{% else%} {% endif %}
</tr>
<tr style="border-collapse: collapse; border: 1px solid black">
<td style="border-collapse: collapse; border: 1px solid black">{{ LUNDI_APRES_MIDI_DEBUT.substring(0, 5) }} - {{ LUNDI_APRES_MIDI_FIN.substring(0, 5) }} </td>
<td style="border-collapse: collapse; border: 1px solid black">{{ MARDI_APRES_MIDI_DEBUT.substring(0, 5) }} - {{ MARDI_APRES_MIDI_FIN.substring(0, 5) }} </td>
{% if MERCREDI_MATIN_DEBUT %}
<td style="border-collapse: collapse; border: 1px solid black">{{ MERCREDI_APRES_MIDI_DEBUT.substring(0, 5) }} - {{ MERCREDI_APRES_MIDI_FIN.substring(0, 5) }} </td>
{% else%} {% endif %}
<td style="border-collapse: collapse; border: 1px solid black">{{ JEUDI_APRES_MIDI_DEBUT.substring(0, 5) }} - {{ JEUDI_APRES_MIDI_FIN.substring(0, 5) }} </td>
<td style="border-collapse: collapse; border: 1px solid black">{{ VENDREDI_APRES_MIDI_DEBUT.substring(0, 5) }} - {{ VENDREDI_APRES_MIDI_FIN.substring(0, 5) }} </td>
{% if SAMEDI_MATIN_DEBUT %}
<td style="border-collapse: collapse; border: 1px solid black">{{ SAMEDI_APRES_MIDI_DEBUT.substring(0, 5) }} - {{ SAMED_APRES_MIDI_FIN.substring(0, 5) }} </td>
{% else%} {% endif %}
</tr>
</table>
{% else%} {% endif %}
</details>
</div>
Mise à jour: {{ date_maj_ligne }}
<Strong>Autres informations</Strong>
{% for value in groups["type_etablissement"].children %}
<div>Type d'établissement: {{ value.option.name }}</div>
{% endfor %}
{% for value in groups["nom_circonscription"].children %}
<div>Circonscription: {{ value.option.name }}</div>
{% endfor %}
{% for value in groups["pial"].children %}
<div>PIAL: {{ value.option.name }}</div>
{% endfor %}
{% for value in groups["statut_public_prive"].children %}
<div>Statut: {{ value.option.name }}</div>
{% endfor %}
Nombre d'élèves: {{ nombre_d_eleves }}
{% if college_de_secteur %} Collège de secteur: {{ college_de_secteur }} {% else%} {% endif %}
{% if groups["labellisation"].children %}
<div>Labellisation-Certification : {% for value in groups["labellisation"].children %}
{{ value.option.name }}
{% endfor %}
</div>
{% else%}
{% endif %}
{% if groups["labellisation"].children %}
{% if participants %}
<div> <strong>PIX : </strong>{{ certifies}} élèves certifiés soit {% set reussite = (certifies/participants*100)//1 %} {{reussite}} % </br>
{# <table style="border-collapse: collapse; border: 1px solid black">#}
{# <tr style=" border: 1px solid black">#}
{# <th style=" border: 1px solid black">Participants:</th> #}
{# <th style=" border: 1px solid black">Non Certifies:</th> #}
{# <th style=" border: 1px solid black">Certifies:</th>#}
{# </tr>#}
{# <tr>#}
{# <td style=" border: 1px solid black">{{ participants|gogo_text}}</td>#}
{# <td style=" border: 1px solid black">{{ non_obtenues|gogo_text}}</td> #}
{# <td style=" border: 1px solid black">{{ certifies|gogo_text}}</td>#}
{# </tr>#}
{# </table> #}
</div>
{% else%} {% endif %}
{% else%}
{% endif %}
{% if groups["projet"].children %}
<div> ???? Projets : {% for value in groups["projet"].children %}
{{ value.option.name }}
<details> <summary>Les objectifs???? </summary> {{ objectif|gogo_text}} </details> </a>
<details> <summary>Les objectifs détaillés???? </summary> {{ objectifs_detailles|gogo_text}} </details> </a>
<details> <summary>Plan des actions???? </summary> {{ plan_action|gogo_text}} </details> </a>
{{ partenaires_du_projet|gogo_text(label = "Partenaires:")}}
{% endfor %}
</div>
{% else%}
{% endif %}
Catégorie
Sous-couche de carte
SAEI : Les 3 antennes 01-cole_inclusive_2024.geojson
SAEI : Les 3 antennes 02-ecole_inclusive_couleur.geojson
Communes de la Réunion : https://geo.api.gouv.fr/departements/974/communes?format=geojson&geometry=contour
Liste des API
API dans l'ordre d'importance
1) Liste des établissements - Données locales https://portail.ac-reunion.fr/swami/public/api/etablissements/
Importation du fichier vierge avec les têtes de colonne dans GRIST : Annuaire-ETAB-ACA-ALL.csv
Ce code permet d'ajouter, de corriger les établissements mis à jour.
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Import Lycées La Réunion</title>
<script src="https://docs.getgrist.com/grist-plugin-api.js"></script>
<style>
#importEtabBtn {
margin: 10px;
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-family: sans-serif;
font-size: 14px;
transition: background-color 0.3s;
}
#importEtabBtn:hover:not(:disabled) {
background-color: #45a049;
}
#importEtabBtn:disabled {
background-color: #cccccc;
cursor: not-allowed;
}
</style>
</head>
<body>
<div style="font-family: sans-serif; padding: 1em;">
<h2>Import des établissements</h2>
<p>Cliquez sur le bouton ci-dessous pour mettre à jour la table **"Annuaire_ETAB_ACA_ALL"**.</p>
<button id="importEtabBtn">Mettre à jour l'annuaire</button>
<p id="status" style="margin-top: 10px; color: #666;"></p>
</div>
<script>
// Demande un accès complet pour lire et écrire
grist.ready({ requiredAccess: 'full' });
// Liste des noms de colonnes pour la cohérence
const COLUMN_NAMES = [
"uaj", "nom", "denominationOfficielle", "uajDenominationOfficielle",
"type", "rue", "bassin", "code_postal", "ville", "tel", "fax", "mail", "lat", "lon"
];
/**
* Récupère les données d'établissements via l'API externe.
*/
async function fetchEtab() {
const apiUrl = "https://portail.ac-reunion.fr/swami/public/api/etablissements/";
try {
document.getElementById("status").textContent = "Récupération des données en cours...";
const response = await fetch(apiUrl);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const data = await response.json();
const results = data.data?.values || [];
document.getElementById("status").textContent = `${results.length} établissements trouvés.`;
return results;
} catch (error) {
document.getElementById("status").textContent = `Erreur : ${error.message}`;
console.error("Erreur API :", error);
return [];
}
}
/**
* Met à jour (UpdateRecord) ou insère (AddRecord) les enregistrements.
*/
async function upsertIntoGristOptimized(etabs) {
document.getElementById("status").textContent = "Préparation des mises à jour en cours...";
const tableId = "Annuaire_ETAB_ACA_ALL";
const uajColumn = "uaj";
// 1. LECTURE : Récupération des enregistrements existants (docApi.fetchTable est fiable)
const allRecords = await grist.docApi.fetchTable(tableId, ['id', uajColumn]);
// Création de la Map de recherche rapide
const uajToIdMap = new Map();
if (allRecords[uajColumn]) {
allRecords[uajColumn].forEach((uaj, index) => {
uajToIdMap.set(uaj, allRecords.id[index]);
});
}
const actions = []; // Liste des actions à envoyer
let createdCount = 0;
let updatedCount = 0;
for (const etab of etabs) {
const recordId = uajToIdMap.get(etab.uaj);
// Construction de l'objet d'enregistrement (format clé-valeur)
const recordObject = {};
COLUMN_NAMES.forEach(col => {
const value = etab[col];
// Assurer que les valeurs manquantes sont correctement traitées
if (value !== undefined && value !== null) {
recordObject[col] = value;
} else if (["rue", "bassin", "fax", "mail"].includes(col)) {
recordObject[col] = ""; // Les champs texte optionnels doivent être des chaînes vides
} else {
recordObject[col] = null; // Autres champs (nombre/lien) sont null
}
});
if (recordId) {
// MISE À JOUR (Action Ligne par Ligne)
// Format: ['UpdateRecord', TableID, RowID, RecordObject]
actions.push(
['UpdateRecord', tableId, recordId, recordObject]
);
updatedCount++;
} else {
// CRÉATION (Action Ligne par Ligne)
// Format: ['AddRecord', TableID, RowID (null), RecordObject]
actions.push(
['AddRecord', tableId, null, recordObject]
);
createdCount++;
}
}
// 2. ENVOI DES ACTIONS
if (actions.length > 0) {
document.getElementById("status").textContent = `Envoi de ${actions.length} opérations à Grist... (peut prendre du temps)`;
// Envoi de toutes les actions (créations + mises à jour ligne par ligne)
await grist.docApi.applyUserActions(actions);
}
return { created: createdCount, updated: updatedCount };
}
/**
* Fonction principale déclenchée par le bouton.
*/
async function importEtab() {
const btn = document.getElementById("importEtabBtn");
btn.disabled = true;
btn.textContent = "Importation en cours...";
try {
const etabs = await fetchEtab();
if (etabs.length > 0) {
document.getElementById("status").textContent = "Mise à jour de la base en cours...";
const result = await upsertIntoGristOptimized(etabs);
document.getElementById("status").textContent =
`✅ **${result.created}** établissements ajoutés, **${result.updated}** établissements mis à jour.`;
} else {
document.getElementById("status").textContent = "Aucun établissement trouvé à traiter.";
}
} catch (error) {
document.getElementById("status").textContent = "❌ Une erreur critique est survenue. Vérifiez la console (F12) et l'accès.";
console.error("Erreur critique d'importation :", error);
} finally {
btn.disabled = false;
btn.textContent = "Mettre à jour l'annuaire";
}
}
document.getElementById("importEtabBtn").addEventListener("click", importEtab);
</script>
</body>
</html>
GRIST
Tous les éléments permettant l'introduction des données pour être utiliser dans GRIST
API DATA GOUV -> GRIST
Script d'appel à synchronisation des données de DATA GOUV dans GRIST
1) Insérer le fichier CSV ci-dessous " importer un fichier"
identifiant_de_l_etablissement,nom_.csv
2) Créer une vue page ou une page avec "Custom widget"
3) Copier le code ci-dessous dans la partie HTML en faisant bien attention de faire appel à la bonne table " const table = grist.getTable("Annuaire_etab");"
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Import Lycées La Réunion</title>
<script src="https://docs.getgrist.com/grist-plugin-api.js"></script>
<style>
#importEtabBtn {
margin: 10px;
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-family: sans-serif;
font-size: 14px;
}
#importEtabBtn:hover {
background-color: #45a049;
}
</style>
</head>
<body>
<div style="font-family: sans-serif; padding: 1em;">
<h2>Import des établissements depuis data.education.gouv.fr</h2>
<p>
Cliquez sur le bouton ci-dessous pour mettre à jour la table "annuaire_etab"
avec les données des lycées de La Réunion.
</p>
<button id="importEtabBtn">Mettre à jour l'annuaire</button>
<p id="status" style="margin-top: 10px; color: #666;"></p>
</div>
<script>
grist.ready({requiredAccess: 'full'});
async function fetchEtab() {
const apiUrl = "https://data.education.gouv.fr/api/explore/v2.1/catalog/datasets/fr-en-annuaire-education/records?select=identifiant_de_l_etablissement%2Cnom_etablissement%2Ctype_etablissement%2Cstatut_public_prive%2Cadresse_1%2Cadresse_2%2Cadresse_3%2Ccode_postal%2Cnom_commune%2Cvoie_generale%2Cvoie_technologique%2Cvoie_professionnelle%2Ctelephone%2Cfax%2Cweb%2Cmail%2Crestauration%2Chebergement%2Culis%2Capprentissage%2Csegpa%2Csection_arts%2Csection_cinema%2Csection_theatre%2Csection_sport%2Csection_internationale%2Csection_europeenne%2Clycee_agricole%2Clycee_militaire%2Clycee_des_metiers%2Cpost_bac%2Cappartenance_education_prioritaire%2Cgreta%2Cnombre_d_eleves%2Cfiche_onisep%2Ctype_contrat_prive%2Cnom_circonscription%2Clatitude%2Clongitude%2Cprecision_localisation%2Cdate_maj_ligne%2Ccode_nature%2Clibelle_nature%2Ccode_type_contrat_prive%2Cpial%2Cetablissement_mere%2Ctype_rattachement_etablissement_mere&limit=100&refine=type_etablissement%3A%22Lyc%C3%A9e%22&refine=libelle_academie%3A%22La%20R%C3%A9union%22";
try {
document.getElementById("status").textContent = "Récupération des données en cours...";
const response = await fetch(apiUrl);
if (!response.ok) {
throw new Error("HTTP " + response.status);
}
const data = await response.json();
const results = data.results || [];
document.getElementById("status").textContent =
results.length + " établissements trouvés.";
return results;
} catch (error) {
document.getElementById("status").textContent =
"Erreur lors de la récupération des données.";
console.error("Erreur API :", error);
return [];
}
}
async function insertIntoGrist(etabs) {
const table = grist.getTable("Annuaire_etab");
const records = etabs.map(etab => ({
fields: {
identifiant_de_l_etablissement: etab.identifiant_de_l_etablissement,
nom_etablissement: etab.nom_etablissement,
type_etablissement: etab.type_etablissement,
statut_public_prive: etab.statut_public_prive,
adresse_1: etab.adresse_1 || "",
adresse_2: etab.adresse_2 || "",
adresse_3: etab.adresse_3 || "",
code_postal: etab.code_postal,
nom_commune: etab.nom_commune,
voie_generale: etab.voie_generale,
voie_technologique: etab.voie_technologique,
voie_professionnelle: etab.voie_professionnelle,
telephone: etab.telephone,
fax: etab.fax || "",
web: etab.web || "",
mail: etab.mail || "",
restauration: etab.restauration || "",
hebergement: etab.hebergement || "",
ulis: etab.ulis || "",
apprentissage: etab.apprentissage || "",
segpa: etab.segpa || "",
section_arts: etab.section_arts || "",
section_cinema: etab.section_cinema || "",
section_theatre: etab.section_theatre || "",
section_sport: etab.section_sport || "",
section_internationale: etab.section_internationale || "",
section_europeenne: etab.section_europeenne || "",
lycee_agricole: etab.lycee_agricole || "",
lycee_militaire: etab.lycee_militaire || "",
lycee_des_metiers: etab.lycee_des_metiers || "",
post_bac: etab.post_bac || "",
appartenance_education_prioritaire: etab.appartenance_education_prioritaire || "",
greta: etab.greta || "",
nombre_d_eleves: etab.nombre_d_eleves || "",
fiche_onisep: etab.fiche_onisep || "",
type_contrat_prive: etab.type_contrat_prive || "",
nom_circonscription: etab.nom_circonscription || "",
latitude: etab.latitude,
longitude: etab.longitude,
precision_localisation: etab.precision_localisation || "",
date_maj_ligne: etab.date_maj_ligne || "",
code_nature: etab.code_nature || "",
libelle_nature: etab.libelle_nature || "",
code_type_contrat_prive: etab.code_type_contrat_prive || "",
pial: etab.pial || "",
etablissement_mere: etab.etablissement_mere || "",
type_rattachement_etablissement_mere: etab.type_rattachement_etablissement_mere || ""
}
}));
try {
document.getElementById("status").textContent =
"Insertion des données dans Grist...";
await table.create(records);
document.getElementById("status").textContent =
records.length + " établissements ajoutés avec succès !";
} catch (error) {
document.getElementById("status").textContent =
"Erreur lors de l'insertion des données.";
console.error("Erreur Grist :", error);
}
}
async function importEtab() {
const etabs = await fetchEtab();
if (etabs.length > 0) {
await insertIntoGrist(etabs);
}
}
document
.getElementById("importEtabBtn")
.addEventListener("click", importEtab);
</script>
</body>
</html>
GRIST -> N8N -> GOGO Carto
Création du workflow N8N
Tout d’abord, un webhook fait office de point d’entrée de la donnée. C’est là que se trouve l’URL que vous devrez renseigner dans GoGoCarto pour faire dialoguer ces outils entre eux (cf. étapes suivantes) :
HTTP Method = GET
Authentication = None
Respond = When Last Node Finishes (le webhook renverra automatiquement la donnée produite par le dernier nœud exécuté)
Response Data = First Entry JSON
Cliquez sur « Add Option » et ajoutez Response Content-Type = application/json
L’étape suivante du workflow est un nœud Action in a app > Grist dans lequel vous allez préciser le tableau qui contient les données à cartographier :
- Pour créer les identifiants (credentials) nécessaires à la connexion, renseignez la clé API disponible dans les paramètres de votre compte Grist
- Operation = Get Many rows
- vous devez renseigner le docID du document Grist contenant le tableau (disponible via Grist dans la page « Paramètres », section « API ») et le Table ID du tableau (page « Données source »)
- Activez l’interrupteur « Return All »
- Vous pouvez ajouter un filtre sur une colonne pour ne récupérer qu’une partie des données du tableau, comme vous le feriez dans Grist. Vous pourrez ainsi filtrer les données sur une colonne de validation (à créer au préalable dans le tableau Grist) et vous assurer que les données non validées ne transitent pas vers GoGoCarto.
Le nœud suivant est de type Data Transformation > Edit Fields : c’est la couche de normalisation. Grâce à lui, chaque colonne provenant de Grist sera renommée, typée, et éventuellement convertie (texte, booléen, liste, coordonnées, etc.) pour correspondre exactement à la structure attendue par GoGoCarto. Paramétrez ce nœud en fonction du modèle de données que vous voulez définir.
Le nœud final est Data Transformation > Aggregate, qui regroupe toutes les lignes transformées en un seul tableau, lequel est envoyé à GoGoCarto par le webhook :
Aggregate = All Item Data (Into a Single List)
Put Output in Field = Data
Include = All Fields
Connexion à GOGO Carto -> N8N
Dans le volet d’administration, ouvrez la page « Import Dynamique »

- Dans l’onglet « Général », précisez bien " Type de la source = API JSON" ainsi que l’adresse du webhook (cf. étapes précédentes) dans « URL de l’API JSON »
- Sur ce même onglet, vérifiez la fréquence de mise à jour des données
Une fois ces réglages sauvegardés, vous n’avez plus rien à faire : GoGoCarto enverra automatiquement la requête GET via n8n pour remplir votre carte avec les données de votre Grist.