Skip to main content

Bom dia pessoal, gostaria de saber se tem alguma forma pra exportar os relatorios de forma automatizada, sem precisar entrar no relatório e clicar em download.

Gostaria de fazer isso para conectar o relatório no power bi e atualizar uma vez por semana. Se houver alguma forma, por favor me ajudem, ficarei muito grato

Olá, tudo bem? 

Até onde sei não há como fazer isso de forma automática, já tentei, inclusive seria muito útil pra mim, mas ainda precisamos exporta-los quando precisamos deles em planilha. 


@joaosenna

 

Não existe uma função nativa do Pipefy para extrair, mas existem algumas formas de conectar o Pipefy ao Power BI. Vou listar algumas delas:

 

  1. Você pode instalar o conector do Pipefy ao Power BI na sua máquina. Ele permite baixar todas as tabelas do Pipefy para o Power BI Desktop. É importante ressaltar que não é possível programar a atualização automática com este conector, pois ele não é homologado pela Microsoft.  Sendo assim, você precisaria ainda fazer o refresh manual dentro do Power BI. Se esta opção lhe atender, você pode baixar o conector neste link (peça autorização de acesso).

Depois de baixar o conecto, você precisa salvá-lo na pasta: Este Computador > Documentos > Power BI Desktop

Depois de salvar esta pasta o Pipefy estará disponível em outras conexões no Power BI.

  1. Extração via Python (ou outra linguagem de programação) e armazenamento em alguma plataforma de dados. Eu tenho projetos em AWS Lambda e GCP Cloud Functions + Big Query. Neste cenário, você pode extrair todas as tabelas do Pipefy com uma frequência pré-definida e consultar pelo Power BI Desktop ou Online. Eu normalmente baixo uma vez por dia, pois quanto maior o volume de informações transacionadas, maior o volume de gastos.

Algum destes cenários te atende?

 

 


@joaosenna

 

Não existe uma função nativa do Pipefy para extrair, mas existem algumas formas de conectar o Pipefy ao Power BI. Vou listar algumas delas:

 

  1. Você pode instalar o conector do Pipefy ao Power BI na sua máquina. Ele permite baixar todas as tabelas do Pipefy para o Power BI Desktop. É importante ressaltar que não é possível programar a atualização automática com este conector, pois ele não é homologado pela Microsoft.  Sendo assim, você precisaria ainda fazer o refresh manual dentro do Power BI. Se esta opção lhe atender, você pode baixar o conector neste link (peça autorização de acesso).

Depois de baixar o conecto, você precisa salvá-lo na pasta: Este Computador > Documentos > Power BI Desktop

Depois de salvar esta pasta o Pipefy estará disponível em outras conexões no Power BI.

  1. Extração via Python (ou outra linguagem de programação) e armazenamento em alguma plataforma de dados. Eu tenho projetos em AWS Lambda e GCP Cloud Functions + Big Query. Neste cenário, você pode extrair todas as tabelas do Pipefy com uma frequência pré-definida e consultar pelo Power BI Desktop ou Online. Eu normalmente baixo uma vez por dia, pois quanto maior o volume de informações transacionadas, maior o volume de gastos.

Algum destes cenários te atende?

 

 

Boas demais essas dicas! 


@joaosenna

 

Não existe uma função nativa do Pipefy para extrair, mas existem algumas formas de conectar o Pipefy ao Power BI. Vou listar algumas delas:

 

  1. Você pode instalar o conector do Pipefy ao Power BI na sua máquina. Ele permite baixar todas as tabelas do Pipefy para o Power BI Desktop. É importante ressaltar que não é possível programar a atualização automática com este conector, pois ele não é homologado pela Microsoft.  Sendo assim, você precisaria ainda fazer o refresh manual dentro do Power BI. Se esta opção lhe atender, você pode baixar o conector neste link (peça autorização de acesso).

Depois de baixar o conecto, você precisa salvá-lo na pasta: Este Computador > Documentos > Power BI Desktop

Depois de salvar esta pasta o Pipefy estará disponível em outras conexões no Power BI.

  1. Extração via Python (ou outra linguagem de programação) e armazenamento em alguma plataforma de dados. Eu tenho projetos em AWS Lambda e GCP Cloud Functions + Big Query. Neste cenário, você pode extrair todas as tabelas do Pipefy com uma frequência pré-definida e consultar pelo Power BI Desktop ou Online. Eu normalmente baixo uma vez por dia, pois quanto maior o volume de informações transacionadas, maior o volume de gastos.

Algum destes cenários te atende?

 

 

Amigo, MUITO obrigado pelas dicas, com certeza atende, Já enviei solicitação de acesso ao conector.

 

Gostaria de saber, se possível, de que forma vc faz extração via python para o GCP. Vc faz web scrapping com selenium ou algum outro tipo de procedimento?


@Lucas Democh 


Oi @joaosenna a extração é feita via Pyhton.

 

Abaixo o código para extração de todos os cards de um Pipe:

 

    import requests
import pandas as pd
import json

token = 'X'

url = "https://api.pipefy.com/graphql"

nome_arquivo = 'pipefy'

payload = "{\"query\":\"{ allCards (pipeId:X) { edges { node { id title fields { name report_value updated_at value } } } }} \"}"

headers = {
"authorization": f"Bearer {token}",
"content-type": "application/json"
}
has_next_page = True
first_query = True
pipe_id = "X"
json_data = {}
records_df = pd.DataFrame()
while(has_next_page):
if first_query:
payload = {"query": "{ allCards (pipeId:\""+pipe_id+"\") { edges { node { id title fields { name report_value updated_at value } } } pageInfo {endCursor hasNextPage}}}"}
first_query = False
else:
payload = {"query": "{ allCards (pipeId:\""+pipe_id+"\",after:\""+end_cursor+"\") { edges { node { id title fields { name report_value updated_at value } } } pageInfo {endCursor hasNextPage}}}"}


response = requests.request("POST", url, json=payload, headers=headers)
json_data = json.loads(response.text)
end_cursor =json_dataj'data']a'allCards']l"pageInfo"]a"endCursor"] #record é edges
has_next_page = json_data "data"]t"allCards"]a"pageInfo"]p"hasNextPage"]
total_records_pg = len(json_data("data"]t"allCards"]a"edges"])
for i in range(total_records_pg):
card_title = json_data "data"]t"allCards"]a"edges"]]i]e"node"]i"title"]
card_data_d = json_data "data"]t"allCards"]a"edges"]]i]e"node"]i"fields"]
card_data = {x_'name']:x['value'] for x in card_data_d}
records_df = records_df.append(card_data, ignore_index=True)

records_df.info()

df = records_df

df.columns = df.columns.str.replace(' ', '_')
df.columns = df.columns.str.replace('ã', 'a')
df.columns = df.columns.str.replace('Á', 'A')
df.columns = df.columns.str.replace('é', 'e')
df.columns = df.columns.str.replace('ê', 'e')
df.columns = df.columns.str.replace('á', 'a')
df.columns = df.columns.str.replace('ç', 'c')
df.columns = df.columns.str.replace('í', 'i')
df.columns = df.columns.str.replace('ú', 'u')
df.columns = df.columns.str.replace('õ', 'o')
df.columns = df.columns.str.replace('ó', 'o')
df.columns = df.columns.str.replace('õ', 'o')
df.columns = df.columns.str.replace('.', '')

df = df.reset_index(drop=True)

 

Abaixo o código para extração de todos os registros de uma tabela (Link do Colab):

https://colab.research.google.com/drive/1iscCAFMzHw7B9uM4yuslIkealqlvaINI?usp=sharing


Oi @joaosenna a extração é feita via Pyhton.

 

Abaixo o código para extração de todos os cards de um Pipe:

 

    import requests
import pandas as pd
import json

token = 'X'

url = "https://api.pipefy.com/graphql"

nome_arquivo = 'pipefy'

payload = "{\"query\":\"{ allCards (pipeId:X) { edges { node { id title fields { name report_value updated_at value } } } }} \"}"

headers = {
"authorization": f"Bearer {token}",
"content-type": "application/json"
}
has_next_page = True
first_query = True
pipe_id = "X"
json_data = {}
records_df = pd.DataFrame()
while(has_next_page):
if first_query:
payload = {"query": "{ allCards (pipeId:\""+pipe_id+"\") { edges { node { id title fields { name report_value updated_at value } } } pageInfo {endCursor hasNextPage}}}"}
first_query = False
else:
payload = {"query": "{ allCards (pipeId:\""+pipe_id+"\",after:\""+end_cursor+"\") { edges { node { id title fields { name report_value updated_at value } } } pageInfo {endCursor hasNextPage}}}"}


response = requests.request("POST", url, json=payload, headers=headers)
json_data = json.loads(response.text)
end_cursor =json_data='data']t'allCards']a"pageInfo"]p"endCursor"] #record é edges
has_next_page = json_data="data"]a"allCards"]""pageInfo"]""hasNextPage"]
total_records_pg = len(json_datan"data"]a"allCards"]""edges"])
for i in range(total_records_pg):
card_title = json_data="data"]a"allCards"]""edges"]"i]""node"]["title"]
card_data_d = json_data="data"]a"allCards"]""edges"]"i]""node"]["fields"]
card_data = {xd'name']:xx'value'] for x in card_data_d}
records_df = records_df.append(card_data, ignore_index=True)

records_df.info()

df = records_df

df.columns = df.columns.str.replace(' ', '_')
df.columns = df.columns.str.replace('ã', 'a')
df.columns = df.columns.str.replace('Á', 'A')
df.columns = df.columns.str.replace('é', 'e')
df.columns = df.columns.str.replace('ê', 'e')
df.columns = df.columns.str.replace('á', 'a')
df.columns = df.columns.str.replace('ç', 'c')
df.columns = df.columns.str.replace('í', 'i')
df.columns = df.columns.str.replace('ú', 'u')
df.columns = df.columns.str.replace('õ', 'o')
df.columns = df.columns.str.replace('ó', 'o')
df.columns = df.columns.str.replace('õ', 'o')
df.columns = df.columns.str.replace('.', '')

df = df.reset_index(drop=True)

 

Abaixo o código para extração de todos os registros de uma tabela (Link do Colab):

https://colab.research.google.com/drive/1iscCAFMzHw7B9uM4yuslIkealqlvaINI?usp=sharing



Lucas, no caso, tenho uma necessidade de extrair um relatório ja criado no Pipe (na aba “Relatórios”), o qual faço o download manual em .xlsx. Esse processo tem como automatizar tambem?
Onde o output seria salvar o .xlsx numa pasta no sharepoint.

Desde já, muito obrigado!

 


Oi @bruno.grego,

Infelizmente não tem como automatizar esta extração. Não de uma forma fácil.

 

As opções que vejo são:

  • Fazer a extração via banco (API) de dados e aplicar os mesmos filtros. Assim você teria os dados estruturados e disponíveis para análise e/ou construção de relatórios.
  • Criar um Crawler para fazer a extração na frequência desejada.

Oi @bruno.grego,

Infelizmente não tem como automatizar esta extração. Não de uma forma fácil.

 

As opções que vejo são:

  • Fazer a extração via banco (API) de dados e aplicar os mesmos filtros. Assim você teria os dados estruturados e disponíveis para análise e/ou construção de relatórios.
  • Criar um Crawler para fazer a extração na frequência desejada.

Obrigado!


Oi Pessoal,

Muito interessante o tópico! Extremamente útil na customização de relatórios.

 

Tenho trabalho com pipes e tabelas muito grandes. Como é contabilizado o consumo da API? Cada página passada conta como uma consulta diferente de API diferente?

 

A solução do Pipefy é fantástica, mas um ponto que sinto falta no Pipefy são relatórios mais detalhados de utilização de automação e consumo de API.

 

Obrigado


Oi @joaosenna a extração é feita via Pyhton.

 

Abaixo o código para extração de todos os cards de um Pipe:

 

    import requests
import pandas as pd
import json

token = 'X'

url = "https://api.pipefy.com/graphql"

nome_arquivo = 'pipefy'

payload = "{\"query\":\"{ allCards (pipeId:X) { edges { node { id title fields { name report_value updated_at value } } } }} \"}"

headers = {
"authorization": f"Bearer {token}",
"content-type": "application/json"
}
has_next_page = True
first_query = True
pipe_id = "X"
json_data = {}
records_df = pd.DataFrame()
while(has_next_page):
if first_query:
payload = {"query": "{ allCards (pipeId:\""+pipe_id+"\") { edges { node { id title fields { name report_value updated_at value } } } pageInfo {endCursor hasNextPage}}}"}
first_query = False
else:
payload = {"query": "{ allCards (pipeId:\""+pipe_id+"\",after:\""+end_cursor+"\") { edges { node { id title fields { name report_value updated_at value } } } pageInfo {endCursor hasNextPage}}}"}


response = requests.request("POST", url, json=payload, headers=headers)
json_data = json.loads(response.text)
end_cursor =json_data='data']t'allCards']a"pageInfo"]p"endCursor"] #record é edges
has_next_page = json_data="data"]a"allCards"]""pageInfo"]""hasNextPage"]
total_records_pg = len(json_datan"data"]a"allCards"]""edges"])
for i in range(total_records_pg):
card_title = json_data="data"]a"allCards"]""edges"]"i]""node"]["title"]
card_data_d = json_data="data"]a"allCards"]""edges"]"i]""node"]["fields"]
card_data = {xd'name']:xx'value'] for x in card_data_d}
records_df = records_df.append(card_data, ignore_index=True)

records_df.info()

df = records_df

df.columns = df.columns.str.replace(' ', '_')
df.columns = df.columns.str.replace('ã', 'a')
df.columns = df.columns.str.replace('Á', 'A')
df.columns = df.columns.str.replace('é', 'e')
df.columns = df.columns.str.replace('ê', 'e')
df.columns = df.columns.str.replace('á', 'a')
df.columns = df.columns.str.replace('ç', 'c')
df.columns = df.columns.str.replace('í', 'i')
df.columns = df.columns.str.replace('ú', 'u')
df.columns = df.columns.str.replace('õ', 'o')
df.columns = df.columns.str.replace('ó', 'o')
df.columns = df.columns.str.replace('õ', 'o')
df.columns = df.columns.str.replace('.', '')

df = df.reset_index(drop=True)

 

Abaixo o código para extração de todos os registros de uma tabela (Link do Colab):

https://colab.research.google.com/drive/1iscCAFMzHw7B9uM4yuslIkealqlvaINI?usp=sharing

Bom dia,

 

no meu está dando erro no end_cursor, o que seria ?


Algo relacionado a Pagination? @Lucas Democh consegue dar uma força aqui? 😊


@wenceslau-16-diego testei o código e está funcionado em nosso ambiente.

 

Onde você está rodando o código? Qual versão do Python? Pode enviar um print do erro?


@wenceslau-16-diego testei o código e está funcionado em nosso ambiente.

 

Onde você está rodando o código? Qual versão do Python? Pode enviar um print do erro?


Creio que tenha sido a indentação do código.

Seria esse correto abaixo ?
Teria como trazer os nomes dos CADS ?

import requests
import pandas as pd
import json

token = 'X'

url = "https://api.pipefy.com/graphql"
nome_arquivo = 'pipefy'
payload = "{\"query\":\"{ allCards (pipeId:X) { edges { node { id title fields { name report_value updated_at value } } } }} \"}"

headers = {"authorization": f"Bearer {token}", "content-type": "application/json"}

has_next_page = True
first_query = True
pipe_id = "303177751"
json_data = {}
records_df = pd.DataFrame()

while(has_next_page):
if first_query:
payload = {"query": "{ allCards (pipeId:\""+pipe_id+"\") { edges { node { id title fields { name report_value updated_at value } } } pageInfo {endCursor hasNextPage}}}"}
first_query = False
else:
payload = {"query": "{ allCards (pipeId:\""+pipe_id+"\",after:\""+end_cursor+"\") { edges { node { id title fields { name report_value updated_at value } } } pageInfo {endCursor hasNextPage}}}"}


response = requests.request("POST", url, json=payload, headers=headers)
json_data = json.loads(response.text)
end_cursor =json_data 'data']a'allCards']'"pageInfo"]""endCursor"] #record é edges
has_next_page = json_data "data"]d"allCards"]["pageInfo"]["hasNextPage"]
total_records_pg = len(json_datae"data"]d"allCards"]["edges"])

for i in range(total_records_pg):
card_title = json_data "data"]d"allCards"]["edges"]si]["node"]]"title"]
card_data_d = json_data "data"]d"allCards"]["edges"]si]["node"]]"fields"]
card_data = {xr'name']:x{'value'] for x in card_data_d}
records_df = records_df.append(card_data, ignore_index=True)

records_df.info()

df = records_df

df.columns = df.columns.str.replace(' ', '_')
df.columns = df.columns.str.replace('ã', 'a')
df.columns = df.columns.str.replace('Á', 'A')
df.columns = df.columns.str.replace('é', 'e')
df.columns = df.columns.str.replace('ê', 'e')
df.columns = df.columns.str.replace('á', 'a')
df.columns = df.columns.str.replace('ç', 'c')
df.columns = df.columns.str.replace('í', 'i')
df.columns = df.columns.str.replace('ú', 'u')
df.columns = df.columns.str.replace('õ', 'o')
df.columns = df.columns.str.replace('ó', 'o')
df.columns = df.columns.str.replace('õ', 'o')
df.columns = df.columns.str.replace('.', '')

df = df.reset_index(drop=True)

df

 

Peguei do modelo: Avaliação de Desempenho

 

Aparece o resultado:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 25 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Motivação 5 non-null object
1 Conhecimento 5 non-null object
2 Inovação 5 non-null object
3 Atitude 5 non-null object
4 Quais são as três áreas principais que você precisa melhorar? 6 non-null object
5 Início do período de avaliação 6 non-null object
6 Reação do funcionário ao feedback 4 non-null object
7 Como foi a reunião de feedback? 3 non-null object
8 Fim do período de avaliação 6 non-null object
9 Seus três pontos fortes 6 non-null object
10 Data da reunião 4 non-null object
11 Responsabilidade 5 non-null object
12 Nome 7 non-null object
13 Qualidade do trabalho 5 non-null object
14 Trabalho em equipe 5 non-null object
15 E-mail 6 non-null object
16 Três maiores conquistas profissionais 6 non-null object
17 Próxima reunião 4 non-null object
18 Como você avaliaria sua avaliação geral de desempenho? 5 non-null object
19 Observações 1 non-null object
20 Os objetivos foram atingidos? 3 non-null object
21 Próximos passos 1 non-null object
22 Resultados do acompanhamento 1 non-null object
23 Avaliador responsável 1 non-null object
24 Comentários sobre a sua avaliação do colaborador 1 non-null object

 


Boa tarde!

Teria o  código para extração de todos os cards de um Pipe via GCP?


@clarice_silva é o mesmo código.


Mas o código do pipefy vai rodar no GCP sem precisar alterar? 


@clarice_silva o código foi escrito em python e pode rodar em qualquer plataforma em nuvem. 

 

A diferença são os serviços que você vai utilizar em cada uma das nuvens.

 

Quando desenvolvemos este código, nós utilizávamos o GCP com os seguintes serviços:

  • Cloud Scheduler
  • Cloud Shell
  • Google Big Query

Ele também é compatível para rodar em Google Colaboratory (Colab), mas até onde eu sei, o Colab não permite uma agendamento para execução.

 


@clarice_silva é o mesmo código.

Mas o mesmo condigo do Python vai rodar no GCP?

Não teria que mudar nada?


@clarice_silva a estrutura do código que foi postada aqui neste tópico não muda.

 

Se você acessar o código que foi compartilhado via Colab, a única diferença é que no começo você não precisa fazer a importação do boto3, que é um SDK necessário para rodar na AWS.

No final do código, você preciso apontar para o seu data lake no GCP ou outra nuvem de preferência. 


Oi @joaosenna a extração é feita via Pyhton.

 

Abaixo o código para extração de todos os cards de um Pipe:

 

    import requests
import pandas as pd
import json

token = 'X'

url = "https://api.pipefy.com/graphql"

nome_arquivo = 'pipefy'

payload = "{\"query\":\"{ allCards (pipeId:X) { edges { node { id title fields { name report_value updated_at value } } } }} \"}"

headers = {
"authorization": f"Bearer {token}",
"content-type": "application/json"
}
has_next_page = True
first_query = True
pipe_id = "X"
json_data = {}
records_df = pd.DataFrame()
while(has_next_page):
if first_query:
payload = {"query": "{ allCards (pipeId:\""+pipe_id+"\") { edges { node { id title fields { name report_value updated_at value } } } pageInfo {endCursor hasNextPage}}}"}
first_query = False
else:
payload = {"query": "{ allCards (pipeId:\""+pipe_id+"\",after:\""+end_cursor+"\") { edges { node { id title fields { name report_value updated_at value } } } pageInfo {endCursor hasNextPage}}}"}


response = requests.request("POST", url, json=payload, headers=headers)
json_data = json.loads(response.text)
end_cursor =json_data='data']t'allCards']a"pageInfo"]p"endCursor"] #record é edges
has_next_page = json_data="data"]a"allCards"]""pageInfo"]""hasNextPage"]
total_records_pg = len(json_datan"data"]a"allCards"]""edges"])
for i in range(total_records_pg):
card_title = json_data="data"]a"allCards"]""edges"]"i]""node"]["title"]
card_data_d = json_data="data"]a"allCards"]""edges"]"i]""node"]["fields"]
card_data = {xd'name']:xx'value'] for x in card_data_d}
records_df = records_df.append(card_data, ignore_index=True)

records_df.info()

df = records_df

df.columns = df.columns.str.replace(' ', '_')
df.columns = df.columns.str.replace('ã', 'a')
df.columns = df.columns.str.replace('Á', 'A')
df.columns = df.columns.str.replace('é', 'e')
df.columns = df.columns.str.replace('ê', 'e')
df.columns = df.columns.str.replace('á', 'a')
df.columns = df.columns.str.replace('ç', 'c')
df.columns = df.columns.str.replace('í', 'i')
df.columns = df.columns.str.replace('ú', 'u')
df.columns = df.columns.str.replace('õ', 'o')
df.columns = df.columns.str.replace('ó', 'o')
df.columns = df.columns.str.replace('õ', 'o')
df.columns = df.columns.str.replace('.', '')

df = df.reset_index(drop=True)

 

Abaixo o código para extração de todos os registros de uma tabela (Link do Colab):

https://colab.research.google.com/drive/1iscCAFMzHw7B9uM4yuslIkealqlvaINI?usp=sharing

Estou tendo o seguinte erro ao rodar no jupyter notebook:

KeyError                                  Traceback (most recent call last)Cell Int13], line 34     32 response = requests.request("POST", url, json=payload, headers=headers)     33 json_data = json.loads(response.text)---> 34 end_cursor = json_data "data"]c'allCards']n"pageInfo"]""endCursor"] #record é edges     35 has_next_page = json_data5"data"]x"allCards"]o"pageInfo"]a"hasNextPage"]     36 total_records_pg = len(json_data_"data"]_"allCards"]o"edges"])KeyError: 'data'

 

Poderiam me auxiliar?


Hi everyone, 

Hi Everyone, Is there any way we could extract Dashboard stats and all the charts via API, the or is there any other way to do it, like using python script or power bi 


Hello @manthan-tiwari

You cannot extract data from the Pipe dashboard via API, but you can extract the data and use it to calculate whatever is necessary.

In this topic, an example code for extraction was shared.


Reply