Import API (cURL) via un script ?

Bonjour,

actuellement pour importer des API, j'utilise l'extension "API CONNECTOR", je suis limité en nombre d'importation.

avez vous des scripts pour remplacer celui-ci ? ( utilisation basique, et je ferais un bouton sur mon spreadsheet pour actualiser en cliquant dessus )

merci !

Bonjour,

Quels types de données tu souhaites récupérer ? A part des sites où il faut s'identifier, je n'ai jamais eu de soucis et je pense même que dans certains cas je suis plus performant ... cf yahoo finance par exemple où les données sont dans un big json logé dans un script. En général les API donnent des données au format json et je suis paré sur ce point.

Bonjour,

je souhaite récupérer des données du site pour lequel je construit mon Dashboard ( résultat de tout mes sujets ici :D ) et pour avoir l'API complète j'ai des identifiants en effet.

voici le "request URL" mais les données ne sont pas complète sans identifications API, et j'ai un Curl pour celui-ci ( version complète ).

et ensuite pour ne pas détailler, j'utilise des API construit a partir de ce site, selon ce que je souhaite Site API 2 ( ça me génère également des Curl )

Dans l'immédiat je peux utiliser des modules sur Sheet, mais j'aimerai savoir comment faire autrement si jamais ces modules disparaissent pour x raison.

Merci

voici le "request URL" mais les données ne sont pas complète sans identifications API, et j'ai un Curl pour celui-ci ( version complète ).

ce que je sais faire, c'est ceci pour une première approche, si A1 est l'url alors il suffit de mettre la fonction =getAllDataJSON(A1)

let resultat = []; 

/**
 * Permet d'explorer un json.
 * Retourne niveau / id / attribut ou objet / valeur 
 *
 * @param {texte ou cellule} url url du site hébergeant le json ou cellule de la feuille contenant le json
 * @customfunction
 */
function getAllDataJSON(url) {
  if (url.match(/http(s)?:\/\/?/g)){var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())}
  else{var data = JSON.parse(url)}
  getAllData(1,eval(data),'data')
  return resultat
}
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'){
        resultat.push([niv, (newid), p, obj[p]]);
      }
      if (typeof obj[p] == 'object') {
        if (obj[p].length){
          resultat.push([niv, (newid), p + '[0-' +(obj[p].length-1)+ ']', 'tableau']);
        }else{
          //resultat.push([niv, (newid), p, 'parent']);
        }
        niv+=1;
        getAllData(niv, obj[p], newid );
        niv-=1
      }
    }
  }
}  

une fois la connaissance de la structure, j'applique query, filter, ou bien je fais un script plus simple et approprié comme ici https://stackoverflow.com/questions/68208068/call-api-in-google-scripts-to-populate-in-google-sheets...

image

mais je ne sais pas gérer les identifiants !!

pas de soucis, merci ! je vais continuer mes recherches. Pour le moment ce n'est pas "urgent"

A bientôt :)

hop hop hop hop hop, je dis des bêtises, je suppose que l'interrogation se fait par la méthode post, alors c'est faisable

hop hop hop hop hop, je dis des bêtises, je suppose que l'interrogation se fait par la méthode post, alors c'est faisable

lorsque je rentre mon Curl dans le module, je suis redirigé vers cette fenêtre qui s'auto-rempli

capture

Bonjour !

function myFunction() {
   var url = "https://api.realt.community/v1/token";
  var headers = {
             "contentType": "application/json",
             "headers":{"accept": "<*/*>",
                        "X-AUTH-REALT-TOKEN": "Clé privé"}
                        };

  var response = UrlFetchApp.fetch(url, headers);
  var text = response.getResponseCode();
  Logger.log(text);
}

j'ai trouvé cette fonction, comment puis-je l'adapter si elle correspond a ma demande ? ( si elle est correct )

j'ai ce retour lorsque j'active le script.

capture

Merci

Intéressant ... dans ce cas, en aveugle, non testé car je n'ai pas de clé :

let resultat = []; 
function getAllDataJSON() {
  var url = "https://api.realt.community/v1/token";
  var headers = {
    "contentType": "application/json",
    "headers":{"accept": "<*/*>",
      "X-AUTH-REALT-TOKEN": "Clé privé"}
    };
  var data = JSON.parse(UrlFetchApp.fetch(url, headers).getContentText())
  getAllData(1,eval(data),'data')
  return resultat
}
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'){
        resultat.push([niv, (newid), p, obj[p]]);
      }
      if (typeof obj[p] == 'object') {
        if (obj[p].length){
          resultat.push([niv, (newid), p + '[0-' +(obj[p].length-1)+ ']', 'tableau']);
        }else{
          //resultat.push([niv, (newid), p, 'parent']);
        }
        niv+=1;
        getAllData(niv, obj[p], newid );
        niv-=1
      }
    }
  }
}  

et mets en A1

=getAllDataJSON()
tu me donneras une copie d'écran ...

j'ai transmis en Mp, ça me semble pas si mal, on s'approche de l'API reel. il manque juste un petit "transpose" je pense

j'ai transmis en Mp, ça me semble pas si mal, on s'approche de l'API reel. il manque juste un petit "transpose" je pense

normal, c'est un programme que j'ai développé juste pour voir la structure du json (le programme disponible sur gitbuh est une véritable usine à gaz) ... et parfois avec des query en tirer les infos pertinentes

mais un transpose sur 10.000 lignes ferait 10.000 colonnes, je pense qu'il faut exploiter plutôt les arrays pour en tirer un tableau, je vais regarder

j'étais en train d'écrire cette suggestion lorsque j'ai vu ton Mp

effectivement, je peux faire une liste des données dont je me sert.

(je vais les sélectionner directement dans le doc )

capture

In fine, j'ai repris un programme que j'avais fait en début d'année ...

let resultat = []; 
function getDataJSON(url,apikey,xpath,tableau){
  try{
    var headers = {
      "contentType": "application/json",
      "headers":{"accept": "<*/*>",
        "X-AUTH-REALT-TOKEN": apikey}
    };
    var data = JSON.parse(UrlFetchApp.fetch(url,headers).getContentText())
    var json = eval('data'+tableau.replace(/\//gm,"\."))
    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)}
    return resultat
  }
  catch(e) {
    return ('Pas de résultat - vérifier l\'url et les paramètres !');
  }
}
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)}
  })
  resultat.push(prov)
}
Object.prototype.item=function(i){return this[i]};

mets ta clé en A2 dans ce fichier ...

j'y ai mis toutes les informations de niveau 2, s'il y en a en trop, supprime les colonnes en question,.

Oh parfait merci ! du coup j'ai 2 questions pour me rendre autonome.

1) je suppose que cela lance un appel API a chaque ouverture du Sheets ? un moyen de maitriser cela ?

2) je vais conserver ton 1er script pour avoir les données complètes de l'API ( en cas de nouveauté ); et donc comment personnalisé ton script pour avoir tel ou tel données ? ( rajout manuel en tète de colonnes ? )

merci encore !

je suppose que cela lance un appel API a chaque ouverture du Sheets ? un moyen de maitriser cela ?

en effet, dans les 2 cas, mais oui on peut le contourner, je regarde

Reprends une copie en mettant ta clé dans le script (voir en bleu ci-dessous)

image
var resultat = []; 
var url = 'https://api.realt.community/v1/token'
var apikey = ""
var feuille = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var xpath = feuille.getRange(1,1,1,feuille.getLastColumn()).getValues()
var tableau = ''

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('** api.realt.community **')
    .addItem('Charger les données ...', 'getDataJSON')
    .addToUi();
}
function getDataJSON(){
    var headers = {
      "contentType": "application/json",
      "headers":{"accept": "<*/*>",
        "X-AUTH-REALT-TOKEN": apikey}
    };
    var data = JSON.parse(UrlFetchApp.fetch(url,headers).getContentText())
    var json = eval('data'+tableau.replace(/\//gm,"\."))
    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)}
    feuille.getDataRange().offset(1,0).clearContent()
    feuille.getRange(2, 1, resultat.length, resultat[0].length).setValues(resultat)
}
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)}
  })
  resultat.push(prov)
}
Object.prototype.item=function(i){return this[i]};

Ce 1er point est okay ! impeccable :) merci

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.

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.

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.

interressant, comme ça je verrais si je peux ensuite adapter avec les autres API de mon doc :) a voir comment ça se goupille

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