[API] importation Selective ==> Totale

Bonjour,

Jusqu'à présent j'utilisais des données API en fonction de ce que je voulais sur mon sheet avec ce script

function API() {

  var urlAPI = "https://api.realt.community/v1/token";
  var classeurAPI = SpreadsheetApp.getActiveSpreadsheet();
  var feuilleAPI = classeurAPI.getSheetByName('API1');
  var response = UrlFetchApp.fetch(urlAPI, {
    "method": "GET",
    "headers": {
      "accept":"<*/*>",
      "X-AUTH-REALT-TOKEN": "____Ma clé API______",
      "Content-Type": "application/json"
    }
  });

  var output = [];
  var json = response.getContentText();
  var Data = JSON.parse(json);
  for (let i in Data) { 

    var xDaiContract = Data[i].blockchainAddresses.xDai.contract
    var ethereumContract = Data[i].blockchainAddresses.ethereum.contract
    var fullname = Data[i].fullName

  output.push([fullname, xDaiContract, ethereumContract]);  
  }
  if (output.length > 0) {
    feuilleAPI.getRange(2, 1, output.length, output[0].length).setValues(output);
  }
}

avec ce résultat

image

j'ai toujours fais comme ça ! et je me demande les modifications à apporter sur le script pour avoir tout d'un coup.

mes premiers résultats n'ont pas été convaincant…

image

ça manque clairement de structuration

Merci !

Tu veux la totale ? ensuite tu iras à la pèche :

mets =API2() dans une cellule

function API2() {
  var urlAPI = "https://api.realt.community/v1/token";
  var classeurAPI = SpreadsheetApp.getActiveSpreadsheet();
  var feuilleAPI = classeurAPI.getSheetByName('API1');
  var response = UrlFetchApp.fetch(urlAPI, {
    "method": "GET",
    "headers": {
      "accept":"<*/*>",
      "X-AUTH-REALT-TOKEN": "############################",
      "Content-Type": "application/json"
    }
  });

  var output = [];
  var json = response.getContentText();
  var data = JSON.parse(json);
  recursion(data)
  function recursion(obj, path) {
    if (path == undefined) { path = 'data' }
    const regex = new RegExp('[^0-9]+');
    for (let p in obj) {
      let newPath = (regex.test(p)) ? path + '.' + p : path + '[' + p + ']';
      if (obj[p] != null) {
        if (typeof obj[p] != 'object' && typeof obj[p] != 'function') {
          output.push([newPath, p, obj[p]]);
        }
        if (typeof obj[p] == 'object') {
          recursion(obj[p], newPath);
        }
      }
    }
  }
  return output
}

Tu veux la totale ? ensuite tu iras à la pèche :

Oui C'est le but !

il y a souvent des ajouts et ça m'évite de m'éparpiller

Ce script est top, en revanche je vais faire le difficile...

je pensais pouvoir conserver le format en colonnes comme c'est le cas actuellement

PS : je vais garder celui-ci qui est rapidement utilisable pour avoir la dénomination des nouveaux éléments ( 1ere colonne )

Tu veux la totale ? ensuite tu iras à la pèche :

Oui C'est le but !

je vais faire le difficile...je pensais pouvoir conserver le format en colonnes comme c'est le cas actuellement

avec un json, on ne sait pas toujours où l'on va, la façon la plus souple est d'abord de faire l'inventaire à la prévert, après on peut composer, mais remarque qu'il y a des dépendances multiples d'un item

ça va simplement complexifier mes recherches et mes autres tableaux mais si c'est le mieux je vais adapter ! merci !

je me demande comment les extensions google sheet pour les API gèrent les importations. car j'arrive a obtenir un tableau avec les en-tetes etc..

mais bon... j'aime pas les extensions... du jour au lendemain ça disparait ou ça devient payant !

Donc voici le complet en tableau, maintenant qu'on sait que la structure du niveau 1 est un array ...

Mettre =API2bis() dans une cellule

function API2bis() {
  var urlAPI = "https://api.realt.community/v1/token";
  var response = UrlFetchApp.fetch(urlAPI, {
    "method": "GET",
    "headers": {
      "accept":"<*/*>",
      "X-AUTH-REALT-TOKEN": "###########################",
      "Content-Type": "application/json"
    }
  });
  var json = response.getContentText();
  var obj = JSON.parse(json);
  const header = Object.keys(obj[0]);
  return [header, ...obj.map(o => header.map(h => Array.isArray(o[h]) ? o[h].join("\n") : o[h]))];
}

si le niveau 2 de données ne t'intéresse pas, tu peux remplacer la dernière ligne par

return [header, ...obj.map(o => header.map(h => Array.isArray(o[h]) ? '#multiple' : o[h]))];

Cela ne fonctionnera que si tous les items ont strictement la même structure

Merci ! C'est top !

Rechercher des sujets similaires à "api importation selective totale"