Reply
Syndicate_Admin
Administrator
Administrator
Syndicated - Inbound

La paginación de Hubspot no se actualiza en el servicio PBI

Source Community: Power BI | Source Author Name: DrewSmith

Gracias a @WillBatesHydro he conseguido que funcione un poco de código para paginar mis ofertas de Hubspot.
Sin embargo, cuando lo subo en el servicio PowerBI, se produce un error en la actualización ya que es dinámica.
He intentado dividirlo en una ruta relativa como he hecho con otros, pero no funciona.

¿Alguna idea?

Código, con crédito para @WillBatesHydro y otros en este hilo: https://community.fabric.microsoft.com/t5/Power-Query/Hubspot-Private-Apps-Powerquery-pagination/m-p...

dejar
baseuri = "https://api.hubapi.com/crm/v3/objects/deals?limit=100",
headers = [Headers=[#"Content-Type"="application/json", Authorization="API KEY"]],

initReq = Json.Document(Web.Contents( baseuri, headers)),
#"Convertido en tabla" = Record.ToTable(initReq),
initData = initReq[resultados],

Queremos obtener data = {lastNPagesData, thisPageData}, donde cada lista tiene el límite # de Registros,

luego podemos List.Combine() las dos listas en cada iteración para agregar todos los registros. Podemos, entonces,

Crear una tabla a partir de esos registros

gather = (datos como lista, URI) =>

dejar
Obtener un nuevo desplazamiento del URI activo
newOffset = Json.Document(Web.Contents(uri, headers))[paging][next][after],

Compile un nuevo URI con el URI original para que no se anexen offsests
newUri = baseuri & relativepath & "&after=" & newOffset,

Obtener nuevas solicitudes y datos
newReq = Json.Document(Web.Contents(newUri, encabezados)) ,
newdata = newReq[resultados] ,

Agregar esos datos a Rolling Aggregate
data = List.Combine({data, newdata}),

Si no hay una página siguiente de datos, devuélvalo. Si lo hay, vuelva a llamar a @gather para obtener más datos

check = if Table.Contains ( Record.ToTable(newReq) , [Name = "paginación"] ) = true then @gather (data , newUri) else data

en jaque,

Antes de llamar a gather(), queremos ver si es necesario. ¿La primera solicitud devuelve solo una página? Devolución.
outputList = if Table.Contains ( Record.ToTable (initReq) , [Name = "paging"] ) = true then gather( initData , baseuri ) else initData ,

A continuación, coloque los registros en una tabla. Esto expandirá todas las columnas disponibles en el registro.
expand = Table.FromRecords(outputList),
#"Eliminado Otras Columnas" = Table.SelectColumns(expand,{"id", "properties"}),
#"Personalizado expandido" = Table.ExpandRecordColumn(#"Eliminado otras columnas", "propiedades",
Record.FieldNames(#"Eliminado otras columnas"{0}[propiedades]),
Record.FieldNames(#"Eliminado otras columnas"{0}[propiedades]))
en
#"Costumbre ampliada"

13 REPLIES 13
Syndicate_Admin
Administrator
Administrator

Source Community: Power BI | Source Author Name: lbendlin
Syndicated - Inbound

Le faltan la parte Query y RelativePath de la llamada Web.Contents.

Web.Contents - PowerQuery M | Microsoft Learn

Son necesarios para evitar el error que obtiene.

Source Community: Power BI | Source Author Name: DrewSmith
Syndicated - Inbound

Gracias. He usado RelativePath antes en otras llamadas a la API, pero ahí era donde sabíamos los números de página a los que se llamaba.

He modificado el código original de la siguiente manera, pero cualquier idea de qué probar a continuación es bienvenida:

dejar
headers = [Headers=[#"Content-Type"="application/json", Authorization="API Key"]],
initData = Json.Document(Web.Contents(baseuri, headers))[results],
gather = (datos como lista, URI como texto, relativepath como texto) =>
dejar
newOffset = Json.Document(Web.Contents(uri, headers))[paging][next][after],
newUri = baseuri & relativepath & "&after=" & newOffset,
newReq = Json.Document(Web.Contents(newUri, encabezados)),
newdata = newReq[resultados],
allData = List.Combine({data, newdata}),
check = if Table.Contains(Record.ToTable(newReq), [Name = "paging"]) then @gather(allData, newUri, relativepath) else allData
en
comprobar
outputList = if Table.Contains(Record.ToTable(Json.Document(Web.Contents(baseuri, headers))), [Name = "pagining"]) then gather(initData, baseuri, "") else initData,
expand = Table.FromRecords(outputList),
#"Personalizado expandido" = Table.ExpandRecordColumn(expandir, "propiedades", Record.FieldNames(expandir{0}[propiedades]), Record.FieldNames(expandir{0}[propiedades])),
#"Ordenado Filas" = Table.Sort(#"Personalizado Expandido",{{"FechaCierre", Order.Descending}})
en
#"Filas ordenadas"

Source Community: Power BI | Source Author Name: lbendlin
Syndicated - Inbound

Por favor, lea la documentación de nuevo. El "limit=100" también debe ir en el parámetro Query.

Source Community: Power BI | Source Author Name: DrewSmith
Syndicated - Inbound

Lamentablemente, no estoy consiguiendo que esto funcione. Supuse que no sería demasiado difícil, pero el servicio simplemente no es refrescante.

Cualquier consejo es bienvenido, ya que estoy dando vueltas en círculos aquí.

Source Community: Power BI | Source Author Name: lbendlin
Syndicated - Inbound

Muestre su código actual (desinfectado).


Como probablemente pueda apreciar, es casi imposible ayudar con las consultas de la API sin acceso a dicha API (que es posible que no esté dispuesto a proporcionar por razones comprensibles)

Source Community: Power BI | Source Author Name: DrewSmith
Syndicated - Inbound

Gracias @lbendlin, sí, no puedo dar la clave API, pero el último código de trabajo está a continuación. Necesito crear una ruta relativa para "?limit=100" y lo he hecho con éxito para otras llamadas a la API, donde conozco los números de página y las funciones listas creadas y generas, etc., pero no puedo ver cómo hacerlo en esto cuando está usando parámetros de desplazamiento

dejar
headers = [Headers=[#"Content-Type"="application/json", Authorization="API Key"]],
initData = Json.Document(Web.Contents(baseuri, headers))[results],
gather = (datos como lista, URI como texto, relativepath como texto) =>
dejar
newOffset = Json.Document(Web.Contents(uri, headers))[paging][next][after],
newUri = baseuri & relativepath & "&after=" & newOffset,
newReq = Json.Document(Web.Contents(newUri, encabezados)),
newdata = newReq[resultados],
allData = List.Combine({data, newdata}),
check = if Table.Contains(Record.ToTable(newReq), [Name = "paging"]) then @gather(allData, newUri, relativepath) else allData
en
comprobar
outputList = if Table.Contains(Record.ToTable(Json.Document(Web.Contents(baseuri, headers))), [Name = "pagining"]) then gather(initData, baseuri, "") else initData,
expand = Table.FromRecords(outputList),
#"Personalizado expandido" = Table.ExpandRecordColumn(expandir, "propiedades", Record.FieldNames(expandir{0}[propiedades]), Record.FieldNames(expandir{0}[propiedades])),
#"Ordenado Filas" = Table.Sort(#"Personalizado Expandido",{{"FechaCierre", Order.Descending}})
en
#"Filas ordenadas"

Source Community: Power BI | Source Author Name: lbendlin
Syndicated - Inbound
I need to create a relative path for "?limit=100"

No, esto debe ir a la sección Consulta, no a la sección RelativePath.

Source Community: Power BI | Source Author Name: DrewSmith
Syndicated - Inbound

Así que ahora tengo el beloe, pero obtengo el mismo error en el servicio que antes (nopuedo programar la actualización para este modelo semántico porque las siguientes fuentes de datos actualmente no admiten la actualización):

dejar
baseuri = "https://api.hubapi.com/crm/v3/objects/deals",
consulta = "?limit=100",
fullUri = baseuri & consulta,
headers = [#"Content-Type" = "application/json", #"Authorization" = "API KEY"],
initData = Json.Document(Web.Contents(fullUri, [Headers = headers]))[results],

gather = (datos como lista, URI como texto, relativepath como texto, encabezados como registro) =>
dejar
newOffset = Json.Document(Web.Contents(uri, [Headers = headers]))[paginación][next][after],
newUri = baseuri & "?" & relativepath & "&after=" & newOffset,
newReq = Json.Document(Web.Contents(newUri,[Headers = headers])),
newdata = newReq[resultados],
allData = List.Combine({data, newdata}),
check = if Table.Contains(Record.ToTable(newReq), [Name = "paging"]) then @gather(allData, newUri, relativepath, headers) else allData
en
comprobar

outputList = if Table.Contains(Record.ToTable(Json.Document(Web.Contents(fullUri, [Headers = headers]))), [Name = "paging"]) then gather(initData, fullUri, "", headers) else initData,
expand = Table.FromRecords(outputList),
#"Personalizado expandido" = Table.ExpandRecordColumn(expandir, "propiedades", Record.FieldNames(expandir{0}[propiedades]), Record.FieldNames(expandir{0}[propiedades])),
#"Ordenado Filas" = Table.Sort(#"Personalizado Expandido",{{"FechaCierre", Order.Descending}})
en
#"Filas ordenadas"

Source Community: Power BI | Source Author Name: lbendlin
Syndicated - Inbound

Por favor, lea la documentación de nuevo. El "limit=100" debe ir en el parámetro Query, con la sintaxis correcta.

Source Community: Power BI | Source Author Name: DrewSmith
Syndicated - Inbound

Lo he leído, muchas veces, y he intentado cambiar las cosas. La última iteración a continuación. Se carga correctamente en el escritorio, pero no se actualiza en el servicio. ¿Alguna idea de qué está causando que esto no se actualice?
Cualquier consejo es bienvenido.



dejar
baseuri = "https://api.hubapi.com/crm/v3/objects/deals",
consulta = "?limit=100",
headers = [#"Content-Type" = "application/json", #"Authorization" = "API Key"],
initData = Json.Document(Web.Contents(baseuri, [Headers = headers & [#"query" = consulta]]))[results],

gather = (datos como lista, URI como texto, relativepath como texto, encabezados como registro) =>
dejar
newOffset = Json.Document(Web.Contents(uri, [Headers = headers & [#"query" = query]]))[paging][next][after],
newUri = baseuri & "?" & relativepath & "&after=" & newOffset,
newReq = Json.Document(Web.Contents(newUri,[Headers = headers & [#"query" = consulta]])),
newdata = newReq[resultados],
allData = List.Combine({data, newdata}),
check = if Table.Contains(Record.ToTable(newReq), [Name = "paging"]) then @gather(allData, newUri, relativepath, headers) else allData
en
comprobar

outputList = if Table.Contains(Record.ToTable(Json.Document(Web.Contents(baseuri, [Headers = headers & [#"query" = query]]))), [Name = "paging"]) then gather(initData, baseuri, "", headers) else initData,
expand = Table.FromRecords(outputList),
#"Personalizado expandido" = Table.ExpandRecordColumn(expandir, "propiedades", Record.FieldNames(expandir{0}[propiedades]), Record.FieldNames(expandir{0}[propiedades])),
#"Ordenado Filas" = Table.Sort(#"Personalizado Expandido",{{"FechaCierre", Order.Descending}})
en
#"Filas ordenadas"

Source Community: Power BI | Source Author Name: lbendlin
Syndicated - Inbound consulta = [límite = 100]

Source Community: Power BI | Source Author Name: DrewSmith
Syndicated - Inbound

Ah, ya veo. Gracias.

Subí al Servicio y todavía no hay alegría. Eliminó toda la consulta a lo largo del script y aún no se actualiza, por lo que debe ser otra cosa. 😞

Source Community: Power BI | Source Author Name: CoderZen08
Syndicated - Inbound

Hola @DrewSmith Como solución alternativa, tal vez pueda usar un conector de terceros, puede ahorrarle mucho tiempo en comparación con las otras opciones. He probado windsor.ai, supermetría y funnel.io. Me quedé con windsor porque es mucho más barato, así que solo para que conozcas otras opciones. En caso de que te lo preguntes, para realizar la conexión primero busca el conector de Hubspot en la lista de fuentes de datos:

HUBSPOT-1.png

Después de eso, simplemente otorgue acceso a su cuenta de Hubspot usando sus credenciales, luego, en la página de vista previa y destino , verá una vista previa de sus campos de Hubspot:

HUBSPOT-2.png

Allí sólo tienes que seleccionar los campos que necesitas. Finalmente, simplemente seleccione PBI como destino de sus datos y finalmente copie y pegue la url en PBI --> Obtener datos --> Web --> Pegar la url.

SELECT_DESTINATION_NEW.png

avatar user

Helpful resources

Announcements
Las Vegas 2025

Join us at the Microsoft Fabric Community Conference

March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount!

FebPBI_Carousel

Power BI Monthly Update - February 2025

Check out the February 2025 Power BI update to learn about new features.

Feb2025 NL Carousel

Fabric Community Update - February 2025

Find out what's new and trending in the Fabric community.

Top Solution Authors (Last Month)
Top Kudoed Authors (Last Month)