2

我正在查询的电子表格的网址是

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]

我需要能够在某一时刻操作数据并将新数据添加到可视化中。

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

4

4 回答 4

4

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

var responseText = 'google.visualization.Query.setResponse({…});';

这是因为您指定out:了 for 的参数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]]
于 2015-08-01T21:37:53.803 回答
1

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

除此之外,最近 Google 在响应中包含了一些额外的文本,以帮助对其 API 进行一些反内容嗅探保护。您可以在这个 Github 线程中阅读更多相关信息。您现在得到的响应是一个无法解析的字符串,格式如下:

/*O_o*/
google.visualization.Query.setResponse({…});

处理这两个问题(“注释”字符串和隐藏在回调函数中的数据)的一种方法是评估函数。这是否有风险是 JSONP 格式固有的,因此您必须了解您的响应来自何处并决定是否值得冒险。但是,考虑到它来自对 Google 服务器的请求,并且就解析而言,它是有效的。

因此,在您的情况下,您可以做的只是声明回调函数(请注意,您可以在查询字符串中传递您自己的函数名称,如Google Developers guides中所述)然后评估它。我从这个线程中获得灵感:

//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,您可以将其转换为您想要的任何内容。

于 2016-10-09T20:34:46.793 回答
1

根据Google 关于其响应格式可视化 API 的文档,您可以在请求中添加一个标头,该标头将返回 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/, ''));
于 2020-02-01T05:12:08.967 回答
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]))

于 2020-10-28T19:06:14.440 回答