Javascript自定义函数,用于将JSON格式的YQL查询响应导入谷歌电子表格
Javascript Custom Function to import JSON formatted YQL query response into Google spreadsheet
这里是新手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;"
向安迪道歉,因为他现在还没有回应。
- 内部分区字体大小获胜'调整浏览器窗口大小时不会随媒体查询而更改
- j查询utc offSets的时差
- 如何有效地将游戏数据存储在URL查询字符串中
- 如何处理node.js节点mongodb中的连接和查询队列
- 如何从 HTML 查询中删除项目
- 从查询字符串参数推断出正确的数据类型
- 将curl查询转换为jQuery.ajax()
- 触发媒体查询断点时刷新页面
- 使用DynamoDB查询返回
- 当查询不在displayField中时,引导Ajax Typeahead不显示结果
- 如何将PHP get查询转换为Meteor's HTTP.get()
- AngularJS:获取链接中没有哈希的查询字符串值
- 捕获初始RedQueryBuilder查询中的SQL问题
- 带有 gFlags 的 Yahoo YQL 查询不返回任何内容
- Javascript自定义函数,用于将JSON格式的YQL查询响应导入谷歌电子表格
- 在YQL查询中没有结果
- 查找要查询当前时间的YQL表
- YQL不按照文档顺序返回带有联合操作符(a|b)的xpath选择查询
- 对ajax动态加载的html页面进行YQL查询
- 问:我如何添加一个javascript变量到yql查询