Introdução
Esta postagem documenta um fluxo de trabalho experimental desenvolvido e testado no ArcGIS Online Experience Builder para formatação visual condicional dentro do widget Tabela. A abordagem usa uma fonte de dados Arcade para gerar um FeatureSet virtual contendo campos de string calculados. Esses campos podem conter símbolos Unicode ou HTML/CSS gerados de acordo com os valores dos atributos.
O FeatureSet resultante é então usado como a fonte de uma Tabela padrão do Experience Builder. No ambiente testado, isso permitiu indicadores Unicode, texto colorido condicionalmente, valores numéricos coloridos e um bloco colorido experimental que aproxima visualmente uma célula da tabela formatada condicionalmente. Os dados originais da fonte não são modificados.
Nota sobre formatação avançada no Experience Builder. O Experience Builder também suporta conteúdo dinâmico baseado em Arcade e estilização em contextos de widgets suportados. O fluxo de trabalho descrito aqui aborda um caso diferente: formatação visual condicional dos valores exibidos dentro do widget Tabela padrão, gerando conteúdo formatado em um FeatureSet de dados Arcade. Não deve ser interpretado como formatação condicional nativa a nível de célula fornecida pelo widget Tabela.
1. Ideia básica
Fluxo de trabalho:
Tabela original 192 Arcade Data 192 FeatureSet virtual 192 Widget Tabela
Para um exemplo genérico reproduzível, assuma que a tabela fonte contém OBJECTID, REACH_ID (uma chave comum única) e AREA (um valor numérico). As regras da demonstração são deliberadamente arbitrárias: AREA = -99999 significa Sem Dados; AREA < 100 significa BAIXO; AREA >= 100 significa ALTO.
2. Criar a fonte Arcade Data
No Experience Builder use Dados 192 Adicionar dados 192 Arcade, então leia a tabela fonte com FeatureSetByPortalItem().
var p = Portal("https:\/\/YOURPORTAL.maps.arcgis.com");
var fs = FeatureSetByPortalItem(
p,
"YOUR_ITEM_ID",
2,
["OBJECTID", "REACH_ID", "AREA"],
false
);
Substitua YOURPORTAL, YOUR_ITEM_ID e o ID da tabela\/camada pelos seus próprios valores. Geometria não é necessária para este exemplo de tabela, então includeGeometry é false.
3. Exemplo completo em Arcade
O script completo a seguir mantém os atributos originais e cria cinco campos experimentais para que os resultados possam ser comparados lado a lado.
\/\/ ============================================================
\/\/ 1. CONEXÃO COM PORTAL
\/\/ ============================================================
var p = Portal("https:\/\/YOURPORTAL.maps.arcgis.com");
\/\/ ============================================================
\/\/ 2. LEIA A TABELA ORIGINAL
\/\/ ============================================================
var fs = FeatureSetByPortalItem(
p,
"YOUR_ITEM_ID",
2,
["OBJECTID", "REACH_ID", "AREA"],
false
);
\/\/ ============================================================
\/\/ 3. DEFINA O FEATURESET VIRTUAL
\/\/ ============================================================
var output = {
fields: [
{
name: "OBJECTID",
alias: "OBJECTID",
type: "esriFieldTypeOID"
},
{
name: "REACH_ID",
alias: "Reach ID",
type: "esriFieldTypeString",
length: 50
},
{
name: "AREA",
alias: "Área",
type: "esriFieldTypeDouble"
},
{
name: "TEST_UNICODE",
alias: "Unicode",
type: "esriFieldTypeString",
length: 50
},
{
name: "TEST_HTML",
alias: "Texto HTML",
type: "esriFieldTypeString",
length: 150
},
{
name: "TEST_VALUE",
alias: "Unicode + valor",
type: "esriFieldTypeString",
length: 50
},
{
name: "TEST_HTML_VALUE",
alias: "Valor HTML",
type: "esriFieldTypeString",
length: 150
},
{
name: "TEST_BACKGROUND",
alias: "Background test",
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.
Limitação de contagem de feições e comportamento observado. A documentação da Esri declara um máximo de 50.000 feições quando um FeatureSet é usado para construir uma coleção de feições. Os FeatureSets virtuais construídos neste post se enquadram no tipo de fluxo de trabalho para o qual esse limite documentado é relevante. No entanto, testes adicionais no mesmo ambiente ArcGIS Online foram bem-sucedidos ao usar 50.001 e 100.000 registros gerados no widget Tabela, incluindo consultas diretas de OBJECTID 50001 e 100000. A Seção 9 documenta essa discrepância em detalhes. O comportamento observado é experimental e não deve ser tratado como uma substituição suportada para o limite documentado pela Esri.
8. Validação adicional: filtragem 1:N e transformação virtual wide-to-long
Dois testes adicionais foram realizados para verificar se o Arcade Data pode suportar um fluxo de trabalho 1:N acionado por uma seleção no mapa. Ambos os testes usaram o mesmo identificador comum de trecho na camada do mapa e na tabela ou FeatureSet virtual.
Teste 1 - Tabela física 1:N existente.Uma fonte Arcade Data foi criada a partir de uma tabela existente já organizada em formato longo, com múltiplos registros de descarga-duração para cada trecho. Uma ação do Mapa (Alterações na seleção de registro 12 Filtrar registros de dados) conectou o identificador do trecho na camada de feição ao mesmo identificador na fonte Arcade Data. Selecionar um trecho filtrou a Tabela para todos os registros correspondentes, não apenas um único registro. Isso confirma que uma fonte Arcade Data virtual pode participar em um fluxo de trabalho de filtragem 1:N.
Figura 2. Teste 1: selecionar o trecho Arno_3629 filtra a tabela Arcade Data 1:N para múltiplos registros de descarga-duração para o mesmo trecho.
Teste 2 - Transformação virtual wide-to-long.A tabela fonte foi lida em sua estrutura original wide, onde valores de descarga para diferentes durações são armazenados em campos separados. O Arcade transformou dinamicamente cada registro fonte em múltiplos registros virtuais contendo ID do Trecho, Descarga, rótulo da Duração e Duração numérica. O FeatureSet virtual 1:N resultante foi então conectado ao mesmo filtro de seleção do mapa. Selecionar o mesmo trecho retornou os múltiplos registros esperados e os valores de descarga corresponderam à tabela física em formato longo correspondente, exceto pelo arredondamento na exibição.
Figura 3. Teste 2: Arcade cria uma tabela virtual 1:N a partir de uma tabela fonte wide e o resultado é filtrado com sucesso pelo trecho selecionado.
Esses testes estendem a validação original 1:1. No ambiente testado ArcGIS Online Experience Builder, o Arcade Data conseguiu tanto expor uma estrutura 1:N existente quanto criar uma estrutura derivada 1:N dinamicamente sem modificar o serviço fonte.
Para conjuntos de dados maiores, a contagem resultante de registros virtuais deve ser considerada juntamente com o limite da coleção de feições mencionado acima.
9. Validação adicional: comportamento além do limite documentado de 50.000 feições
A documentação da Esri afirma que quando um resultado Arcade Data é usado para construir uma coleção de feições, o FeatureSet usado para construir essa coleção pode conter no máximo 50.000 feições. Como os exemplos neste post constroem um novo FeatureSet com FeatureSet(Text(output)), um teste adicional foi realizado para observar o que acontece quando esse limite documentado é excedido no ambiente atual ArcGIS Online Experience Builder.
Uma fonte sintética Arcade Data foi criada com dois campos (OBJECTID e TEST_VALUE) e sem geometria. A expressão gerou registros sequenciais na memória e os retornou com FeatureSet(Text(output)). Testes com 49.999 e 50.000 registros foram executados normalmente. A expressão foi então testada com 50.001 registros.
Com 50.001 registros, o editor Arcade ainda avaliou a expressão com sucesso. Após a adição da fonte de dados ao Experience Builder, o widget padrão Tabela reportou um total de 50.001 registros. Um filtro na Tabela usando OBJECTID = 50001 retornou o registro esperado, confirmando que o registro além do limite documentado de 50.000 não estava apenas incluído na contagem exibida, mas era diretamente consultável.
O teste foi então repetido com 100.000 registros gerados. O widget Tabela aceitou a fonte de dados, e um filtro usando OBJECTID = 100000 retornou o registro esperado e TEST_VALUE = 100000. Nesse ambiente testado, portanto, o FeatureSet virtual permaneceu utilizável pelo menos até 100.000 registros.
Essa observação não deve ser interpretada como sobrepondo o limite documentado pela Esri de 50.000 feições ou como garantia suportada para aplicações em produção. Documenta apenas o comportamento observado no ArcGIS Online Experience Builder em agosto de 2026. O comportamento efetivo pode depender dos detalhes da implementação e pode mudar com futuras atualizações do ArcGIS Online ou diferir no ArcGIS Enterprise. Aplicações devem continuar sendo projetadas considerando o limite documentado a menos que a Esri esclareça ou atualize a especificação.
Implicação prática para transformações wide-to-long. Uma transformação pode multiplicar o número de registros virtuais produzidos a partir de cada registro fonte. Os testes acima mostram que exceder 50.000 não falhou imediatamente no ambiente testado, mas esse comportamento observado não deve ser usado como motivo para projetar transformações ilimitadas no lado do cliente. Desempenho, uso de memória, recursos do navegador e compatibilidade futura também devem ser considerados.
Figura 4. Validação experimental além do limite documentado de 50.000 feições. Um FeatureSet virtual Arcade contendo 100.000 registros gerados é usado pelo widget Tabela do Experience Builder. Filtrar por OBJECTID = 100000 retorna com sucesso o registro correspondente, confirmando que o registro é diretamente consultável no ambiente ArcGIS Online testado (agosto de 2026).
O resultado mostrado na Figura 4 é um comportamento experimental observado e não deve ser interpretado como substituindo o limite documentado pela Esri de 50.000 feições.
10. Por que a técnica pode ser útil além da formatação
- Combinar atributos selecionados de múltiplas tabelas usando uma chave comum.
- Calcular campos sem modificar o serviço fonte.
- Substituir valores sentinela como -99999 por ND.
- Agregue ou resuma registros provenientes de relacionamentos 1:N.
- Criar tabelas resumo derivadas.
- Manter uma chave relacional para que o resultado reaja às seleções do mapa.
- Explorar FeatureSets derivados que incluem geometria para outros fluxos de trabalho.
Nesse sentido, Arcade Data pode atuar como uma camada leve virtual de transformação entre serviços fontes e widgets do Experience Builder.
Conclusão
Dados fonte 12 Arcade Data 12 FeatureSet Virtual 12 Campos HTML calculados 12 Tabela Experience Builder 12 Formatação visual condicional
A tabela fonte permanece intacta. As abordagens baseadas em Unicode e <span> são as opções mais conservadoras. A técnica do bloco-fundo é visualmente poderosa mas deve ser explicitamente identificada como experimental.
Agradecimentos e transparência
Este fluxo de trabalho foi desenvolvido através de uma série iterativa de experimentos usando ChatGPT (OpenAI) como assistente técnico.
O ChatGPT ajudou a explorar abordagens possíveis e gerar e refinar o código Arcade, enquanto cada comportamento descrito neste post foi testado diretamente no ArcGIS Online Experience Builder.
A validação experimental foi importante: algumas suposições iniciais - incluindo que a formatação HTML não seria renderizada pelo widget Tabela - mostraram-se incorretas quando testadas no widget real. Essas observações levaram aos testes subsequentes com valores numéricos coloridos e bloco background-color.
Ambiente de teste: ArcGIS Online Experience Builder, agosto de 2026.
Referências da documentação
022 Esri, documentação ArcGIS Experience Builder, 2 Select data22 12 Adicionar dados com Arcade; requisitos para retorno FeatureSet e limite documentado de coleção com até 50 mil feições para coleções de feições.Seção 9 relata separadamente as contagens maiores observadas experimentalmente no ambiente testado.
022 Esri, documentação ArcGIS Experience Builder, 2 Advanced formatting22 12 Conteúdo dinâmico baseado em Arcade e estilização em contextos suportados por widgets.