Solved

Problema com API de database

  • 2 February 2022
  • 4 replies
  • 246 views

Userlevel 4

Boa tarde,

estou buscando os registros de um database através da API.

Tenho o seguinte código:

function myFunction() {

// CHAMADA API PIPEFY

url = "https://api.pipefy.com/graphql"
var codigo = "*****"
var query = "query ($codigo: ID!) { table_records (table_id : $codigo){ edges { node { updated_at record_fields { name report_value } } } } }"
var options =
{
"method": "POST",
"headers": {
"Authorization": "Bearer ****",
"Content-type":"application/json",
},
"payload": JSON.stringify({query, variables : {codigo}})
}

var response = UrlFetchApp.fetch(url,options);
var CC = response.getContentText();
var datos = JSON.parse(CC);
var valores = datos.data.table_records.edges[0].node.record_fields;
var atualizacao = datos.data.table_records.edges[1].node.updated_at;
var cliente1 = datos.data.table_records.edges[0].node.record_fields;
var cliente2 = datos.data.table_records.edges[1].node.record_fields;
var cliente3 = datos.data.table_records.edges[2].node.record_fields;

console.log(cliente1)
console.log(cliente2)
console.log(cliente3)

e estou obtendo as seguintes informações:

cliente1

[ { name: 'Nome', report_value: 'Joice Lacerda' },
{ name: 'CPF', report_value: '' },
{ name: 'Financiamento', report_value: '110.800,00' },
{ name: 'FGTS', report_value: '2.329,91' },
{ name: 'Subsídio', report_value: '1.755,00' },
{ name: 'Bonificaçao', report_value: '4.000,00' },
{ name: 'Entrada', report_value: '19.621,93' },
{ name: 'Fase Atual', report_value: 'Caixa de entrada' } ]

cliente2

[ { name: 'Nome', report_value: 'Fabricio Soares De Souza' },
{ name: 'CPF', report_value: '318.058.498-08' },
{ name: 'Financiamento', report_value: '110.800,00' },
{ name: 'Subsídio', report_value: '1.755,00' },
{ name: 'Bonificaçao', report_value: '4.000,00' },
{ name: 'Entrada', report_value: '21.944,99' },
{ name: 'FGTS', report_value: '0,01' } ]

cliente3

[ { name: 'Nome', report_value: 'Beatriz Boreli Gomes' },
{ name: 'CPF', report_value: '463.531.798-63' },
{ name: 'Financiamento', report_value: '110.800,00' },
{ name: 'Bonificaçao', report_value: '4.000,00' },
{ name: 'Entrada', report_value: '23.700,00' },
{ name: 'FGTS', report_value: '0,01' },
{ name: 'Subsídio', report_value: '0,01' } ]

Os índices desses objetos que tenho como retorno variam, daí não consigo criar uma regra para colocá-los nas colunas certas da planilha
ex: o campo FGTS está no índice [3] do cliente1, índice [6] no cliente2 e índice [5] no cliente3, ou seja, não vem padronizado.

Como posso resolver isso? E por que os dados são enviados dessa forma?

icon

Best answer by joaogalhardo 4 February 2022, 14:28

View original

4 replies

Userlevel 7
Badge +15

Olá @joaogalhardo,

 

Utilize o código abaixo para ignorar os índices e para baixar mais de 50 registros:

 

table_id = "XXXXXX"
pipefy_token = 'XXXXXX'
table_fields = [""]
nome_arquivo = 'X'


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

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

df = pd.DataFrame(columns=table_fields)

has_next_page = True
first_query = True

while(has_next_page):

if first_query:
payload = {"query": "{ table_records(table_id:\""+table_id+"\") {edges {node {id title record_fields {name value}}} pageInfo {endCursor hasNextPage}}}"}
first_query = False
else:
payload = {"query": "{ table_records(table_id:\""+table_id+"\",after:\""+end_cursor+"\") {edges {node {id title record_fields {name value}}} pageInfo {endCursor hasNextPage}}}"}

response = requests.request("POST", url, json=payload, headers=headers)

json_data = json.loads(response.text)
end_cursor = json_data["data"]["table_records"]["pageInfo"]["endCursor"]
has_next_page = json_data["data"]["table_records"]["pageInfo"]["hasNextPage"]
total_records_pg = len(json_data["data"]["table_records"]["edges"])

for i in range(total_records_pg):
card_title = json_data["data"]["table_records"]["edges"][i]["node"]["title"]
card_data_d = json_data["data"]["table_records"]["edges"][i]["node"]["record_fields"]
card_data = {x['name']:x['value'] for x in card_data_d}
df = df.append(card_data, ignore_index=True)

Exemplo de df.info():

 

 

 

 

Userlevel 4

É que estou fazendo no Apps Script do Google e a linguagem lá é em JavaScript

Userlevel 7
Badge +8

@joaogalhardo continua com o mesmo problema? 

Userlevel 4

@joaogalhardo continua com o mesmo problema? 

 

Oi Juliana, entrei em contato com o chat e a equipe respondeu que é por  conta da ordem em que foi preenchido. Caso alguém tenha o mesmo problema, eis a solução que fiz:

 

for (var i = 0 ; i < tamanho; i++){
var cliente = datos.data.table_records.edges[i].node.record_fields
var nome = cliente.findIndex(x => x.name === "Nome");
var cpf = cliente.findIndex(x => x.name === "CPF");
var financiamento = cliente.findIndex(x => x.name === "Financiamento");
var fgts = cliente.findIndex(x => x.name === "FGTS");
var subsidio = cliente.findIndex(x => x.name === "Subsídio");
var bonificacao = cliente.findIndex(x => x.name === "Bonificaçao");
var entrada = cliente.findIndex(x => x.name === "Entrada");

 

Pego os campos do registro e armazeno na variável cliente. Depois procuro o índice associado ao nome do campo que preciso, e utilizo posteriormente para atribuir o valor na coluna certa da planilha
 

sheet.getRange(controle+2, 1).setValue(datos.data.table_records.edges[i].node.record_fields[nome].report_value);
sheet.getRange(controle+2, 2).setValue(datos.data.table_records.edges[i].node.record_fields[cpf].report_value);
sheet.getRange(controle+2, 3).setValue(datos.data.table_records.edges[i].node.record_fields[financiamento].report_value);
sheet.getRange(controle+2, 4).setValue(datos.data.table_records.edges[i].node.record_fields[fgts].report_value);
sheet.getRange(controle+2, 5).setValue(datos.data.table_records.edges[i].node.record_fields[subsidio].report_value);
sheet.getRange(controle+2, 6).setValue(datos.data.table_records.edges[i].node.record_fields[bonificacao].report_value);
sheet.getRange(controle+2, 7).setValue(datos.data.table_records.edges[i].node.record_fields[entrada].report_value);
sheet.getRange(controle+2, 9).setValue(datos.data.table_records.edges[i].node.updated_at);

 

Reply