Javascript自定义函数,用于将JSON格式的YQL查询响应导入谷歌电子表格

Javascript Custom Function to import JSON formatted YQL query response into Google spreadsheet

本文关键字:查询 YQL 响应 导入 电子表格 谷歌 格式 自定义函数 用于 JSON Javascript      更新时间:2023-09-26

这里是新手Javascript程序员,可能有点力不从心。我正试图使用Javascript中创建的自定义函数将YQL查询中的JSON格式数据放入Google Drive电子表格中。我不是,重复一遍,不是,填充网页,只是将数据移动到电子表格。

以下是JSON响应(从直接将其写入电子表格单元格的测试函数复制而来):

{"query":{"count":1,"created":"2013-08-29T20:56:58Z","lang":"en-US","results":{"optionsChain":}"expiration":"201312-21","symbol":"HYS","option":[{"symbol":"HYS131221C00103000","type":"C","strikePrice":":"2","openInt":"2"},{"symbol":"HYS131221C00105000","type":"C","strikePrice":,"changeDir":null,"bid":"NaN","ask":"5","vol":type":"C","strikePrice":"107","lastPrice","0.10","change":"0","changeDir":null,"bid":"NaN","ask":,{"symbol":"HYS131221P00100000","type":"P","strikePrice":"100","lastPrice":"0.70","change":"0","changeDir":null,"bid":"NaN","ask":bid":"NaN","ask":"5","vol"::"15","openInt":"15"},{"symbol":"HYS131221P00103000","type":"P","strikePrice":"103","lastPrice":"1.55","change":"bid":"0.3","ask":"5.2","vol":,{"symbol":"HYS131221P00107000","type":"P","strikePrice":"107","lastPrice":"6.50","change":

现在,如果我简单地将上面列出的JSON格式的对象分配给一个变量(即对其进行硬编码),我可以看到名称/值对、提取数据、进行迭代等。但当我将响应直接分配给变量(即实时接收)时,我无法看到或迭代任何内容。例如,可以看到接收变量"o"并将其写入电子表格单元格,但无法看到它的第一个子对象o["query"]。启动查询的函数位于使用它的函数内部,所以我不认为这是时间问题。

好吧,我用一个我不完全理解的解决方案来回答我自己的问题。以下是有效的代码(下面是解释和进一步的问题):

function YQLquery() { // A YQL query returning JSONP with XJSON2CSV function embedded in the response
  var fetchstring1 = "http://query.yahooapis.com/v1/public/yql?"; // constructing YQL query in 4 parts
  var fetchstring2 = "q=SELECT%20*%20FROM%20yahoo.finance.options";
  var fetchstring3 = "%20WHERE%20symbol%3D'HYS'%20AND%20expiration%3D'2013-12'";
  var fetchstring4 = "&format=json&callback=XJSON2CSV&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
  var fetchstring = fetchstring1 + fetchstring2 + fetchstring3 + fetchstring4;  
  return UrlFetchApp.fetch(fetchstring); 
  /* This returns (truncated after first option array item, but you get the point):
  XJSON2CSV({"query":{"count":1,"created":"2013-09-13T21:39:35Z","lang":"en-US",
  "results":{"optionsChain":{"expiration":"2013-12-21","symbol":"HYS","option":
  [{"symbol":"HYS131221C00103000","type":"C","strikePrice":"103","lastPrice":
  "3.00","change":"0","changeDir":null,"bid":"1.65","ask":"2","vol":"NaN","openInt":"2"},{ etc etc*/
}//end of function YQLquery
function XJSON2CSV(YQLQueryResponse) { //converts the YQLquery JSONP response payload (i.e. JSON portion) to CSV string
    var vx = YQLQueryResponse;
    var JSONobj = vx["query"]["results"]["optionsChain"]["option"]; // obtain the option array within JSON
    var CSVLine = [];
    var i = 0;
    var j = "";
    for (var i in JSONobj) {
        CSVLine[i] = []; // gets the JSON array objects
        for (var j in JSONobj[i]){
            CSVLine[i].push(JSONobj[i][j]); // get the name/value pairs from each array object
        }; //end of inner loop
    }; //end of outer loop
   return CSVLine; 
} //end of function XJSON2CSV()
function xxx() //test it
{
  return eval(YQLquery().toString());
}

评论:

1) 与我在最初问题中的假设相反,时间是问题所在。因此,在本例中,我使用了一个回调函数-XJSON2CSV;让YQL在JSONP响应中返回对它的调用(以完整的JSON字符串有效载荷作为参数)。

2) 所有这些都很好——返回的XJSON2CSV调用是一个对象,我需要一个函数。经过相当多的实验,我通过将其转换为字符串并(与所有相反的建议相反)对其进行"eval()-"操作,获得了一个解决方案。

问题:有没有更好的方法来完成最后一步(在函数"xxx"中),而不涉及"eval()"?或者,换一种说法,为什么我不能只使用函数xxx"return QYLquery;"

向安迪道歉,因为他现在还没有回应。