Anónimo
Hola,
Somos bastante novatos y necesitamos ayuda. Estamos tratando de crear una tabla con datos provenientes de una consulta de Google Maps.
ingresamos en una función lat, long, radius y palabra clave para recibir un json con datos de ubicación.
nuestro código funciona cuando recibimos menos de 20 artículos, para más artículos es necesaria la paginación, pero no podemos continuar, ya que no tenemos experiencia en eso.
la ayuda es muy apreciada
roberto
let Source = (location as text, radius as text, category as text, optional pagetoken as text) => let VAR1 = (location, radius, category, pagetoken,mapskey) => let result = if pagetoken= null or "" then Json.Document(Web.Contents("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=" &location&"&radius="&radius&"&keyword="&category&"&key=mapskey")) else Json.Document(Web.Contents("https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=mapskey&pagetoken=pagetoken")) , pagetoken= try result[pagetoken] otherwise null, results = result[results], record = [results=results, pagetoken=pagetoken] in record, resultSet = List.Generate( () => VAR1 (location, radius, category), each _[pagetoken] <> null, each VAR1(_[pagetoken]), each [pagetoken= [pagetoken], results = [results]] ) in VAR1 (location, radius, category, pagetoken) in Source
v-shex-msft
Hola @Anónimo,
Puede consultar los siguientes enlaces para saber cómo manejar la API de descanso de paginación:
Funciones auxiliares
Cómo obtener datos paginados de la API en Power BI
Cómo hacer paginación en Power Query
Saludos,
Xiaoxin-sheng
Anónimo
En respuesta a v-shex-msft
Hola, hemos seguido sus sugerencias y miramos algunos ejemplos. Nuestro código sigue sin funcionar.
El código que escribimos es
let pippo = (location as text, radius as text, category as text, pageToken) => let source = if pageToken = null then Json.Document(Web.Contents("https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=OUR KEY&location=45.538474,10.220309&keyword=bar&radius=2500")) else Json.Document(Web.Contents("https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=OUR KEY&pageToken=pageToken")) , nextPageToken = try source[next_page_token] otherwise "pippo", results = source[results], record = [results = results , nextPageToken = nextPageToken ] in record, resultSet = List.Generate( () => pippo (location, radius, category, pageToken), each _[nextPageToken] <> null, each pippo(_[nextPageToken]), each [nextPageToken= [nextPageToken], results = [results]] ), lastPageToken = List.Last(Table.FromRecords(resultSet)[nextPageToken]), lastResultSet = pippo(lastPageToken)[results], fullResultSet = Table.Combine({Table.FromRecords(List.Combine(Table.FromRecords(resultSet)[results])), Table.FromRecords(lastResultSet)}) in fullResultSet
Podemos recopilar los 20 registros que se encuentran en la primera página, pero no podemos recuperar los elementos de las siguientes páginas (20 por página).
Básicamente nuestro problema está en las páginas posteriores a la primera, es decir en la generación del conjunto de resultados. El mensaje de error es
«Expression.Error: la ubicación de importación no coincide con las exportaciones. ¿Perdió una referencia de módulo?» – «Expresión.Error: No se reconoció el nombre ‘ubicación’. Asegúrese de que esté escrito correctamente».
BR
roberto
v-shex-msft
En respuesta a Anónimo
HOLA @Anonimo,
Creo que este problema debería estar más relacionado con su fórmula. La función pippo requiere 4 parámetros, pero solo ingresa uno en la función list.generate.
Intento modificar su fórmula para permitir que el parámetro funcione en su fórmula de consulta:
let pippo = (location as text, radius as text, category as text, pageToken) => let url=if pageToken = null then "https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=OUR KEY&location="&location&"&keyword=bar&radius=2500" else "https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=OUR KEY&pageToken="&pageToken, source =Json.Document(Web.Contents(url)), nextPageToken = try source[next_page_token] otherwise "pippo", results = source[results], record = [results = results , nextPageToken = nextPageToken ] in record, resultSet = List.Generate( () => pippo (location, radius, category, pageToken), each _[nextPageToken] <> null, each pippo(location,radius,category,_[nextPageToken]), each [nextPageToken= [nextPageToken], results = [results]] ), lastPageToken = List.Last(Table.FromRecords(resultSet)[nextPageToken]), lastResultSet = pippo(lastPageToken)[results], fullResultSet = Table.Combine({Table.FromRecords(List.Combine(Table.FromRecords(resultSet)[results])), Table.FromRecords(lastResultSet)}) in fullResultSet
Saludos,
Xiaoxin-sheng
Anónimo
En respuesta a v-shex-msft
Hola @v-shex-msft,
gracias por tus sugerencias, las hemos seguido y ahora tenemos la siguiente consulta:
let Func = (Ubicación, Radio, Palabra clave, Token) =>
deje Fuente =
si Token = nulo, entonces Json.Document(Web.Contents(«https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=OUR_KEY&location=» & Location & «&keyword=» & Keyword & » &radius=» & Number.ToText(Radius)))
else Json.Document(Web.Contents(«https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=OUR_KEY&pagetoken=» & Token)),
Resultados = probar Fuente[results] de lo contrario {},
NextPageToken = probar fuente[next_page_token] de lo contrario nulo,
artículos = [Results = Results, NextPageToken = NextPageToken]
en artículos,
ResultSet = Lista.Generar(
() => Func(«45.538474,10.220309», 1200, «barra», nulo),
cada [Results] <> {} y [NextPageToken] <> nulo,
cada Función.InvokeAfter(() => Func(null, null, null, _[NextPageToken]), #duración(0,0,0,1)),
cada [Results = [Results], FichaPáginaSiguiente = [NextPageToken]]
),
LastPageToken = List.Last(Table.FromRecords(ResultSet)[NextPageToken]),
LastResultSet = Function.InvokeAfter(() => Func(null, null, null, LastPageToken)[Results], #duración(0,0,0,1)),
FullResultSet = Table.Combine({Table.FromRecords(List.Combine(Table.FromRecords(ResultSet)[Results])), Tabla.FromRecords(LastResultSet)})
en conjunto de resultados completo
Tenemos algunos problemas:
- Nuestra consulta devuelve 40 registros (la API de Google devuelve 20 registros por página hasta un total de 60 registros), no podemos recopilar los registros en la última página;
- Si cambiamos el valor del radio, por ejemplo 1500 metros (o cualquier otro número) en lugar de 1200 metros, nuestra consulta devuelve 20 registros, ya no 40. Esto es extraño y no podemos entender por qué.
¿Puedes ayudarnos? Muchas gracias de antemano!
Saludos,
Elena @Anónimo