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 ?
- 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
- 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
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
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
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 :
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
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 )
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 :
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
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