Optimización de Power Query para consultas masivas a API REST

Interesante caso de optimización en Power Query. Randolfo, desde Guatemala, necesitaba consultar el estado de más de 100 envíos de paquetería a través de la API REST de Cargo Expreso, y su función tardaba demasiado.

La función original usaba un patrón común pero ineficiente para este volumen: en cada iteración, convertía el JSON de respuesta con Record.ToTable + Table.Transpose, promovía encabezados y aplicaba tipos a todas las columnas. Con 100+ guías, el rendimiento se resentía notablemente.

La función original:

``
let
fxCargoExpresoEstado = (guia as text) =>
let
Td = Number.ToText(Number.From(DateTime.LocalNow()));
Url = Json.Document(Web.Contents(
"https://tracking.caexlogistics.com/TrackingMov/api/Tracking/Get?guia=" & guia & "&_=" & Td));
tracking = Url[tracking];
datosGuia = tracking[datosGuia];
#"Convertido en tabla" = Record.ToTable(datosGuia);
#"Tabla transpuesta" = Table.Transpose(#"Convertido en tabla");
#"Encabezados promovidos" = Table.PromoteHeaders(#"Tabla transpuesta");
#"Tipo cambiado" = Table.TransformColumnTypes(#"Encabezados promovidos"; ...);
#"Columnas quitadas" = Table.RemoveColumns(#"Tipo cambiado"; ...)
in
#"Columnas quitadas"
in
fxCargoExpresoEstado
`

Nacho propuso varias mejoras clave:

- Sacar el Table.TransformColumnTypes fuera de la función — aplicar tipos solo una vez al resultado final, no en cada iteración
- Evitar el combo Record.ToTable + Table.Transpose dentro del bucle — usar Table.FromRecords fuera de la función para consolidar
- Seleccionar solo los campos necesarios directamente desde el Record, en vez de traer todo y quitar columnas después

Gerson reescribió la consulta completa aplicando estas ideas y añadiendo mejoras adicionales:

- Web.Contents con parámetro Query separado (mejor para el motor de privacidad de PQ)
- try ... otherwise null en cada paso para evitar que un error en una guía rompa toda la consulta
- Table.Combine en vez de Table.ExpandTableColumn para consolidar los resultados
- Tipo de retorno explícito (as table`) en la función

El resultado: una consulta más rápida, robusta y mantenible. De 38 a 24 segundos en las pruebas, que si actualizas varias veces al día, se nota.

El ZIP incluye ambos archivos: el original de Randolfo y la versión optimizada de Gerson para comparar.

Más contenido de Excel en InflueXcel