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

converting Google Visualization Query result into javascript array

我正在查询的电子表格的 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]

我需要能够一次性处理数据并将新数据添加到可视化中。

来自多个查询之一的数据 --> 转换为数组 --> 处理数据 ex: multiplying an input --> data.addRows(操纵输入);

您的查询 return 一个包含 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]]

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

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

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

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

所以在你的情况下,你可以做的只是声明回调函数(请注意,你可以在查询字符串中传递你自己的函数名称,如 Google Developers guides) and then evaluate it. I take inspiration :

//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());

在 "result" 中,您将拥有一个已经解析的 JSON,您可以将其转换为您想要的任何内容。

根据 Google's documentation on their Visualization API for response formats,您可以在您的请求中添加一个 header,它将 return JSON 没有功能或评论。

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

然而,即使存在 header,API 也会在响应中添加一个奇怪的字符串:)]}',我认为这与提到的 anti-content-sniffing 有关通过@Diego。好的,Google — 即使使用 OAuth 令牌,您真的需要这样做吗?

因此,要获得该响应中的实际 JSON,您可以使用以下 Javascript 来绕过它。假设 responseBody 是 API 实际上 return 给你的,而 data 存储你想要的 JSON。

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

假设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]))