我要查询的电子表格的网址是
docs.google.com/spreadsheets/d/1EIBhBQY1zbdBEKXsJIY1uyvdQw0b1cIBSrBE_tZvA6Y/edit?usp=sharing
正在使用的查询网址是
https://spreadsheets.google.com/tq?tqx=out:&key=1EIBhBQY1zbdBEKXsJIY1uyvdQw0b1cIBSrBE_tZvA6Y&gid=0&headers=1&tq=select%20B%2CC%2CD%20where%20(A%20matches%20%22DIS%22)
有没有办法将此结果转换或存储在JavaScript数组中?
var dis = ["The Walt Disney Company","Entertainment",.1]
我需要能够在一个点处操纵数据并将新数据添加到可视化中。
来自多个查询之一的数据 - >转换为数组 - >处理数据 ex: 乘以 输入 - > data.addRows(操纵输入);
答案 0 :(得分:3)
您的查询确实返回包含函数调用中包含的JSON的字符串:
var responseText = 'google.visualization.Query.setResponse({…});';
这是因为您将out:
指定为tqx
的参数(请参阅Google Developers guides)。
如果您希望它全部是原始的,您可以提取并解析多个查询的JSON并将数据push
解析为数组,因此最终会得到一组行数据数组。对于您的单个查询,您可以从以下内容开始:
responseJSON = JSON.parse(
responseText.replace(/(^google\.visualization\.Query\.setResponse\(|\);$)/g,'')
);
var rowsArray = [];
responseJSON.table.rows.forEach(function(row){
var rowArray = [];
row.c.forEach(function(prop){ rowArray.push(prop.v); });
rowsArray.push(rowArray);
});
console.log(rowsArray); // === [["The Walt Disney Company", "Entertainment", 0.1]]
答案 1 :(得分:0)
有一个更简单的解决方案。你在响应中得到的是一个JSONP字符串,其数据保存在回调函数中,就像@dakab所提到的那样。
除此之外,最近谷歌在回复中加入了一些额外的文字,以帮助对其API进行一些反内容嗅探保护。您可以在this Github thread中详细了解相关信息。您现在得到的响应是这种形式的不可解析字符串:
/*O_o*/
google.visualization.Query.setResponse({…});
处理这两个问题的一种方法("注释"字符串和隐藏在回调函数中的数据)是评估函数。 这是否存在风险是JSONP格式所固有的,因此您必须了解您的响应来自哪里,并确定它是否值得冒风险。但是,考虑到它来自对Google服务器的请求,并且在解析方面,它可以工作。
因此,在您的情况下,您可以做的只是声明回调函数(请注意,您可以在查询字符串中传递您自己的函数名称,如Google Developers guides中所述),然后对其进行评估。我从on this thread获取灵感:
//Declare your call back function
function callback(data){
return data;
}
//Evaluate and store the data in your callback function
var result = eval(UrlFetchApp.fetch(url + uri, options).getContentText());
"结果"您将拥有一个已经解析过的JSON,您可以将其转换为您想要的任何内容。
答案 2 :(得分:0)
根据Google's documentation on their Visualization API for response formats,您可以在请求中添加标头,该标头将返回不带函数或注释的JSON。
如果在请求中添加名为Win + 2
的标头,则Visualization API将以JSON格式而不是JSONP格式进行响应,JSONP格式是响应的默认格式,其中包括包装在函数处理程序中的JSON。
但是,即使存在此标头,API也会在响应前加上一个奇怪的字符串:X-DataSource-Auth
,我认为这与@Diego提到的反内容嗅探有关。好的,谷歌-即使您拥有OAuth令牌,您真的需要这样做吗?
因此,要获得该响应中的实际JSON,您可以使用以下Javascript来解决它。假设)]}'
是API实际返回给您的内容,并且responseBody
正在存储您想要的JSON。
data
答案 3 :(得分:0)
假设str
是返回的JSONP格式的响应:
var str = `/*O_o*/
google.visualization.Query.setResponse({"version":"0.6","reqId":"0","status":"ok","sig":"403123069","table":{"cols":[{"id":"A","label":"Timestamp","type":"datetime","pattern":"dd/MM/yyyy HH:mm:ss"},{"id":"B","label":"AskGod Search Query","type":"string"}],"rows":[{"c":[{"v":"Date(2020,9,25,12,30,5)","f":"25/10/2020 12:30:05"},{"v":"لا أعرف لماذا"}]}],"parsedNumHeaders":1}});`
console.log(JSON.parse(str.match(/(?<=.*\().*(?=\);)/s)[0]))