Bonjour !
Je vais vous exposer mon soucis.
Tout d'abord, j'utilise le javascript via la fonction script de Google Spreadsheet afin de récupérer des informations via une API (qui est au format Json). Je précise qu'il s'agit de la première fois que je fais du javascript et que ce n'est que la première étape du travail. Google bridant trop les possibilités de requêtes / invocation de script, je souhaite, plus tard, quand le tout sera opérationnel, switch sur mon petit serveur pour faire ma propre page web et ainsi, ne plus être bridé sur le nombre de requêtes.
J'ai environ une centaine de lignes de code qui fonctionnent très bien via cette dite API... sauf une ! Le problème se pose via ma fonction qui me permet de récupérer le champ "name" de l'API via une ID.
Voici la fonction qui marche et ses annotations de tout ce que j'ai pu comprendre au fur et à mesure de mes recherches:
Ici, il n'y a pas de problème sur la fonction, elle récupère bel et bien le "nom" de l'objet via son ID. Le problème ? Ce n'est pas cette API (car non-officielle et bridé sur le nombre de requêtes possible) que je souhaite utiliser. Donc j'ai juste changer le lien qui ramène à la bonne API:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 function getItemName(itemID) { //Ici l'url qui me ramène au json selon l'ID rentré dans le tableau var myUrl = "http://www.gw2spidy.com/api/v0.9/json/item/" + escape(itemID); //Extraction des informations de l'url en HTTPresponse var jsonData = UrlFetchApp.fetch(myUrl); //Conversion des informations en une chaîne de caractères var jsonString = jsonData.getContentText(); //Pour faciliter sa manipulation, appelle sur le paramètre de l'objet - json.parse permet de traduire une chaîne en objet var jsonObject = JSON.parse(jsonString).result; //Là on précise qu'on veut la valeur "name" de l'objet var name = (jsonObject.name); Utilities.sleep(2000); return name; }
Problème ? le script Google ne récupère rien, si j'utilise cette fonction, je me retrouve avec écris dans ma petite case du tableau: "ERROR: impossible de lire la propriété "name" depuis undefined ligne 17 (ligne qui rapporte à ma variable " var name = (jsonObject.name);").
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 function getItemName(itemID) { var myUrl = "https://api.guildwars2.com/v2/items/" + escape(itemID); var jsonData = UrlFetchApp.fetch(myUrl); var jsonString = jsonData.getContentText(); var jsonObject = JSON.parse(jsonString).result; var name = (jsonObject.name); Utilities.sleep(2000); return name; }
Du coup j'ai tenté la fonction en retirant le jsonObject afin de voir si, au moins, le script pouvait me récupérer et lire le json:
Ici, je me retrouve avec la totalité du tableau json en une seule case vu le retour directement sur le jsonString donc j'en ai déduit que le le corps de la fonction et les variables précédentes fonctionnaient bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 function getItemName(itemID) { var myUrl = "https://api.guildwars2.com/v2/items/" + escape(itemID); var jsonData = UrlFetchApp.fetch(myUrl); var jsonString = jsonData.getContentText(); return jsonString; }
J'ai alors essayé de définir le "undefined" avec "typeof" (ce que j'ai trouvé sur le net: apprendre à lire l'erreur tel qu'elle est donnée, ici le script lit vraiment undefined sur la propriété "name")
Là, je me retrouve avec une case toute vide...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 function getItemName(itemID) { var myUrl = "http://api.guildwars2.com/v2/items/" + escape(itemID); var jsonData = UrlFetchApp.fetch(myUrl); var jsonString = jsonData.getContentText(); var JsonObject = JSON.parse(jsonString).result; var name = JsonObject if ((typeof name === "undefined")) { JsonObject = JSON.parse(jsonString).result; } Utilities.sleep(2000); return name; }}
J'ai essayé de définir le jsonObject en utilisant la propriété "lenght" mais là, si j'ai bien compris, on donne, via cette propriété, le nombre de caractère de la chaîne. Problème, ici, c'est aléatoire donc je ne peux pas la définir puisque qu'un ID va rapporter à un certain nombre de caractère, puis avec une autre ID, je vais me retrouver avec un autre nombre de caractère puisque ça ne sera pas le même objet.
Comme j'ai pas mal campé les recherches google, tutoriels et j'en passe (ça fait environ 1 mois que je bloque là dessus), j'ai commencé à comprendre pas mal de choses même si j'ai encore un manque de lexique certain... Les 3/4 de mes recherches Google m'ont amené à des gens qui avaient des soucis pour retranscrire du javascript en json... Mais moi, c'est l'inverse que je veux
Pour preuve, toutes les autres fonctions marchent, et elles utilisent toutes l'API que je veux. Mais je n'arrive toujours pas à comprendre pourquoi ma fonction ne veut pas me récupérer la valeur "name" du json officiel, alors que la même fonction via une autre API (non officiel) fonctionne très bien (soit juste un changement d'URL !).
J'ai utilise cette même fonction, pour d'autres informations, ça marche nickel. Par exemple, récupérer un prix de vente ou d'achat:
J'utilise la bonne API, toujours du json et la fonction extrait l'information que je souhaite via l'ID d'un objet !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 function getSellValue(itemID) { var myUrl = "https://api.guildwars2.com/v2/commerce/listings/" + escape(itemID); var jsonData = UrlFetchApp.fetch(myUrl); var jsonString = jsonData.getContentText(); var jsonObject = JSON.parse(jsonString); if (jsonObject.sells.length === 0) { return 0; } var adjustedValue = (jsonObject.sells[0].unit_price ); Utilities.sleep(2000); return adjustedValue; }
Voici un lien de l'API officiel en état "brut" format json. Et la non officiel sur ce lien. Dans les 2 cas, j'utilise la même ID pour comparer. La seule différence est que sur la non officiel on trouve " "result":{"data_id":20176, " en plus par rapport à l'autre, sinon, le reste, c'est pareil. Est-ce que le problème vient de là ?
Alors hum, si une âme charitable arrive à me corriger, j'en serai ravie En espèrant qu'il y ait toutes les informations nécessaires
Partager