TL;DR: Cuando una columna contiene una lista de registros y necesitas un campo de cada uno concatenado en texto, usa List.Transform([Columna], each [campo]) para sacar el valor de cada registro y Text.Combine(..., ", ") para unirlos. Para evitar el error con listas vacías o nulas, envuelve la lista con [Columna] ?? {} antes de transformar.
Las APIs y los archivos JSON adoran las estructuras anidadas. Al cargarlos en Power Query, es habitual terminar con una columna donde cada celda no es un valor, sino una lista que contiene varios registros, y dentro de cada registro un puñado de campos. Sacar uno de esos campos de todos los registros y combinarlos en una sola cadena parece que debería ser trivial; en la práctica, atasca a tanta gente que el hilo de referencia roza las 85.000 vistas.
El error clásico aparece cuando alguna fila tiene la lista vacía o nula: Expression.Error: We cannot convert the value null to type Record. Vamos a resolver el caso completo, incluyendo ese borde.
¿Qué es una lista de registros en Power Query?
En el Lenguaje M conviven varios tipos estructurados:
- Un valor es un dato simple (
"VIP",42, una fecha). - Un registro (record) es un conjunto de pares campo-valor:
[name = "VIP", id = 1]. - Una lista (list) es una secuencia ordenada:
{1, 2, 3}.
Una lista de registros es una lista cuyos elementos son registros: {[name="VIP"], [name="Gold"]}. Es exactamente lo que produce expandir un JSON anidado sin aplanar.
¿Por qué falla extraer solo el primer registro?
El intento natural es indexar el primer elemento y leer su campo:
Record.Field([types]{0}, "name")
Esto funciona… hasta que una fila tiene cero registros o un null. Indexar {0} sobre una lista vacía revienta, y Record.Field sobre null lanza el error de conversión. Además, solo recupera el primero: si hay tres registros, pierdes dos. Necesitamos recorrer todos los registros de la lista y tolerar las vacías.
¿Cuándo aparece este patrón?
- APIs: un cliente con varias etiquetas, un producto con varias categorías.
- JSON anidado: pedidos con líneas de detalle, contactos con varios teléfonos.
- Archivos de configuración: elementos con listas de atributos heterogéneas.
¿Cómo se hace paso a paso?
Paso 1: extraer el campo de cada registro con List.Transform
List.Transform aplica una función a cada elemento de la lista. Aquí, a cada registro le pedimos su campo name:
List.Transform([types], each [name])
El resultado por fila es una lista de textos: {"VIP", "Gold", "Premium"}. Ya no perdemos registros: están todos.
Paso 2: concatenar en una sola cadena
Text.Combine une una lista de textos con el separador que elijas:
Text.Combine(
List.Transform([types], each [name]),
", "
)
Para la fila del ejemplo, devuelve "VIP, Gold, Premium".
Paso 3: blindar contra listas vacías y nulas
Aquí está la pieza que falta en casi todas las respuestas a medias. Si [types] es null, List.Transform falla. El operador de coalescencia ?? sustituye el nulo por una lista vacía, y una lista vacía produce simplemente una cadena vacía sin error:
Text.Combine(
List.Transform([types] ?? {}, each [name]),
", "
)
Con esto, las filas sin registros devuelven "" en lugar de romper toda la consulta.
Paso 4: añadirlo como columna personalizada
El paso completo, listo para pegar en Agregar columna personalizada:
Table.AddColumn(
Origen,
"ClientTypes",
each Text.Combine(
List.Transform([types] ?? {}, each [name]),
", "
),
type text
)
Declarar type text al final evita que Power Query deje la columna como tipo any, lo que mejora el rendimiento y el folding.
Variante: campos que a veces no existen
Si algún registro puede no tener el campo name, usa Record.FieldOrDefault para devolver un valor por defecto en lugar de fallar:
each Text.Combine(
List.Transform([types] ?? {}, each Record.FieldOrDefault(_, "name", "")),
", "
)
El _ representa el registro actual dentro de List.Transform.
Errores comunes
| Síntoma | Causa | Solución |
|---|---|---|
cannot convert null to type Record |
La fila tiene la lista nula | Usar [Columna] ?? {} |
| Solo aparece el primer valor | Se indexó {0} en lugar de recorrer |
Usar List.Transform sobre toda la lista |
Field not found |
Algún registro no tiene el campo | Usar Record.FieldOrDefault |
Columna queda como any |
No se declaró el tipo | Añadir type text en Table.AddColumn |
Conclusión
Aplanar una lista de registros se reduce a dos funciones — List.Transform para extraer y Text.Combine para unir — más un ?? {} que evita el error más frecuente. Es un patrón que reaparece cada vez que trabajas con JSON o APIs, así que vale la pena tenerlo memorizado.
Si trabajas con datos anidados, listas y registros de forma habitual, este curso de Lenguaje M aplicado lo cubre con casos reales:

Power Query: Lenguaje M aplicado a casos prácticos Office365 Excel
Fuente: hilo del foro oficial de Microsoft Fabric con más de 85.000 vistas, solución verificada por la comunidad.

Deja una respuesta