将Google可视化查询结果转换为javascript数组

将Google可视化查询结果转换为javascript数组,javascript,arrays,google-visualization,google-query-language,Javascript,Arrays,Google Visualization,Google Query Language,我正在查询的电子表格的url是 docs.google.com/spreadsheets/d/1EIBhBQY1zbdBEKXsJIY1uyvdQw0b1cIBSrBE_tZvA6Y/edit?usp=sharing 正在使用的查询url为 https://spreadsheets.google.com/tq?tqx=out:&key=1EIBhBQY1zbdBEKXsJIY1uyvdQw0b1cIBSrBE_tZvA6Y&gid=0&headers=1&tq

我正在查询的电子表格的url是

docs.google.com/spreadsheets/d/1EIBhBQY1zbdBEKXsJIY1uyvdQw0b1cIBSrBE_tZvA6Y/edit?usp=sharing

正在使用的查询url为

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]
我需要能够在一个点上操作数据,并将新数据添加到可视化中


来自多个查询之一的数据-->转换为数组-->操作数据例如:乘以一个输入-->Data.addRows(操作输入)

您的查询确实返回一个包含包装在函数调用中的JSON的字符串:

var responseText = 'google.visualization.Query.setResponse({…});';
这是因为您指定了
out:
作为
tqx
的参数(请参阅)

如果您希望所有内容都是原始的,那么可以将多个查询的JSON和数据提取并解析到一个数组中,从而得到一个行数据数组。对于单个查询,可以从以下内容开始:

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]]

有一个更直接的解决方案。您在响应中得到的是一个JSONP字符串,其数据保存在回调函数中,正如@dakab所提到的

除此之外,最近谷歌在回复中加入了一些额外的文本,以帮助对其API提供一些反内容嗅探保护。您可以在中阅读更多关于此的信息。您现在得到的响应是以下形式的不可解析字符串:

/*O_o*/
google.visualization.Query.setResponse({…});
处理这两个问题(注释字符串和隐藏在回调函数中的数据)的一种方法是对函数求值这是否有风险是JSONP格式的固有特性,因此您必须知道您的响应来自何处,并决定是否值得冒险。但是,考虑到它来自对Google服务器的请求,并且在解析方面,它是有效的

因此,在您的例子中,您可以做的只是声明回调函数(请注意,您可以在查询字符串中传递自己的函数名,如中所述),然后对其求值。我得到了灵感:

在“result”中,您将得到一个已解析的JSON,您可以将其转换为任何您想要的格式。

根据,您可以在请求中添加一个标头,该标头将返回JSON,而不带函数或注释

如果在请求中添加名为
X-DataSource-Auth
的头,可视化API将以JSON格式而不是JSONP格式响应,JSONP格式是响应的默认格式,并包含封装在函数处理程序中的JSON

然而,即使存在这个头,API也会在响应前面加上一个奇怪的字符串:
)]}
,我认为这与@Diego提到的反内容嗅探有关。好的,谷歌-即使有OAuth令牌,你真的需要这么做吗

因此,要获得该响应中的实际JSON,您可以使用以下Javascript绕过它。假设
responseBody
是API实际返回给您的内容,并且
data
正在存储您想要的JSON

var data = JSON.parse(responseBody.replace(/^\)]\}'\n/, ''));

假设
str
是返回的JSONP格式响应:

var str=`/*O\u O*/
google.visualization.Query.setResponse({“版本”:“0.6”,“reqId”:“0”,“状态”:“ok”,“sig”:“403123069”,“表格”:{“cols”:[{“id”:“A”,“标签”:“时间戳”,“类型”:“datetime”,“模式”:“dd/MM/yyyy HH:MM:ss”},{“id”:“B”,“标签”:“AskGod搜索查询”,“类型”:“字符串”},“行”:[{“c”:[{“v”:“日期(2020,9,25,12,30,5)”,“f”:“10/2020:12:30”{“parsedNumHeaders”:1})`

console.log(JSON.parse(str.match)(/)除了URL查询之外,您还尝试过任何实际的JavaScript代码吗?是的,我目前正在使用一个查询进行可视化,但我正在尝试添加行-addRows();只允许数组进行额外的数据输入-我正在尝试为单个可视化添加来自多个查询的数据
var data = JSON.parse(responseBody.replace(/^\)]\}'\n/, ''));