Skip to main content
Solved

 Importar base de dados do Pipefy para Power BI/SQL Server

  • September 18, 2020
  • 9 replies
  • 1415 views

Paulo Ribas
Pipefy Staff

 

Gostaria de saber se é possível importar a base de dados do Pipefy para o Power BI ou SQL Server com dados sendo enviados em tempo real.

Mais ou menos como esse post aqui explica: https://gist.github.com/petrsvihlik/cc34a6cf1882d515139c5b27f37cf99e

Best answer by murilova

  Bom dia a todos,

Nosso colaborador Pedro Kronberg aqui da Market4u.com.br conseguiu escrever um script para importar os cards. Basta fazer uma Consulta Nula no Power Query e depois colar o codigo abaixo no editor avançado. As duas primeiras linhas são onde deve informar sua chave da API e o pipe a puxar.
 

let
TOKENAUTH = "Bearer xxxxxxxx", // Inserir sua Chave da API
PipeAnalisado = "xxxxxxxxxx", // Usar os numeros que seguem depois da URL: https://app.pipefy.com/pipes/______

GeradorDeCards =
(TOKENAUTH as text, PRIMEIROCARD as text) =>
let
query = "{""query"" : ""{ cards(pipe_id: "&PipeAnalisado&" "& PRIMEIROCARD &") { pageInfo { startCursor endCursor hasNextPage hasPreviousPage } edges { node { id title creatorEmail created_at finished_at updated_at due_date comments { text created_at } assignees { id name } labels { id name } created_by { id name } parent_relations { cards { id }} current_phase { id name } phases_history { phase { id name sequentialId } firstTimeIn lastTimeIn lastTimeOut duration } pipe { id name } fields { name report_value updated_at } } } } }""}",
authURL = "https://app.pipefy.com/graphql",
getToken = Web.Contents(
authURL,
[
Headers=[
#"Method" = "POST",
#"Accept" = "application/json",
#"Authorization" =TOKENAUTH ,
#"Content-Type" = "application/json; charset=utf-8"
],
Content=Text.ToBinary(query)
]
),
pipefyResponse = Json.Document(getToken),
data = pipefyResponse[data],
cards = data[cards],
edges = cards[edges]
in
edges,

GeradorDePaginas =
(TOKENAUTH as text, PrimeiroCard as text) => let
query = "{""query"" : ""{ cards(pipe_id: "&PipeAnalisado&" "& PrimeiroCard &") { pageInfo { startCursor endCursor hasNextPage hasPreviousPage } edges { node { id title creatorEmail created_at finished_at updated_at due_date comments { text created_at } assignees { id name } labels { id name } created_by { id name } current_phase { id name } phases_history { phase { id name sequentialId } firstTimeIn lastTimeIn lastTimeOut duration } pipe { id name } fields { indexName report_value name updated_at } } } } }""}",
authURL = "https://app.pipefy.com/graphql",
getToken = Json.Document(Web.Contents(authURL, [Headers=[Method="POST", Accept="application/json", Authorization=TOKENAUTH, #"Content-Type"="application/json; charset=utf-8"], Content=Text.ToBinary(query)])),
data = getToken[data],
cards = data[cards],
#"Convertido para Tabela" = Record.ToTable(cards),
Value = #"Convertido para Tabela"{0}[Value],
#"Convertido para Tabela1" = Record.ToTable(Value),
Nextpage = #"Convertido para Tabela1"{2}[Value],
STARTFROM = #"Convertido para Tabela1"{1}[Value],
res = [maispagina = Nextpage, cursorstart = STARTFROM]
in
res,

Fonte = List.Generate(
() =>
[Consulta = GeradorDePaginas(TOKENAUTH, ""), PG = 1, newstart = "", TOKENAUTH = TOKENAUTH],
each [newstart] <> null,
each [PG = [PG]+1, newstart = ("after: \#(0022)"& [Consulta][cursorstart] &"\#(0022)"), Consulta = GeradorDePaginas(TOKENAUTH, newstart), TOKENAUTH = [TOKENAUTH] ],
each [[TOKENAUTH], [PG], [newstart]]
),
#"Convertido para Tabela" = Table.FromList(Fonte, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Column1 Expandido" = Table.ExpandRecordColumn(#"Convertido para Tabela", "Column1", {"TOKENAUTH", "PG", "newstart"}, {"Column1.TOKENAUTH", "Column1.PG", "Column1.newstart"}),
#"Função Personalizada Invocada" = Table.AddColumn(#"Column1 Expandido", "GeradorDeCards", each GeradorDeCards([Column1.TOKENAUTH], [Column1.newstart])),
#"GeradorDeCards Expandido" = Table.ExpandListColumn(#"Função Personalizada Invocada", "GeradorDeCards"),
#"GeradorDeCards Expandido1" = Table.ExpandRecordColumn(#"GeradorDeCards Expandido", "GeradorDeCards", {"node"}, {"GeradorDeCards.node"}),
#"GeradorDeCards.node Expandido" = Table.ExpandRecordColumn(#"GeradorDeCards Expandido1", "GeradorDeCards.node", {"id", "title", "creatorEmail", "created_at", "finished_at", "updated_at", "due_date", "comments", "assignees", "labels", "created_by", "current_phase", "phases_history", "pipe", "fields"}, {"GeradorDeCards.node.id", "GeradorDeCards.node.title", "GeradorDeCards.node.creatorEmail", "GeradorDeCards.node.created_at", "GeradorDeCards.node.finished_at", "GeradorDeCards.node.updated_at", "GeradorDeCards.node.due_date", "GeradorDeCards.node.comments", "GeradorDeCards.node.assignees", "GeradorDeCards.node.labels", "GeradorDeCards.node.created_by", "GeradorDeCards.node.current_phase", "GeradorDeCards.node.phases_history", "GeradorDeCards.node.pipe", "GeradorDeCards.node.fields"}),
#"Linhas Filtradas" = Table.SelectRows(#"GeradorDeCards.node Expandido", each ([GeradorDeCards.node.id] <> null)),
#"Colunas Removidas" = Table.RemoveColumns(#"Linhas Filtradas",{"Column1.TOKENAUTH", "Column1.PG", "Column1.newstart"})
in
#"Colunas Removidas"

 

9 replies

Nicole Chiroli
Pipefy Staff
Forum|alt.badge.img+10
  • Product Manager
  • September 21, 2020

Bom dia @Paulo Ribas, tudo bem com você?

Não temos uma funcionalidade nativa para essa exportação. Você pode criar esta integração através da nossa API. Temos relatos de clientes que desenvolveram conectores diretamente com o Power BI. 
 

A Microsoft está analisando o nosso pedido de integração oficial e estamos em processo de liberação, porém, infelizmente, ainda não temos uma resposta definitiva sobre quando estará disponível pois dependemos de um posicionamento da Microsoft. :blush:  

Caso tenha qualquer outra dúvida, basta chamar. Tenha um excelente dia! 


diego.silva
  • Explorer
  • December 16, 2021

Bom dia @Paulo Ribas, tudo bem com você?

Não temos uma funcionalidade nativa para essa exportação. Você pode criar esta integração através da nossa API. Temos relatos de clientes que desenvolveram conectores diretamente com o Power BI. 
 

A Microsoft está analisando o nosso pedido de integração oficial e estamos em processo de liberação, porém, infelizmente, ainda não temos uma resposta definitiva sobre quando estará disponível pois dependemos de um posicionamento da Microsoft. :blush:  

Caso tenha qualquer outra dúvida, basta chamar. Tenha um excelente dia! 

Olá @Nicole Chiroli

   Como vai ? tudo bem ? Sou novo no fórum, estou trabalhando em uma integração entre Pepify e PowerBI, sabe me informar se hoje já existe alguma solução para essa integração. 

 

Obrigado pela atenção,

Diego Silva


lais_lot
Pipefy Staff
  • Pipefy Staff
  • January 5, 2022

Olá @diego.silva,

 

Ainda não obtivemos resposta da Microsoft quanto a nossa solicitação.

Mas conforme conversamos, pode ser desenvolvida através da nossa API.


Lucas Democh
Forum|alt.badge.img+15

@Paulo Ribas eu consegui extrair os dados através do Lambda da AWS e exportar os dados para o Power BI Online. 

Se ainda estiver precisando de ajuda, pode me chamar.


murilova
  • Explorer
  • Answer
  • February 10, 2022

  Bom dia a todos,

Nosso colaborador Pedro Kronberg aqui da Market4u.com.br conseguiu escrever um script para importar os cards. Basta fazer uma Consulta Nula no Power Query e depois colar o codigo abaixo no editor avançado. As duas primeiras linhas são onde deve informar sua chave da API e o pipe a puxar.
 

let
TOKENAUTH = "Bearer xxxxxxxx", // Inserir sua Chave da API
PipeAnalisado = "xxxxxxxxxx", // Usar os numeros que seguem depois da URL: https://app.pipefy.com/pipes/______

GeradorDeCards =
(TOKENAUTH as text, PRIMEIROCARD as text) =>
let
query = "{""query"" : ""{ cards(pipe_id: "&PipeAnalisado&" "& PRIMEIROCARD &") { pageInfo { startCursor endCursor hasNextPage hasPreviousPage } edges { node { id title creatorEmail created_at finished_at updated_at due_date comments { text created_at } assignees { id name } labels { id name } created_by { id name } parent_relations { cards { id }} current_phase { id name } phases_history { phase { id name sequentialId } firstTimeIn lastTimeIn lastTimeOut duration } pipe { id name } fields { name report_value updated_at } } } } }""}",
authURL = "https://app.pipefy.com/graphql",
getToken = Web.Contents(
authURL,
[
Headers=[
#"Method" = "POST",
#"Accept" = "application/json",
#"Authorization" =TOKENAUTH ,
#"Content-Type" = "application/json; charset=utf-8"
],
Content=Text.ToBinary(query)
]
),
pipefyResponse = Json.Document(getToken),
data = pipefyResponse[data],
cards = data[cards],
edges = cards[edges]
in
edges,

GeradorDePaginas =
(TOKENAUTH as text, PrimeiroCard as text) => let
query = "{""query"" : ""{ cards(pipe_id: "&PipeAnalisado&" "& PrimeiroCard &") { pageInfo { startCursor endCursor hasNextPage hasPreviousPage } edges { node { id title creatorEmail created_at finished_at updated_at due_date comments { text created_at } assignees { id name } labels { id name } created_by { id name } current_phase { id name } phases_history { phase { id name sequentialId } firstTimeIn lastTimeIn lastTimeOut duration } pipe { id name } fields { indexName report_value name updated_at } } } } }""}",
authURL = "https://app.pipefy.com/graphql",
getToken = Json.Document(Web.Contents(authURL, [Headers=[Method="POST", Accept="application/json", Authorization=TOKENAUTH, #"Content-Type"="application/json; charset=utf-8"], Content=Text.ToBinary(query)])),
data = getToken[data],
cards = data[cards],
#"Convertido para Tabela" = Record.ToTable(cards),
Value = #"Convertido para Tabela"{0}[Value],
#"Convertido para Tabela1" = Record.ToTable(Value),
Nextpage = #"Convertido para Tabela1"{2}[Value],
STARTFROM = #"Convertido para Tabela1"{1}[Value],
res = [maispagina = Nextpage, cursorstart = STARTFROM]
in
res,

Fonte = List.Generate(
() =>
[Consulta = GeradorDePaginas(TOKENAUTH, ""), PG = 1, newstart = "", TOKENAUTH = TOKENAUTH],
each [newstart] <> null,
each [PG = [PG]+1, newstart = ("after: \#(0022)"& [Consulta][cursorstart] &"\#(0022)"), Consulta = GeradorDePaginas(TOKENAUTH, newstart), TOKENAUTH = [TOKENAUTH] ],
each [[TOKENAUTH], [PG], [newstart]]
),
#"Convertido para Tabela" = Table.FromList(Fonte, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Column1 Expandido" = Table.ExpandRecordColumn(#"Convertido para Tabela", "Column1", {"TOKENAUTH", "PG", "newstart"}, {"Column1.TOKENAUTH", "Column1.PG", "Column1.newstart"}),
#"Função Personalizada Invocada" = Table.AddColumn(#"Column1 Expandido", "GeradorDeCards", each GeradorDeCards([Column1.TOKENAUTH], [Column1.newstart])),
#"GeradorDeCards Expandido" = Table.ExpandListColumn(#"Função Personalizada Invocada", "GeradorDeCards"),
#"GeradorDeCards Expandido1" = Table.ExpandRecordColumn(#"GeradorDeCards Expandido", "GeradorDeCards", {"node"}, {"GeradorDeCards.node"}),
#"GeradorDeCards.node Expandido" = Table.ExpandRecordColumn(#"GeradorDeCards Expandido1", "GeradorDeCards.node", {"id", "title", "creatorEmail", "created_at", "finished_at", "updated_at", "due_date", "comments", "assignees", "labels", "created_by", "current_phase", "phases_history", "pipe", "fields"}, {"GeradorDeCards.node.id", "GeradorDeCards.node.title", "GeradorDeCards.node.creatorEmail", "GeradorDeCards.node.created_at", "GeradorDeCards.node.finished_at", "GeradorDeCards.node.updated_at", "GeradorDeCards.node.due_date", "GeradorDeCards.node.comments", "GeradorDeCards.node.assignees", "GeradorDeCards.node.labels", "GeradorDeCards.node.created_by", "GeradorDeCards.node.current_phase", "GeradorDeCards.node.phases_history", "GeradorDeCards.node.pipe", "GeradorDeCards.node.fields"}),
#"Linhas Filtradas" = Table.SelectRows(#"GeradorDeCards.node Expandido", each ([GeradorDeCards.node.id] <> null)),
#"Colunas Removidas" = Table.RemoveColumns(#"Linhas Filtradas",{"Column1.TOKENAUTH", "Column1.PG", "Column1.newstart"})
in
#"Colunas Removidas"

 


Lucas Democh
Forum|alt.badge.img+15
  • Legend
  • February 10, 2022

Legal @murilova. Essa consulta nas atualizações automáticas do Power BI Online ou somente no Desktop? 


murilova
  • Explorer
  • February 16, 2022

Os dois!


MBORBA
  • Explorer
  • June 18, 2025

Pessoal,

Adaptei esse código para a minha realidade e consegui ter êxito na conexão do meu Power Bi com as informações do meu Pipe. Porém agora estou enfrentando uma dificuldade com relação a configuração para a atualização automática no Power BI Service. Notei que depois que publiquei, ele gerou o gateway automaticamente, só que estou enfrentando problemas com as credenciais. Alguma dica nesse sentido? 

 


Eduardo Cerejo
Pipefy Staff

Olá, ​@MBORBA !

O problema está no método de autenticação configurado no Power BI Service. No código que você está usando como base, o token já é enviado diretamente no header da requisição via `Web.Contents`:

TOKENAUTH = "Bearer xxxxxxxx"

Authorization = TOKENAUTH

Isso funciona perfeitamente no Power BI Desktop. Porém, quando você publica no Power BI Service, o gateway tenta re-autenticar a fonte https://app.pipefy.com/graphql usando as credenciais configuradas na interface e aí falha porque o método está como Básico (usuário/senha), que a API do Pipefy não suporta.

Como resolver:

  1. Vá em Credenciais da fonte de dados no Power BI Service
  2. Clique em Editar credenciais na fonte https://app.pipefy.com/graphql

  3. Troque o método de Básico para Anônimo
  4. Salve e tente atualizar novamente

O token já está sendo gerenciado pelo próprio código, então o Service não precisa de credenciais adicionais.

Recomendação: use uma Service Account

Percebo que você provavelmente está usando o Personal Access Token do seu próprio usuário no campo TOKENAUTH.

Para integrações em produção, recomendamos usar uma Service Account do Pipefy. Os motivos:

  • O token pessoal fica vinculado à sua conta, se você sair da empresa ou o acesso for revogado, a integração quebra
  • A Service Account gera um token independente, não vinculado a nenhum usuário, muito mais seguro e estável para automações

Para criar uma service account: https://developers.pipefy.com/reference/service-accounts

Espero que resolva! Qualquer dúvida é só responder aqui.