shirleympearls
Hola a todos,
Necesito urgentemente conectar JIRA con Power BI. Revisé un documento que se ha compartido en Internet, pero no me ayudó mucho. Para empezar, esta es la URL que uso cuando PBI me pide que ingrese la URL para JIRA.
https://jira.rd.abcpharma.net/secure/RapidBoard.jspa?rapidView=5048&projectKey=SSCL
Este es el enlace al tablero Kanban que está en JIRA y me gustaría traerlo a Power BI. ¡Cualquier ayuda sería muy apreciada! 🙂
AIT 🙂
Eric_Zhang
@shirleympearls escribió:
Hola a todos,
Necesito urgentemente conectar JIRA con Power BI. Revisé un documento que se ha compartido en Internet, pero no me ayudó mucho. Para empezar, esta es la URL que uso cuando PBI me pide que ingrese la URL para JIRA.
https://jira.rd.abcpharma.net/secure/RapidBoard.jspa?rapidView=5048&projectKey=SSCL
Este es el enlace al tablero Kanban que está en JIRA y me gustaría traerlo a Power BI. ¡Cualquier ayuda sería muy apreciada! 🙂
AIT 🙂
@shirleympearls
Al conectarse a JIRA, la URL requerida es como «https://xxxxxx.atlassian.net», al hacer clic en siguiente, llama a la API «https://xxxxxx.atlassian.net/rest/api/2/buscar».
Hablando de manera simple, en este momento, Power BI ahora solo puede obtener los datos que devuelve la API «https://xxxxxx.atlassian.net/rest/api/2/search», en cuanto a su enlace a otras API REST de JIRA, puede hacerlo llamando a la API REST en el escritorio de Power BI, esto requeriría una API REST y habilidades de programación. Compruebe cómo llamar a API similares en una demostración Obtener datos de la API de Twitter con Power Query.
También puede enviar su idea a Power BI Ideas y votarla.
Anónimo
este hilo y código fue un salvador, y un poco más de trabajo hizo que funcionara por completo
otros elementos que me permitieron completar el proceso:
– la clave de autenticación debe ser jirausername@domain.com:JIRA_API_KEY
– cambiar el último bit del código anterior para eliminar data1 = data{0} permitió recuperar todos los datos.
– la conversión a tabla y la expansión de los campos dieron como resultado todos los datos.
Luego eliminé todos los campos que no necesitaba y expandí algunos a datos.
el siguiente código tiene una clave de autenticación falsa
let Source = Json.Document(Web.Contents("https://siteid.atlassian.net/rest/api/2/search?jql:project=RPSD&maxResults=300", [Headers=[ContentType="application/json", Authorization="Basic cGF1bC5234sdfsdf2345dfgc2dRV0tiQzM4Qg=="]])), #"Converted to Table" = Record.ToTable(Source), #"Transposed Table" = Table.Transpose(#"Converted to Table"), #"Promoted Headers" = Table.PromoteHeaders(#"Transposed Table", [PromoteAllScalars=true]), #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"expand", type text}, {"startAt", Int64.Type}, {"maxResults", Int64.Type}, {"total", Int64.Type}, {"issues", type any}}), #"Removed Other Columns" = Table.SelectColumns(#"Changed Type",{"total"}), #"total" = #"Removed Other Columns"{0}[total], #"startAt List" = List.Generate(()=>0, each _ < #"total", each _ +100), #"Converted to Table1" = Table.FromList(#"startAt List", Splitter.SplitByNothing(), null, null, ExtraValues.Error), #"Renamed Columns" = Table.RenameColumns(#"Converted to Table1",{{"Column1", "startAt"}}), #"Added Custom" = Table.AddColumn(#"Renamed Columns", "URL", each "https://siteid.atlassian.net/rest/api/2/search?jql:project=RPSD&maxResults=100&startAt=" & Text.From([startAt])), data = List.Transform(#"Added Custom"[URL], each Json.Document(Web.Contents(_, [Headers=[ContentType="application/json", Authorization="Basic cGF1bC5234sdfsdf2345dfgc2dRV0tiQzM4Qg=="]]))), #"Converted to Table2" = Table.FromList(data, Splitter.SplitByNothing(), null, null, ExtraValues.Error), Column1 = #"Converted to Table2"[Column1], #"Converted to Table3" = Table.FromList(Column1, Splitter.SplitByNothing(), null, null, ExtraValues.Error), #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table3", "Column1", {"expand", "startAt", "maxResults", "total", "issues"}, {"expand", "startAt", "maxResults", "total", "issues"}), #"Expanded issues" = Table.ExpandListColumn(#"Expanded Column1", "issues"), #"Expanded issues1" = Table.ExpandRecordColumn(#"Expanded issues", "issues", {"expand", "id", "self", "key", "fields"}, {"expand.1", "id", "self", "key", "fields"}), #"Expanded fields" = Table.ExpandRecordColumn(#"Expanded issues1", "fields", {"statuscategorychangedate", "issuetype", "timespent", "project", "customfield_11000", "customfield_13465", "fixVersions", "customfield_13464", "customfield_11200", "aggregatetimespent", "customfield_13467", "customfield_13466", "resolution", "customfield_13468", "customfield_12800", "customfield_10501", "customfield_10504", "resolutiondate", "workratio", "watches", "lastViewed", "created", "customfield_13410", "priority", "customfield_10100", "customfield_13412", "customfield_10101", "customfield_13411", "customfield_10102", "customfield_13458", "customfield_10025", "customfield_13457", "labels", "customfield_11303", "customfield_13407", "customfield_11306", "customfield_13406", "aggregatetimeoriginalestimate", "timeestimate", "versions", "issuelinks", "assignee", "updated", "status", "components", "timeoriginalestimate", "customfield_13441", "customfield_13440", "description", "customfield_13443", "customfield_10010", "customfield_13442", "customfield_10011", "customfield_11100", "customfield_13401", "customfield_13400", "customfield_11500", "customfield_13402", "customfield_10006", "customfield_10600", "customfield_12901", "customfield_10007", "security", "customfield_10601", "customfield_12900", "customfield_10008", "customfield_12903", "aggregatetimeestimate", "customfield_10009", "customfield_12902", "customfield_12905", "customfield_12904", "summary", "creator", "subtasks", "customfield_13474", "reporter", "customfield_10000", "customfield_13475", "aggregateprogress", "customfield_10001", "customfield_10002", "environment", "duedate", "progress", "votes"}, {"statuscategorychangedate", "issuetype", "timespent", "project", "customfield_11000", "customfield_13465", "fixVersions", "customfield_13464", "customfield_11200", "aggregatetimespent", "customfield_13467", "customfield_13466", "resolution", "customfield_13468", "customfield_12800", "customfield_10501", "customfield_10504", "resolutiondate", "workratio", "watches", "lastViewed", "created", "customfield_13410", "priority", "customfield_10100", "customfield_13412", "customfield_10101", "customfield_13411", "customfield_10102", "customfield_13458", "customfield_10025", "customfield_13457", "labels", "customfield_11303", "customfield_13407", "customfield_11306", "customfield_13406", "aggregatetimeoriginalestimate", "timeestimate", "versions", "issuelinks", "assignee", "updated", "status", "components", "timeoriginalestimate", "customfield_13441", "customfield_13440", "description", "customfield_13443", "customfield_10010", "customfield_13442", "customfield_10011", "customfield_11100", "customfield_13401", "customfield_13400", "customfield_11500", "customfield_13402", "customfield_10006", "customfield_10600", "customfield_12901", "customfield_10007", "security", "customfield_10601", "customfield_12900", "customfield_10008", "customfield_12903", "aggregatetimeestimate", "customfield_10009", "customfield_12902", "customfield_12905", "customfield_12904", "summary", "creator", "subtasks", "customfield_13474", "reporter", "customfield_10000", "customfield_13475", "aggregateprogress", "customfield_10001", "customfield_10002", "environment", "duedate", "progress", "votes"}), #"Expanded issuetype" = Table.ExpandRecordColumn(#"Expanded fields", "issuetype", {"name"}, {"issuetype.name"}), #"Removed Columns" = Table.RemoveColumns(#"Expanded issuetype",{"expand", "startAt", "maxResults", "total", "expand.1"}), #"Expanded project1" = Table.ExpandRecordColumn(#"Removed Columns", "project", {"name"}, {"project.name"}), #"Renamed Columns1" = Table.RenameColumns(#"Expanded project1",{{"customfield_13465", "Platform Component"}}), #"Renamed Columns2" = Table.RenameColumns(#"Renamed Columns1",{{"customfield_13464", "Client Organisation"}}), #"Expanded Client Organisation" = Table.ExpandRecordColumn(#"Renamed Columns2", "Client Organisation", {"value"}, {"Client Organisation.value"}), #"Renamed Columns3" = Table.RenameColumns(#"Expanded Client Organisation",{{"customfield_13467", "Client Reference"}}), #"Expanded resolution" = Table.ExpandRecordColumn(#"Renamed Columns3", "resolution", {"name"}, {"resolution.name"}), #"Renamed Columns4" = Table.RenameColumns(#"Expanded resolution",{{"customfield_12800", "VSTS ID"}}), #"Renamed Columns5" = Table.RenameColumns(#"Renamed Columns4",{{"customfield_13410", "Cab Approvers"}}), #"Expanded priority" = Table.ExpandRecordColumn(#"Renamed Columns5", "priority", {"name", "id"}, {"priority.name", "priority.id"}), #"Renamed Columns6" = Table.RenameColumns(#"Expanded priority",{{"customfield_13411", "Time to Close"}, {"customfield_10102", "Time to Respond"}}), #"Renamed Columns7" = Table.RenameColumns(#"Renamed Columns6",{{"customfield_13458", "Time to Investigate"}}), #"Renamed Columns8" = Table.RenameColumns(#"Renamed Columns7",{{"customfield_10025", "Time To Resolve"}}), #"Expanded Time To Resolve" = Table.ExpandRecordColumn(#"Renamed Columns8", "Time To Resolve", {"completedCycles"}, {"Time To Resolve.completedCycles"}), #"Expanded customfield_13457" = Table.ExpandRecordColumn(#"Expanded Time To Resolve", "customfield_13457", {"value"}, {"value"}), #"Renamed Columns9" = Table.RenameColumns(#"Expanded customfield_13457",{{"value", "Environment"}}), #"Expanded assignee" = Table.ExpandRecordColumn(#"Renamed Columns9", "assignee", {"displayName"}, {"assignee.displayName"}), #"Expanded status" = Table.ExpandRecordColumn(#"Expanded assignee", "status", {"name"}, {"status.name"}), #"Renamed Columns10" = Table.RenameColumns(#"Expanded status",{{"customfield_13401", "Urgency"}}), #"Renamed Columns11" = Table.RenameColumns(#"Renamed Columns10",{{"customfield_12901", "Change Type"}}), #"Renamed Columns12" = Table.RenameColumns(#"Renamed Columns11",{{"customfield_12900", "Impact"}}), #"Expanded customfield_10008" = Table.ExpandRecordColumn(#"Renamed Columns12", "customfield_10008", {"requestType"}, {"customfield_10008.requestType"}), #"Renamed Columns13" = Table.RenameColumns(#"Expanded customfield_10008",{{"customfield_10008.requestType", "Customer requestType"}}), #"Expanded Customer requestType" = Table.ExpandRecordColumn(#"Renamed Columns13", "Customer requestType", {"name"}, {"Customer requestType.name"}), #"Renamed Columns14" = Table.RenameColumns(#"Expanded Customer requestType",{{"customfield_12903", "Change Reason"}}), #"Renamed Columns15" = Table.RenameColumns(#"Renamed Columns14",{{"customfield_12902", "Change Risk"}, {"customfield_12905", "Change Complete Date"}}), #"Renamed Columns16" = Table.RenameColumns(#"Renamed Columns15",{{"customfield_12904", "Change Start date"}}), #"Expanded creator" = Table.ExpandRecordColumn(#"Renamed Columns16", "creator", {"displayName"}, {"creator.displayName"}), #"Renamed Columns17" = Table.RenameColumns(#"Expanded creator",{{"customfield_13474", "Domain Of Reporter"}}), #"Expanded reporter" = Table.ExpandRecordColumn(#"Renamed Columns17", "reporter", {"emailAddress"}, {"reporter.emailAddress"}), #"Renamed Columns18" = Table.RenameColumns(#"Expanded reporter",{{"customfield_10000", "Date of First Response"}}), #"Renamed Columns19" = Table.RenameColumns(#"Renamed Columns18",{{"customfield_13475", "VSTS Status"}}), #"Removed Columns1" = Table.RemoveColumns(#"Renamed Columns19",{"customfield_11000", "customfield_11200", "customfield_13466", "customfield_13468", "customfield_10501", "customfield_10504", "customfield_10100", "customfield_13412", "customfield_10101", "customfield_11303", "customfield_13407", "customfield_11306", "customfield_13406", "aggregatetimeoriginalestimate", "timeestimate", "versions", "timeoriginalestimate", "customfield_13441", "customfield_13440", "customfield_13443", "customfield_10010", "customfield_13442", "customfield_10011", "customfield_11100", "customfield_13400", "customfield_11500", "customfield_13402", "customfield_10006", "customfield_10600", "customfield_10007", "customfield_10601", "customfield_10009", "aggregateprogress", "customfield_10001", "customfield_10002", "progress", "votes", "fixVersions", "watches", "Time to Investigate", "Time To Resolve.completedCycles", "issuelinks", "labels", "components", "subtasks"}) in #"Removed Columns1"
govindaraj_sv
En respuesta a Anónimo
Hola,
@Anónimo Gracias por compartir esto, cuando intenté usar su código básicamente simplemente actualizando la URL de JIRA de mi necesidad.
Tuve el siguiente error :
Expression.Error: el encabezado ‘ContentType’ solo se admite cuando se conecta de forma anónima. Estos encabezados se pueden usar con todos los tipos de autenticación: Aceptar, Aceptar juego de caracteres, Aceptar codificación, Aceptar idioma, Control de caché, Tipo de contenido, Si se modifica desde, Preferir, Rango, Recomendador
Entonces, ¿puede dar más detalles sobre los detalles de autenticación, ya que soy muy nuevo en esto, sobre cómo se debe proporcionar la autenticación de JIRA?
govindaraj_sv
En respuesta a govindaraj_sv
Hola,
@Anónimo, obtuve mi requisito usando la experiencia compartida en este enlace: https://community.atlassian.com/t5/Jira-questions/PowerBI-content-pack-only-pulling-50-rows-from-API/qaq -p/888050 .
Entonces mi consulta abierta anterior puede ser ignorada.
Gracias,
Govind
Tiago Machado
Hola,
@Eric_Zhanges correcto: para obtener datos específicos de JIRA, debemos usar la API REST de JIRA.
La idea de esta respuesta es brindar una solución más paso a paso para aquellos que no están tan familiarizados con M, JIRA REST API o ambos.
Aquí voy a detallar cómo pude recuperar datos de JIRA. Este fue mi primer contacto con PowerBI y funcionó, pero no estoy contento con el rendimiento. Si alguien tiene alguna sugerencia sobre mejoras, ¡házmelo saber! ! (Gracias por adelantado)
¡Ya basta de introducción, pongamos manos a la obra! Entonces debemos comenzar a hacer clic en «Editar consultas» para poder editar las consultas internas. Más adelante tendrá más sentido por qué lo estamos haciendo (en lugar de hacer clic en Obtener datos -> Web)
Ahora debemos:
- Crear una nueva consulta en blanco (Nueva fuente -> Consulta en blanco)
- Abra el Editor avanzado (haga clic derecho en su nueva consulta -> Editor avanzado)
Ahora, para aquellos que no están familiarizados con M, simplemente haremos una consulta web y analizaremos los resultados en formato JSON:
let Source = Json.Document(Web.Contents("https://xxxxxx.atlassian.net/rest/api/2/search?jql=assignee=currentUser()")), in Source
Esta consulta devolverá todos los elementos asignados al usuario actual. Recuerde reemplazar «xxxxxx.atlassian.net» con su dominio específico.
Una mejora que hice aquí es agregar un parámetro llamado «Consulta» para que sea más fácil personalizar los datos que quiero de JIRA.
Y eso es. Power BI requerirá su nombre de usuario y contraseña de JIRA, consultará su JIRA y presentará sus datos.
No…. Desafortunadamente, no es tan fácil…
Es cierto que algunos se presentarán datos, pero no necesariamente todo datos.
Permítanme explicar, para aquellos que no están familiarizados con JIRA REST, el resultado JSON tendrá 3 parámetros importantes:
- total – El número total de registros de su consulta
- maxResultados – El número máximo de registros de este página
- Empieza en – El primer elemento mostrado en este página
Entonces, si el total es menor o igual que maxResults, se presentan todos sus datos. Pero, si su consulta contiene más registros que maxResults, necesitamos consultar JIRA un par de veces más para obtener todo.
Observación: maxResults no puede ser mayor que 100 en este momento
Entonces, vamos a preparar todas las URL, consultarlas en JIRA y devolver una sola tabla con todos los datos. Para hacerlo:
let // The same query as before Source = Json.Document(Web.Contents("https://xxxxxx.atlassian.net/rest/api/2/search?jql=assignee=currentUser())), // Converting data from List to Table, so #"Converted to Table" = Record.ToTable(Source), // we will be able to transpose it #"Transposed Table" = Table.Transpose(#"Converted to Table"), // and make the field names the column headers #"Promoted Headers" = Table.PromoteHeaders(#"Transposed Table", [PromoteAllScalars=true]), // Now we are going to assign the correct data types for each column #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"expand", type text}, {"startAt", Int64.Type}, {"maxResults", Int64.Type}, {"total", Int64.Type}, {"issues", type any}}), // And keep only the total column #"Removed Other Columns" = Table.SelectColumns(#"Changed Type",{"total"}), // Now we are going to get the first (and only) record and assign it to a variable named #"total" #"total" = #"Removed Other Columns"{0}[total], // Now it is time to build a list of startAt values, starting on 0, incrementing 100 per item #"startAt List" = List.Generate(()=>0, each _ < #"total", each _ +100), // Converting the startAt list into Table - not sure if this is really necessary #"Converted to Table1" = Table.FromList(#"startAt List", Splitter.SplitByNothing(), null, null, ExtraValues.Error), // and renaming its single column #"Renamed Columns" = Table.RenameColumns(#"Converted to Table1",{{"Column1", "startAt"}}), // Now let's create a new column URL with the URL we are interested at. Note the maxResults and startAt parameters this time #"Added Custom" = Table.AddColumn(#"Renamed Columns", "URL", each "https://xxxxxx.atlassian.net/rest/api/2/search?maxResults=100&jql=assignee=currentUser()&startAt=" & Text.From([startAt])), // And finally retrieve them all data = List.Transform(#"Added Custom"[URL], each Json.Document(Web.Contents(_))) in data
Ahora, no importa cuántos resultados tenga en su consulta, se recuperarán todos los datos. Más tarde, deberá expandir el campo de problemas para poder trabajar con sus datos, pero esto deberá hacerse de acuerdo con sus necesidades/consulta/instancia de JIRA.
Como dije antes, esta solución recupera todos los datos de JIRA, pero no estoy satisfecho con su rendimiento. Las pocas mejoras que hice fueron en la primera consulta, donde vamos a obtener el valor total, donde filtro los campos (campos = id) ya que no estoy interesado en los datos del problema en este momento, y obtener solo un registro (maxResultados=1).
Espero que esto ayude a cualquiera que esté comenzando con PowerBI y/o JIRA…
Si le gustó esta respuesta o si tiene alguna sugerencia para mejorar el rendimiento, deje una respuesta.
Saludos,
Tiago.
Anónimo
En respuesta a Tiago Machado
¡Gracias por finalmente encontrar una manera de hacer esto!
Un problema que tengo es nuestra URL de JIRA: https://enterprise-jira.xxxx.com
No estoy seguro de cómo se traduce eso, ya que todos los datos que veo dicen xxxx.atlassian.com
¡Gracias por adelantado!
ACTUALIZACIÓN: ¡Pude hacerlo funcionar simplemente usando la empresa-jira.company.com!
Me acabo de enterar de que tenemos más de 400 000 problemas y puede que tarde un poco en cargarse…
axy5093
En respuesta a Tiago Machado
Hola, @TiagoMachado. En primer lugar, gracias por tu consulta. ¡Pude obtener todos los problemas para un proyecto específico con solo unos pequeños ajustes! Pero ahora me di cuenta de que los campos personalizados ocultos no se recuperan mediante la API REST, necesito poder obtener valores para ellos. ¿Conoce alguna solución para obtener estos datos?
Gracias de antemano,
Aish
Tiago Machado
En respuesta a axy5093
Hola @axy5093
respondí esta pregunta en este hilo también:
Para obtener los nombres «humanos» de custom_field, debe realizar otra llamada REST en:
https://xxxxxx.atlassian.net/rest/api/2/issue/createmeta?expand=projects.issuetypes.fields
(donde xxxx es su dominio en la nube)
Y luego cambie el nombre de las columnas en su Power BI.
Si no hay muchos campos personalizados, es más rápido codificar los valores (la llamada REST anterior tarda un tiempo en devolver datos, especialmente cuando aumenta la cantidad de proyectos que tiene en su instancia de nube)
Algunas referencias útiles:
https://community.atlassian.com/t5/Answers-Developer-Questions/Custom-Field-Name-in-Jira-JSON/qaq-p/…
https://developer.atlassian.com/cloud/jira/platform/rest/?_ga=2.106182916.649572337.1531849237-10605…
Por favor, hágamelo saber si fue útil
Saludos
axy5093
En respuesta a Tiago Machado
Hola @TiagoA
Gracias, eso es útil, mi problema era que no estaba obteniendo todos los campos. El problema era que con la función de búsqueda de la API REST de JIRA, el comportamiento predeterminado es obtener solo campos navegables y los necesitaba todos. De todos modos, me funcionó ajustar la URL como se muestra a continuación.
Buscar documentación
https://xxxxxx.atlassian.net/rest/api/2/search?jql=project=XYZ&fields=*all
Aishwarya
rsmccall33
En respuesta a Tiago Machado
Mis disculpas por revivir un hilo antiguo, pero he implementado el código que @TiagoMacado ha proporcionado y me ha permitido incorporar 1000 filas en lugar de solo 50. Sin embargo, el resultado esperado es 3839 filas. ¿Es posible obtener las 3839 filas? Tengo otra tabla que tiene más de 40k filas y 1000 filas no pintan una imagen precisa.
Editar: para aclarar, la línea a continuación devuelve un total de 3839. Entonces, en este punto, este paso muestra 3839 filas, pero cuando creo un informe que muestra el número total de registros, = 1000
#"total" = #"Removed Other Columns"{0}[total],
guardarlospennies
En respuesta a Tiago Machado
Gracias por la gran explicación por cierto. Esto fue muy útil para ponerse en marcha. Estoy tratando de averiguar cómo expandirme a los campos de problemas, así que veremos cómo va eso.
Alfa Beta
En respuesta a Tiago Machado
¿Alguien puede ayudarme a comprender cómo llamaría a todos los usuarios en lugar de solo a mis propios tickets asignados?
guardarlospennies
En respuesta a Alfa Beta
Cambie los criterios en la sección jql. Cualquier cambio que realice debe realizarse tanto en la línea de origen como en la línea #»Personalizada agregada». Si desea todas las entradas, puede eliminar la sección jql, pero tenga cuidado. Podría estar esperando un tiempo dependiendo de su cantidad de problemas.
Eric_Zhang
@shirleympearls escribió:
Hola a todos,
Necesito urgentemente conectar JIRA con Power BI. Revisé un documento que se ha compartido en Internet, pero no me ayudó mucho. Para empezar, esta es la URL que uso cuando PBI me pide que ingrese la URL para JIRA.
https://jira.rd.abcpharma.net/secure/RapidBoard.jspa?rapidView=5048&projectKey=SSCL
Este es el enlace al tablero Kanban que está en JIRA y me gustaría traerlo a Power BI. ¡Cualquier ayuda sería muy apreciada! 🙂
AIT 🙂
@shirleympearls
Al conectarse a JIRA, la URL requerida es como «https://xxxxxx.atlassian.net», al hacer clic en siguiente, llama a la API «https://xxxxxx.atlassian.net/rest/api/2/buscar».
Hablando de manera simple, en este momento, Power BI ahora solo puede obtener los datos que devuelve la API «https://xxxxxx.atlassian.net/rest/api/2/search», en cuanto a su enlace a otras API REST de JIRA, puede hacerlo llamando a la API REST en el escritorio de Power BI, esto requeriría una API REST y habilidades de programación. Compruebe cómo llamar a API similares en una demostración Obtener datos de la API de Twitter con Power Query.
También puede enviar su idea a Power BI Ideas y votarla.
Anónimo
En respuesta a Eric_Zhang
para la solución: ¿te conectas desde el servicio web?
cuando uso el servicio web, puedo conectarme a Jira pero crea una aplicación para mí; ¿Cómo uso esta solución para poder extraer datos y crear gráficos en PBI?