J'ai des fonctions googlesheets qui analysent json et importent dans des feuilles, vous pouvez trouver le code de la fonction dans le fichier ImportJson.
=IMPORTJSON("https://financialmodelingprep.com/api/v3/company/historical-discounted-cash-flow/AAPL?period=quarter","historicalDCF/0/DCF")
Les fonctions sont assez simples et explicites. Divulgation J'ai obtenu cette fonction d'ici. " https://www.youtube.com/watch?v=EXKhVQU37WM "
J'avais des exigences supplémentaires que cette fonction ne peut pas faire. Besoin de rechercher la sortie de l'API au format JSON pour la valeur et d'imprimer tout le contenu du tableau.
Par exemple, j'avais une sortie JSON comme ci-dessous.
{ "symbol" : "AAPL", "historicalDCF" : [ { "date" : "2019-03-30", "Stock Price" : 190.5064, "DCF" : 199.51439324614452 }, { "date" : "2018-12-29", "Stock Price" : 156.4638, "DCF" : 165.25974241335186 }, { "date" : "2018-09-29", "Stock Price" : 224.6375, "DCF" : 233.0488839004929 }, { "date" : "2018-06-30", "Stock Price" : 184.3734, "DCF" : 192.36145120758877 }, { "date" : "2018-03-31", "Stock Price" : 163.5502, "DCF" : 172.0839412239145 }, { "date" : "2017-12-30", "Stock Price" : 168.339, "DCF" : 178.05212237708827 }, { "date" : "2017-09-30", "Stock Price" : 149.7705, "DCF" : 160.23613044781487 }, { "date" : "2017-07-01", "Stock Price" : 139.1847, "DCF" : 150.3852802404117 }, { "date" : "2017-04-01", "Stock Price" : 138.8057, "DCF" : 148.7456306248566 }, { "date" : "2016-12-31", "Stock Price" : 111.7097, "DCF" : 120.02897160465633 }, { "date" : "2016-09-24", "Stock Price" : 108.0101, "DCF" : 116.70616209306208 } ] }
Vous pouvez vérifiez également la version en direct de cette API sur ce lien " https://financialmodelingprep.com/api/v3/company/historical-discounted-cash-flow/AAPL?period=quarter "
Pour obtenir la valeur DCF le" 2019-03- 30 ", je peux simplement utiliser des fonctions comme celle-ci:
function IMPORTJSON(url,xpath){ try{ // /rates/EUR var res = UrlFetchApp.fetch(url); var content = res.getContentText(); var json = JSON.parse(content); var patharray = xpath.split("/"); //Logger.log(patharray); for(var i=0;i<patharray.length;i++){ json = json[patharray[i]]; } //Logger.log(typeof(json)); if(typeof(json) === "undefined"){ return "Node Not Available"; } else if(typeof(json) === "object"){ var tempArr = []; for(var obj in json){ tempArr.push([obj,json[obj]]); } return tempArr; } else if(typeof(json) !== "object") { return json; } } catch(err){ return "Error getting data"; } }
Que faire si j'ai besoin de rechercher par date et d'obtenir la valeur du cours de l'action? Par exemple, j'ai besoin d'obtenir la valeur du cours de l'action et du DCF à cette date "2017-09-30". Comment pourrais-je le faire sans connaître la position du tableau?
Pour cela, j'ai besoin d'aide soit en créant une nouvelle fonction, soit en modifiant une fonction existante pour obtenir cette fonctionnalité.
L'aide est très appréciée et merci d'avance à tous les gourous là-bas.
3 Réponses :
json.historicalDCF.filter ((el) => el.date === "2017-07-01") renverra l'objet qui correspond à cette date.
Vous pourriez obtenir le retour comme: p >
function findByDate(dateParam) { return json.historicalDCF.filter((el) => el.date === dateParam) } var theInfoIWantVariable = findByDate("2017-1-1-make-sure-this-is-a-string")
Étant donné que votre fonction IMPORT renvoie un objet JSON (et en supposant que le format est ce que vous avez montré dans votre message), vous pouvez simplement utiliser une fonction javascript filter ()
régulière pour obtenir la date précise souhaitée:
const data =IMPORTJSON("https://financialmodelingprep.com/api/v3/company/historical-discounted-cash-flow/AAPL?period=quarter","historicalDCF"); // now, data is the JSON array containing the historical data. All the data. We can filter it for whatever we want. const myOneDayRecord = data.find( record => record.date === '2016-03-30' ); // so the variable myOneDayRecord is the specific record by date we wanted. Now we can use it as a normal javascript object. console.log(`So on ${myOneDayRecord.date}, the stock price was ${myOneDayRecord["Stock Price"] } and the DCF was ${myOneDayRecord.DCF}`); // note that, in the above line,I had to use bracket notation to get to the 'Stock Price' property. That's because of the space in the property name.
Si je vous ai bien compris, vous souhaitez créer une fonction personnalisée qui:
url
, un xpath
et une date
comme paramètre. IMPORTJSON
et transmettez les url
et xpath
précédents comme paramètres. IMPORTJSON
, recherchez l'élément dans historicDCF
dont la date
correspond à celle passée en paramètre. cours de l'action
correspondant. Si tout ce qui précède est correct, alors vous pouvez faire quelque chose comme suit:
=GETSTOCKPRICE("https://financialmodelingprep.com/api/v3/company/historical-discounted-cash-flow/AAPL?period=quarter", "historicalDCF/0/DCF", "2017-09-30")
Et puis, vous pouvez utiliser cette fonction dans votre feuille en lui passant les paramètres corrects. Par exemple, si vous souhaitez obtenir le cours de l'action correspondant à 2017-09-30
:
function GETSTOCKPRICE(url, xpath, date) { var jsonData = IMPORTJSON(url,xpath); var historical = jsonData["historicalDCF"]; var stockPrice; for (var i = 0; i < historical.length; i++) { if (historical[i]["date"] === date) { stockPrice = historical[i]["Stock Price"]; break; } } return stockPrice; }
filter
ou find
, les fonctions fléchées et les déclarations comme const
ne fonctionneront pas ici, car Apps Script ne prend actuellement pas en charge ES6. GETSTOCKPRICE
afin qu'il n'accepte que date
comme paramètre, et que l'appel à IMPORTJSON
ait ses paramètres codés en dur (cela aurait du sens si vous allez toujours utiliser IMPORTJSON
pour cette url
et xpath
). Mais c'est à vous de décider. J'espère que cela vous sera utile.
Vous exécutez cela dans Apps Script, n'est-ce pas? Pourquoi est-ce étiqueté
node.js
?