// ZonnaGPS · Enlace de datos para Power BI / Excel (Power Query M) // // Cómo usarlo: // Power BI Desktop: Obtener datos → Consulta en blanco → Editor avanzado → pega este texto. // Excel: Datos → Obtener datos → De otras fuentes → Consulta en blanco → Editor avanzado. // Cambia ApiKey, Dataset y las fechas. Tablas: vehicles, vehicle-daily, driver-daily, alerts, deca. // Al pedir credenciales para https://app.zonnagps.es elige «Anónimo»: la clave va en la cabecera. // Para el servicio de Power BI (actualización programada) la URL base es fija y la ruta va en // RelativePath/Query, como aquí, para que la actualización funcione sin puerta de enlace. let ApiKey = "TU_CLAVE_DE_API", BaseUrl = "https://app.zonnagps.es", Dataset = "vehicle-daily", Desde = Date.ToText(Date.AddDays(Date.From(DateTime.LocalNow()), -30), "yyyy-MM-dd"), Hasta = Date.ToText(Date.From(DateTime.LocalNow()), "yyyy-MM-dd"), PorPagina = 5000, Pagina = (n as number) => Json.Document( Web.Contents(BaseUrl, [ RelativePath = "api/public/v1/reports/" & Dataset, Query = [from = Desde, to = Hasta, page = Number.ToText(n), per_page = Number.ToText(PorPagina), format = "json"], Headers = [Authorization = "Bearer " & ApiKey, Accept = "application/json"] ]) ), Primera = Pagina(1), Columnas = Primera[meta][columns], Ultima = Primera[meta][last_page], Resto = if Ultima > 1 then List.Transform({2..Ultima}, each Pagina(_)[data]) else {}, Filas = List.Combine({Primera[data]} & Resto), Tabla = Table.FromRecords(Filas, Columnas, MissingField.UseNull), // Tipos de las columnas más habituales (las que no existan en la tabla elegida se ignoran). Tipos = { {"date", type date}, {"km", type number}, {"active_hours", type number}, {"idle_hours", type number}, {"out_of_hours_hours", type number}, {"stops", Int64.Type}, {"exceedances", Int64.Type}, {"alerts_total", Int64.Type}, {"max_speed_kph", Int64.Type}, {"fuel_used_l", type number}, {"first_move_at", type datetimezone}, {"last_move_at", type datetimezone}, {"created_at", type datetimezone}, {"service_starts_at", type datetimezone}, {"service_ends_at", type datetimezone} }, TiposPresentes = List.Select(Tipos, each List.Contains(Table.ColumnNames(Tabla), _{0})), Resultado = Table.TransformColumnTypes(Tabla, TiposPresentes, "en-US") in Resultado