1
votes

Besoin de rechercher la sortie d'API au format JSON pour la valeur et d'imprimer tout le contenu du tableau

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.


1 commentaires

Vous exécutez cela dans Apps Script, n'est-ce pas? Pourquoi est-ce étiqueté node.js ?


3 Réponses :


1
votes

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")


0 commentaires

1
votes

É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.


0 commentaires

0
votes

Si je vous ai bien compris, vous souhaitez créer une fonction personnalisée qui:

  • Acceptez une url , un xpath et une date comme paramètre.
  • Appelez IMPORTJSON et transmettez les url et xpath précédents comme paramètres.
  • Dans le JSON renvoyé par IMPORTJSON , recherchez l'élément dans historicDCF dont la date correspond à celle passée en paramètre.
  • Renvoie son 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;
}

Notes:

  • Les méthodes comme 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.
  • Vous pouvez également modifier 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.


0 commentaires