Import API (cURL) via un script ?

après le but principal, c'etait de me passer des extensions sheets pour importer mes API, et de pouvoir en importer un plus grand nombre

si ça alourdi pas mon doc, on peux laisser comme ça et mes Query feront l'affaire ( comme actuellement )

Bonjour,

et petite question, je vois que tu utilises beaucoup d'onglet générés par tes scripts. raison particulière ? ou plus simple que d'associer le script a un bouton sur la feuille de calcul par ex.

onglet ? ou menus ?

pourquoi je n'utilise pas de boutons ?

  1. compliqué à mettre en œuvre ... il faut choisir une image ou créer un bouton, le positionner, lui affecter un script, beaucoup d'étapes sans compter les couleurs, le dimensionnement
  2. pas toujours présent à l'écran ... il n'est valable que pour une seule feuille, du moins présent sur une seule feuille (cela peut quand même être un avantage), et il n'est pas toujours immédiatement visible, il peut être hors du champ de l'écran

je vais jumeler demain l'interro en tableau et l'interro en nomenclature complète en faisant une seule fois appel au site, donc une seule utilisation de l'api ... pourquoi pas, une fois que l'on a interrogé, les données sont alors disponibles.

C'est fait,

j'ai aussi mis la clé dans un prompt (cela ne fait plus partie du programme)

var resTable = []; 
var resTree = [];

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('** api.realt.community **')
    .addItem('Charger les données ...', 'getDataJSON')
    .addToUi();
}
function getDataJSON(){
  var url = 'https://api.realt.community/v1/token'
  var ui = SpreadsheetApp.getUi();
  var result = ui.prompt('API KEY !','J\'entre ma clé API :', ui.ButtonSet.OK_CANCEL);
  var apikey = result.getResponseText();
  var headers = {
    "contentType": "application/json",
    "headers":{"accept": "<*/*>",
      "X-AUTH-REALT-TOKEN": apikey}
  };
  var data = JSON.parse(UrlFetchApp.fetch(url,headers).getContentText())

  var table = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('table')
  var xpath = table.getRange(1,1,1,table.getLastColumn()).getValues()
  var json = eval('data')
  if (typeof xpath == 'object'){var liste = xpath.join().split(",")} else {var liste = xpath.split("|")}
  if (json.length){json.forEach(function(elem){getData(elem,liste)})} else {getData(json,liste)}
  table.getDataRange().offset(1,0).clearContent()
  table.getRange(2, 1, resTable.length, resTable[0].length).setValues(resTable)

  var tree = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('tree')
  getAllData(1,eval(data),'data')
  tree.getDataRange().offset(1,0).clearContent()
  tree.getRange(2, 1, resTree.length, resTree[0].length).setValues(resTree)

}
function getData(elem,liste){
  var prov=[]
  liste.forEach(function(chemin){
    var t=chemin.split('/');
    var obj=elem;
    for (var i=1;i<t.length;i++){obj=obj.item(t[i])}
    if(typeof obj=='object'){prov.push('['+obj+']')}else{prov.push(obj)}
  })
  resTable.push(prov)
}
Object.prototype.item=function(i){return this[i]};

function getAllData(niv,obj,id) {
  const regex = new RegExp('[^0-9]+');
  for (let p in obj) {
    var newid = (regex.test(p)) ? id + '.' + p : id + '[' + p + ']';
    if (obj[p]!=null){
      if (typeof obj[p] != 'object' && typeof obj[p] != 'function'){
        resTree.push([niv, (newid), p, obj[p]]);
      }
      if (typeof obj[p] == 'object') {
        if (obj[p].length){
          resTree.push([niv, (newid), p + '[0-' +(obj[p].length-1)+ ']', 'tableau']);
        }else{
          resTree.push([niv, (newid), p, 'parent']);
        }
        niv+=1;
        getAllData(niv, obj[p], newid );
        niv-=1
      }
    }
  }
}  

2 onglets : tree et table

onglet ? ou menus ?

Oui menus :) merci pour la réponse !

C'est fait

parfait comme d'habitude Merci !!

Bonjour :)

Quand je jvois le script que tu m'as proposé ci-dessus qui expose tout le Json d'un site, et ce script la ci-dessous, ça me semble assez similaire

function allRealtProperties() {

  var url = "https://portfolio.realt-dashboard.co/realt.min.json"

  var endpoint = UrlFetchApp.fetch(url);
  var json = endpoint.getContentText();
  var data = JSON.parse(json);

  var output = [];

  for (let i in data) {

    var shortName = data[i].property.shortName

    var isMen = shortName.match(/(OLD-)/);
    if (isMen != null) {
      continue
    } else {
      var isMen = shortName
    }

    var city = data[i].property.location.city
    var tokenValue = data[i].token.value
    var returnAPR = data[i].return.apr
    var returnPerYear = data[i].return.perYear
    var returnPerMonth = data[i].return.perMonth
    var returnPerDay = data[i].return.perDay
    var tokenSupply = data[i].token.supply
    var propertyURL = data[i].property.url
    var image = data[i].property.images[0]

    //Logger.log(result)

    output.push(['=hyperlink("' + propertyURL + '")',isMen, '=image(' + '"' + image + '"' + ')', city, tokenValue, returnAPR, returnPerYear, returnPerMonth, returnPerDay]);

  }

  if (output.length > 0) {
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Page1");
    try {
      sheet.getRange(2, 1, sheet.getLastRow(10000), sheet.getLastColumn(12)).clearContent();
    } catch (e) { }
    sheet.getRange(2, 1, output.length, output[0].length).setValues(output)
  }
}  

le site n'est pas le même, mais je voudrais l'adapter pour sélectionner juste les données que je voulais a l'origine de ce sujet.

celui-ci est plus "simple" dans la mesure ou je pourrais potentiellement mettre mes données rechercher a la place de ce qu'il y a en ici

image

ce serait facilement adaptable selon les besoins ensuite.

je bricole, je bricole, mais j'ai du mal a avancer ahah et pas de résultat probant

par ex. si je veux obtenir ces données issues de ton script dont je remets le lien en partage :

https://docs.google.com/spreadsheets/d/1QVbpQFu_kS1Q_r6EzY4Ezu6RImQwAICgj4GCD_iob_o/edit?usp=sharing

image

Disons que le script du doc partagé me servirai de boite à outils, et un script simplifié pour prendre juste le tournevis dont j'ai besoins pour travailler

je suppose que je doit changer le debut du script par :

function test() {

  var url = "https://api.realt.community/v1/token"
  var headers = {
    "contentType": "application/json",
    "headers":{"accept": "<*/*>",
    "X-AUTH-REALT-TOKEN": "clé Api a mettre ici"}};

  var endpoint = UrlFetchApp.fetch(url);
  var json = endpoint.getContentText();
  var data = JSON.parse(json);

Bonjour :)

Quand je jvois le script que tu m'as proposé ci-dessus qui expose tout le Json d'un site, et ce script la ci-dessous, ça me semble assez similaire

oui c'est du parsing de json, mais j'essaie toujours d'avoir un script le plus "générique" possible

je regarderai ton post demain dès que j'ai un moment de libre

Bonjour,

j'essaie toujours d'avoir un script le plus "générique" possible

et il me reste utile pour pouvoir sélectionner ce que je souhaite ciblé ! je me le garde dans un doc a part

je regarderai ton post demain dès que j'ai un moment de libre

pas de soucis, rien ne presse, il fait beau, on est dimanche !

pour info j'avais tenté ça avec comme base le script d'au dessus, je me doute que tout n'est pas correct, j'ai juste fait quelques remplacement

function Test() {

  const url = "https://api.realt.community/v1/token";
  const response = UrlFetchApp.fetch(url, {
    "method": "GET",
    "headers": {
      "x-api-key": "ma clé API",
      "Content-Type": "application/json"
    }
  });

  var json = response.getContentText();
  var realtData = JSON.parse(json);
  var output = [];

  for (let i in realtTokenSalesData) {

    var name = realtTokenSalesData.properties[i].name
    var product_id = realtTokenSalesData.properties[i].product_id
    var price = realtTokenSalesData.properties[i].price
    var rent = realtTokenSalesData.properties[i].yield

    output.push([array1[0], pattern1, name, product_id, price, rent]);

  }

  if (output.length > 0) {
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test");
    try {
      sheet.getRange(2, 1, sheet.getLastRow(1000), sheet.getLastColumn(6)).clearContent();
    } catch (e) { }
    sheet.getRange(2, 1, output.length, output[0].length).setValues(output).sort({ column: 6, ascending: false })
  }

  return;

}

[ERREUR : ReferenceError: realtTokenSalesData is not defined]

Bon j'ai tenté le coup avec ces données du script générique :

image

Bonjour,

il faut lui rajouter sa filiation complète, à savoir a minima

realtData.realtTokenSalesData

sachant que

realtData

est bien défini dans ton script

Pour ceux la aussi ?

    var name = realtTokenSalesData.properties[i].name
    var product_id = realtTokenSalesData.properties[i].product_id
    var price = realtTokenSalesData.properties[i].price
    var rent = realtTokenSalesData.properties[i].yield

ou juste lui ?

for (let i in realtData.realtTokenSalesData) {

je n'ai plus de message d'erreur, mais pas de données non plus j'ai du louper un truc !

Pour ceux la aussi ?

pareil pour le resultat après essai

c'est peut-être juste que le liens que j'ai mis ne correspond pas a ma recherche, donc aucunes données, car avec le liens je n'ai pas le même format

image

car je rends compte quand dans le script générique il n'y a pas de liens, tu avais copier le code source du site il me semble

Tu obtiens un json, donc c'est bien ... pour savoir comment l'exploiter, copie en B1 le json dans le couteau suisse suivant :

https://docs.google.com/spreadsheets/d/1JuQHBAqI_Y1jI7N9XPA3yNGJEZDQ7Sf9FgVruji4Tpo/copy

Tu obtiens un json, donc c'est bien

ton couteau suisse correspond bien au document que j'avais partagé

https://docs.google.com/spreadsheets/d/1QVbpQFu_kS1Q_r6EzY4Ezu6RImQwAICgj4GCD_iob_o/edit?usp=sharing

( celui qui avait été fait sur ce sujet )

image

Ce que je voulais dire, c'est que je n'arrive pas a obtenir de résultat avec cette tentative :

function Test() {

  const url = "https://api.realt.community/v1/token";
  const response = UrlFetchApp.fetch(url, {
    "method": "GET",
    "headers": {
      "x-api-key": "ma clé API",
      "Content-Type": "application/json"
    }
  });

  var json = response.getContentText();
  var realtData = JSON.parse(json);
  var output = [];

  for (let i in realtData.realtTokenSalesData) {

    var name = realtTokenSalesData.properties[i].name
    var product_id = realtTokenSalesData.properties[i].product_id
    var price = realtTokenSalesData.properties[i].price
    var rent = realtTokenSalesData.properties[i].yield

    output.push([array1[0], pattern1, name, product_id, price, rent]);

  }

  if (output.length > 0) {
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test");
    try {
      sheet.getRange(2, 1, sheet.getLastRow(1000), sheet.getLastColumn(6)).clearContent();
    } catch (e) { }
    sheet.getRange(2, 1, output.length, output[0].length).setValues(output).sort({ column: 6, ascending: false })
  }

  return;

}

il n'y pas d'erreur lors de l'execution du script, mais pas de données sur ma page " Test"

oups, j'avais oublié ce fichier !!

Essaie plutôt

for (let i in realtData.properties) {

    var name = realtData.properties[i].name
    var product_id = realtData.properties[i].product_id
    var price = realtData.properties[i].price
    var rent = realtData.properties[i].yield

    output.push([name, product_id, price, rent]);

  }

C'est quoi array1[0], pattern1, ?? inconnu ...

En tous cas, ceci sur le fichier que tu m'as renvoyé fonctionne ...

function extraction() {

  var realtData = eval(realtTokenSalesData);

  var output = [];

  for (let i in realtData.properties) {

    var name = realtData.properties[i].name
    var product_id = realtData.properties[i].product_id
    var price = realtData.properties[i].price
    var rent = realtData.properties[i].yield

    output.push([name, product_id, price, rent]);

  }

  if (output.length > 0) {
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test");
    try {
      sheet.getRange(2, 1, sheet.getLastRow(), sheet.getLastColumn(6)).clearContent();
    } catch (e) { }
    sheet.getRange(2, 1, output.length, output[0].length).setValues(output).sort({ column: 4, ascending: false })
  }

  return;

}

Merci !

En tous cas, ceci sur le fichier que tu m'as renvoyé fonctionne ...

Exact ! je voulais effectuer une tentative directement grâce au site

C'est quoi array1[0], pattern1, ??

un "déchet" de l'ancien script que je n'avais pas enlevé

Du coup je n'arrivais pas à obtenir certains éléments, j'ai changé ma façon de faire et je n'obtiens toujours pas tout,

il y a plusieurs niveau sur les données,

var ss = SpreadsheetApp.getActive().getSheetByName("test");

function allRealtProperties() {

  const url = "https://api.realt.community/v1/token";
  const response = UrlFetchApp.fetch(url, {
    "method": "GET",
    "headers": {
      "accept":"<*/*>",
      "x-api-key": "Ma clé API",
      "Content-Type": "application/json"
    }
  });

  var json = response.getContentText();
  var Data = JSON.parse(json);

  for (let i in Data) {

    var shortname = Data[i].shortName
    var tokenPrice = Data[i].tokenPrice
    var annualPercentageYield = Data[i].annualPercentageYield
    var rentStartDate = Data[i].rentStartDate

    ss.appendRow([shortname, tokenPrice, annualPercentageYield, rentStartDate]);

  }
}

et voici les différents niveau des données :

image image image

Ce qui est étonnant c'est que malgré le même niveau de donnée sur mon ex. j'ai des résultats seulement pour "shortname" et "tokenPrice" en exécutant le script ci-dessus

Dois-je changer quelque chose pour obtenir d'autres infos de cette liste ?

Merci !

Essaie

var rentStartDate = Data[i].rentStartDate.date

pour l'autre je ne vois pas sauf s'il existe un niveau 3 sous Data[i].annualPercentageYield

Dans les copies d'écran, qu'indique la colonne D que l'on ne voit pas ?

Bonjour,

Essaie

var rentStartDate = Data[i].rentStartDate.date

TypeError: Cannot read property 'date' of undefined

pour l'autre je ne vois pas sauf s'il existe un niveau 3 sous Data[i].annualPercentageYield

J'ai inclus les autres demandes pour avoir tout les cas de figure, si jamais je veux inclure d'autres niveau dans le script.

Dans les copies d'écran, qu'indique la colonne D que l'on ne voit pas ?

Ce sont les données importées

image



En voici le script responsable que tu as avais fait

var resTable = []; 
var resTree = [];

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('** api.realt.community **')
    .addItem('Charger les données ...', 'getDataJSON')
    .addToUi();
}
function getDataJSON(){
  var url = 'https://api.realt.community/v1/token'
  var ui = SpreadsheetApp.getUi();
  var result = ui.prompt('API KEY !','J\'entre ma clé API :', ui.ButtonSet.OK_CANCEL);
  var apikey = result.getResponseText();
  var headers = {
    "contentType": "application/json",
    "headers":{"accept": "<*/*>",
      "X-AUTH-REALT-TOKEN": apikey}
  };
  var data = JSON.parse(UrlFetchApp.fetch(url,headers).getContentText())

  var table = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('table')
  var xpath = table.getRange(1,1,1,table.getLastColumn()).getValues()
  var json = eval('data')
  if (typeof xpath == 'object'){var liste = xpath.join().split(",")} else {var liste = xpath.split("|")}
  if (json.length){json.forEach(function(elem){getData(elem,liste)})} else {getData(json,liste)}
  table.getDataRange().offset(1,0).clearContent()
  table.getRange(2, 1, resTable.length, resTable[0].length).setValues(resTable)

  var tree = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('tree')
  getAllData(1,eval(data),'data')
  tree.getDataRange().offset(1,0).clearContent()
  tree.getRange(2, 1, resTree.length, resTree[0].length).setValues(resTree)

}
function getData(elem,liste){
  var prov=[]
  liste.forEach(function(chemin){
    var t=chemin.split('/');
    var obj=elem;
    for (var i=1;i<t.length;i++){obj=obj.item(t[i])}
    if(typeof obj=='object'){prov.push('['+obj+']')}else{prov.push(obj)}
  })
  resTable.push(prov)
}
Object.prototype.item=function(i){return this[i]};

function getAllData(niv,obj,id) {
  const regex = new RegExp('[^0-9]+');
  for (let p in obj) {
    var newid = (regex.test(p)) ? id + '.' + p : id + '[' + p + ']';
    if (obj[p]!=null){
      if (typeof obj[p] != 'object' && typeof obj[p] != 'function'){
        resTree.push([niv, (newid), p, obj[p]]);
      }
      if (typeof obj[p] == 'object') {
        if (obj[p].length){
          resTree.push([niv, (newid), p + '[0-' +(obj[p].length-1)+ ']', 'tableau']);
        }else{
          resTree.push([niv, (newid), p, 'parent']);
        }
        niv+=1;
        getAllData(niv, obj[p], newid );
        niv-=1
      }
    }
  }
}  

Quelle est la valeur de la colonne D en face de Data[i].rentStartDate

Y a-t'il des cas où certains indices i mais pas tous n'ont pas de Data[i].rentStartDate, ce qui bloquerait le programme et dans ce cas il faudrait écrire

try{
    var annualPercentageYield = Data[i].annualPercentageYield
}
catch(e){var annualPercentageYield = 'pas trouvé !'}

et pareil pour les autres données éventuelles

Rechercher des sujets similaires à "import api curl via script"