将Google Visualization Query结果转换为javascript数组

时间:2015-08-01 20:11:33

标签: javascript arrays google-visualization google-query-language

我要查询的电子表格的网址是

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(操纵输入);

4 个答案:

答案 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]))