Introduction
Ce post documente un flux de travail expérimental développé et testé dans ArcGIS Online Experience Builder pour le formatage visuel conditionnel à l'intérieur du widget Table. L'approche utilise une source de données Arcade pour générer un FeatureSet virtuel contenant des champs de chaîne calculés. Ces champs peuvent contenir des symboles Unicode ou du HTML/CSS généré selon les valeurs d'attribut.
Le FeatureSet résultant est ensuite utilisé comme source d'une Table standard dans Experience Builder. Dans l'environnement testé, cela a permis des indicateurs Unicode, du texte coloré conditionnellement, des valeurs numériques colorées, et un bloc coloré expérimental qui approxime visuellement une cellule de table formatée conditionnellement. Les données sources originales ne sont pas modifiées.
Note sur le formatage avancé dans Experience Builder. Experience Builder supporte également le contenu dynamique et le style basés sur Arcade dans les contextes de widgets supportés. Le flux de travail décrit ici traite un cas différent : le formatage visuel conditionnel des valeurs affichées à l'intérieur du widget Table standard en générant du contenu formaté dans un FeatureSet Arcade Data. Il ne doit pas être interprété comme un formatage conditionnel natif au niveau des cellules fourni par le widget Table.
1. Idée de base
Flux de travail :
Table originale 192 Arcade Data 192 FeatureSet virtuel 192 Widget Table
Pour un exemple générique reproductible, supposons que la table source contient OBJECTID, REACH_ID (une clé commune unique), et AREA (une valeur numérique). Les règles de démonstration sont délibérément arbitraires : AREA = -99999 signifie Pas de Données ; AREA < 100 signifie BAS ; AREA 265 100 signifie HAUT.
2. Créer la source Arcade Data
Dans Experience Builder, utilisez DonnE9es 192 Ajouter des donnE9es 192 Arcade, puis lisez la table source avec FeatureSetByPortalItem().
var p = Portal("https:\/\/YOURPORTAL.maps.arcgis.com");
var fs = FeatureSetByPortalItem(
p,
"YOUR_ITEM_ID",
2,
["OBJECTID", "REACH_ID", "AREA"],
false
);
Remplacez YOURPORTAL, YOUR_ITEM_ID, et l'ID de la table/couche par vos propres valeurs. La gE9omE9trie n'est pas requise pour cet exemple de table, donc includeGeometry est false.
3. Exemple complet en Arcade
Le script complet suivant conserve les attributs originaux et crE9e cinq champs expérimentaux afin que les rE9sultats puissent EAtre comparE9s cF4te E0 cF4te.
// ============================================================
// 1. CONNEXION AU PORTAIL
// ============================================================
var p = Portal("https:\/\/YOURPORTAL.maps.arcgis.com");
// ============================================================
// 2. LECTURE DE LA TABLE ORIGINALE
// ============================================================
var fs = FeatureSetByPortalItem(
p,
"YOUR_ITEM_ID",
2,
["OBJECTID", "REACH_ID", "AREA"],
false
);
// ============================================================
// 3. DÉFINITION DU FEATURESET VIRTUEL
// ============================================================
var output = {
fields: [
{
name: "OBJECTID",
alias: "OBJECTID",
type: "esriFieldTypeOID"
},
{
name: "REACH_ID",
alias: "Reach ID",
type: "esriFieldTypeString",
length: 50
},
{
name: "AREA",
alias: "Surface",
type: "esriFieldTypeDouble"
},
{
name: "TEST_UNICODE",
alias: "Unicode",
type: "esriFieldTypeString",
length: 50
},
{
name: "TEST_HTML",
alias: "Texte HTML",
type: "esriFieldTypeString",
length: 150
},
{
name: "TEST_VALUE",
alias: "Unicode + valeur",
type: "esriFieldTypeString",
length: 50
},
{
name: "TEST_HTML_VALUE",
alias: "Valeur HTML",
type: "esriFieldTypeString",
length: 150
},
{
name: "TEST_BACKGROUND",
alias: "Test d'arrière-plan",
type: "esriFieldTypeString",
length: 300
}
],
geometryType: "",
features: []
};
// ============================================================
// 4. LOOP THROUGH SOURCE RECORDS
// ============================================================
for (var f in fs) {
var reachID = f.REACH_ID;
var area = f.AREA;
// TEST 1 - Unicode indicator
var unicodeResult = "";
if (area == -99999) {
unicodeResult = "⚪ ND";
}
else if (area < 100) {
unicodeResult = "🔴 LOW";
}
else {
unicodeResult = "🟢 HIGH";
}
// TEST 2 - HTML colored text
var htmlResult = "";
if (area == -99999) {
htmlResult = "<span style='color:gray'>ND</span>";
}
else if (area < 100) {
htmlResult = "<span style='color:red'>LOW</span>";
}
else {
htmlResult = "<span style='color:green'>HIGH</span>";
}
// TEST 3 - Unicode indicator + original value
var valueResult = "";
if (area == -99999) {
valueResult = "⚪ ND";
}
else if (area < 100) {
valueResult = "🔴 " + Text(area, "#,##0.00");
}
else {
valueResult = "🟢 " + Text(area, "#,##0.00");
}
// TEST 4 - Original value colored with HTML
var htmlValue = "";
if (area == -99999) {
htmlValue = "<span style='color:gray'>ND</span>";
}
else if (area < 100) {
htmlValue =
"<span style='color:red'>" +
Text(area, "#,##0.00") +
"</span>";
}
else {
htmlValue =
"<span style='color:green'>" +
Text(area, "#,##0.00") +
"</span>";
}
// TEST 5 - Experimental simulated cell background
// This styles a block inside the field; it does NOT
// modify the native Table cell itself.
var backgroundResult = "";
if (area == -99999) {
backgroundResult =
"<div style='" +
"background-color:gray;" +
"color:white;" +
"width:100%;" +
"padding:6px;" +
"text-align:center;" +
"font-weight:bold" +
"'>ND</div>";
}
else if (area < 100) {
backgroundResult =
"<div style='" +
"background-color:red;" +
"color:white;" +
"width:100%;" +
"padding:6px;" +
"text-align:center;" +
"font-weight:bold" +
"'>" +
Text(area, "#,##0.00") +
"</div>";
}
else {
backgroundResult =
"<div style='" +
"background-color:green;" +
"color:white;" +
"width:100%;" +
"padding:6px;" +
"text-align:center;" +
"font-weight:bold" +
"'>" +
Text(area, "#,##0.00") +
"</div>";
}
// BUILD OUTPUT RECORD
Push(
output.features,
{
attributes: {
OBJECTID: f.OBJECTID,
REACH_ID: reachID,
AREA: area,
TEST_UNICODE: unicodeResult,
TEST_HTML: htmlResult,
TEST_VALUE: valueResult,
TEST_HTML_VALUE: htmlValue,
TEST_BACKGROUND: backgroundResult
}
}
);
}
// ============================================================
// 5. RETURN THE VIRTUAL FEATURESET
// ============================================================
return FeatureSet(
Text(output)
);
4. Use the Arcade Data source in the Table widget
Run and apply the expression, then configure a Table widget to use the Arcade Data source. The output should expose OBJECTID, REACH_ID, AREA, TEST_UNICODE, TEST_HTML, TEST_VALUE, TEST_HTML_VALUE, and TEST_BACKGROUND.
Practical observation: after adding fields to the Arcade expression, the Table may continue to use the previous schema. If a new field appears in the Arcade output but not in the Table, make the Table re-read/refresh the Arcade Data source.
5. Filter the virtual table from a map selection
Retain the same common key in the source feature layer and in the virtual FeatureSet. Configure Map → Action → Record selection changes → Filter data.
Setting | Value |
|---|
Trigger data | Feature layer |
Trigger field | REACH_ID |
Action data | Arcade Data |
Action field | REACH_ID |
Mode | Default |
With a 1:1 relationship, selecting a map feature filters the virtual Table to the corresponding record.
6. Results verified in the tested environment
- Unicode indicators: worked.
- Unicode indicator + numeric value: worked.
- HTML text color using <span>: worked.
- HTML-colored numeric values: worked.
- Background-color block using <div>: worked experimentally.
Figure 1. Conditional visual formatting verified in the Experience Builder Table: Unicode indicator, HTML-colored text, Unicode indicator with numeric value, HTML-colored numeric value, and experimental simulated cell background.
7. Important distinction and limitations
This should not be described as native conditional formatting of the Table widget. A more accurate description is conditional visual formatting of the content of a virtual Arcade field displayed by the Table widget.
The background test does not style the native table cell. It renders an HTML block inside the field content and uses width, padding, background-color, text alignment, and font weight to visually approximate a colored cell.
The <div>-based background behavior should be treated as experimental. It was verified in the tested ArcGIS Online environment, but it should not be assumed to be a stable supported API contract. HTML/CSS sanitization or rendering behavior may change between updates or between ArcGIS Online and ArcGIS Enterprise. Keep production HTML simple and retest after updates.
Limitation du nombre de fonctionnalités et comportement observé. La documentation Esri indique un maximum de 50 000 entités lorsqu'un FeatureSet est utilisé pour construire une collection d'entités. Les FeatureSets virtuels construits dans ce post relèvent du type de flux de travail pour lequel cette limite documentée est pertinente. Cependant, des tests supplémentaires dans le même environnement ArcGIS Online ont utilisé avec succès 50 001 et 100 000 enregistrements générés dans le widget Table, y compris des requêtes directes sur OBJECTID 50001 et 100000. La section 9 documente ce décalage en détail. Le comportement observé est expérimental et ne doit pas être considéré comme un remplacement pris en charge de la limite documentée par Esri.
8. Validation supplémentaire : filtrage 1:N et transformation virtuelle wide-to-long
Deux tests supplémentaires ont été réalisés pour vérifier que Arcade Data peut supporter un flux de travail 1:N piloté par une sélection sur la carte. Les deux tests utilisaient le même identifiant commun de tronçon dans la couche cartographique et dans la table ou le FeatureSet virtuel.
Test 1 - Table physique 1:N existante. Une source Arcade Data a été créée à partir d'une table existante déjà organisée en forme longue, avec plusieurs enregistrements de débit-durée pour chaque tronçon. Une action Carte (Changements de sélection d'enregistrement 12 Filtrer les enregistrements de données) a relié l'identifiant du tronçon dans la couche d'entités au même identifiant dans la source Arcade Data. La sélection d'un tronçon a filtré la Table vers tous les enregistrements correspondants, pas seulement un seul enregistrement. Cela confirme qu'une source Arcade Data virtuelle peut participer à un flux de travail de filtrage 1:N.
Figure 2. Test 1 : la sélection du tronçon Arno_3629 filtre la table Arcade Data 1:N vers plusieurs enregistrements débit-durée pour le même tronçon.
Test 2 - Transformation virtuelle wide-to-long. La table source a été lue dans sa structure large originale, où les valeurs de débit pour différentes durées sont stockées dans des champs séparés. Arcade a transformé dynamiquement chaque enregistrement source en plusieurs enregistrements virtuels contenant l'ID du tronçon, le débit, l'étiquette de durée et la durée numérique. Le FeatureSet virtuel 1:N résultant a ensuite été connecté au même filtre de sélection sur la carte. La sélection du même tronçon a renvoyé les multiples enregistrements attendus et les valeurs de débit correspondaient à celles de la table physique en forme longue correspondante, à l'exception des arrondis d'affichage.
Figure 3. Test 2 : Arcade crée une table virtuelle 1:N à partir d'une table source large et le résultat est filtré avec succès par le tronçon sélectionné.
Ces tests étendent la validation initiale 1:1. Dans l'environnement testé ArcGIS Online Experience Builder, Arcade Data a pu à la fois exposer une structure 1:N existante et créer dynamiquement une structure dérivée 1:N sans modifier le service source.
Pour des ensembles de données plus volumineux, le nombre d'enregistrements virtuels résultant doit donc être considéré conjointement avec la limite de collection d'entités mentionnée ci-dessus.
9. Validation supplémentaire : comportement au-delà de la limite documentée de 50 000 entités
La documentation Esri indique que lorsqu'un résultat Arcade Data est utilisé pour construire une collection d'entités, le FeatureSet utilisé pour construire cette collection peut contenir un maximum de 50 000 entités. Parce que les exemples dans ce post construisent un nouveau FeatureSet avec FeatureSet(Text(output)), un test supplémentaire a été réalisé pour observer ce qui se passe lorsque ce seuil documenté est dépassé dans l'environnement actuel ArcGIS Online Experience Builder.
Une source Arcade Data synthétique a été créée avec deux champs (OBJECTID et TEST_VALUE) et sans géométrie. L'expression générait des enregistrements séquentiels en mémoire et les retournait avec FeatureSet(Text(output)). Les tests à 49 999 et 50 000 enregistrements se sont exécutés normalement. L'expression a ensuite été testée à 50 001 enregistrements.
À 50 001 enregistrements, l'éditeur Arcade a toujours évalué l'expression avec succès. Après que la source de données ait été ajoutée à Experience Builder, le widget Table standard a rapporté un total de 50 001 enregistrements. Un filtre Table utilisant OBJECTID = 50001 a renvoyé l'enregistrement attendu, confirmant que l'enregistrement au-delà du seuil documenté de 50 000 n'était pas simplement inclus dans le compte affiché mais était directement interrogeable.
Le test a ensuite été répété avec 100 000 enregistrements générés. Le widget Table a accepté la source de données, et un filtre utilisant OBJECTID = 100000 a renvoyé l'enregistrement attendu ainsi que TEST_VALUE = 100000. Dans cet environnement testé, le FeatureSet virtuel est donc resté utilisable au moins jusqu'à 100 000 enregistrements.
Cette observation ne doit pas être interprétée comme annulant la limite documentée par Esri de 50 000 entités ni comme une garantie prise en charge pour les applications en production. Elle documente uniquement le comportement observé dans ArcGIS Online Experience Builder en août 2026. Le comportement effectif peut dépendre des détails d'implémentation et peut changer avec les futures mises à jour d'ArcGIS Online ou différer dans ArcGIS Enterprise. Les applications doivent continuer à être conçues avec la limite documentée à l'esprit sauf si Esri clarifie ou met à jour la spécification.
Implication pratique pour les transformations wide-to-long. Une transformation peut multiplier le nombre d'enregistrements virtuels produits à partir de chaque enregistrement source. Les tests ci-dessus montrent que dépasser 50 000 n'a pas immédiatement échoué dans l'environnement testé, mais ce comportement observé ne doit pas être utilisé comme raison pour concevoir des transformations côté client sans limites. La performance, l'utilisation mémoire, les ressources du navigateur et la compatibilité future doivent également être prises en compte.
Figure 4. Validation expérimentale au-delà du seuil documenté de 50 000 entités. Un FeatureSet virtuel Arcade contenant 100 000 enregistrements générés est utilisé par le widget Table d'Experience Builder. Le filtrage sur OBJECTID = 100 000 renvoie avec succès l'enregistrement correspondant, confirmant que cet enregistrement est directement interrogeable dans l'environnement ArcGIS Online testé (août 2026).
Le résultat montré dans la Figure 4 est un comportement expérimental observé et ne doit pas être interprété comme supplantant la limite documentée par Esri de 50 000 entités.
10. Pourquoi cette technique peut être utile au-delà du formatage
- Combiner des attributs sélectionnés provenant de plusieurs tables utilisant une clé commune.
- Calculer des champs sans modifier le service source.
- Remplacer des valeurs sentinelles telles que -99999 par ND.
- Agrégater ou résumer des enregistrements issus de relations 1:N.
- Créer des tables récapitulatives dérivées.
- Conserver une clé relationnelle afin que le résultat réagisse aux sélections sur la carte.
- Explorer des FeatureSets dérivés incluant la géométrie pour d'autres flux de travail.
En ce sens, Arcade Data peut agir comme une couche légère virtuelle de transformation entre les services sources et les widgets Experience Builder.
Conclusion
Données sources 12 Arcade Data 12 FeatureSet virtuel 12 Champs HTML calculés 12 Table Experience Builder 12 Formatage visuel conditionnel
La table source reste intacte. Les approches basées sur Unicode et <span> sont les options les plus conservatrices. La technique du bloc arrière-plan est visuellement puissante mais doit être explicitement identifiée comme expérimentale.
Remerciements et transparence
Ce flux de travail a été développé via une série itérative d'expériences utilisant ChatGPT (OpenAI) comme assistant technique.
ChatGPT a aidé à explorer des approches possibles ainsi qu'à générer et affiner le code Arcade, tandis que chaque comportement décrit dans ce post a été testé directement dans ArcGIS Online Experience Builder.
La validation expérimentale était importante : certaines hypothèses initiales - notamment que le formatage HTML ne serait pas rendu par le widget Table - se sont avérées incorrectes lors des tests dans le widget réel. Ces observations ont conduit aux tests ultérieurs avec des valeurs numériques colorées et le bloc background-color.
Environnement de test : ArcGIS Online Experience Builder, août 2026.
Références documentaires
022 Esri, documentation ArcGIS Experience Builder, 20Sélectionner des données20 12 Ajouter des données avec Arcade ; exigences sur le retour FeatureSet et limite documentée de collection d'entités à 50 000 entités. La section 9 rapporte séparément les comptes plus élevés observés expérimentalement dans l'environnement testé.
022 Esri, documentation ArcGIS Experience Builder, 20Formatage avancE920 12 Contenu dynamique basé sur Arcade et style dans les contextes supportE9s par les widgets.