我在一家 Google Apps 转销商工作,我为我们的客户实现小工具。
我们有几个使用 Google Visualization API 查询电子表格(使用动态 ID)并将结果显示在表格中的小工具。
我们正在使用这段代码:
function drawVisualization() {
var oldSpreadsheetUrl = "https://docs.google.com/spreadsheet/tq?key=<ss_id>";
var newSpreadsheetUrl = "https://docs.google.com/spreadsheets/d/<ss_id>/gviz/tq";
var query = new google.visualization.Query(oldSpreadsheetUrl);
query.setQuery("SELECT A,B");
query.send(handleQueryResponse);
}
function handleQueryResponse(response) {
if(response.isError()) {
console.log(response.getMessage());
} else {
console.log("NUMBER OF COLUMNS: " + response.getDataTable().getNumberOfColumns());
}
}
并使用此示例电子表格(新的 Google 电子表格)进行测试
电子表格 ID:1qMvY3y4MkwoK1UvCA9A8dW4BbmhH1iMwWqGLEM5vjJk
只要我们查询旧电子表格,一切正常,但如果我们查询新电子表格(使用标准 url - oldSpreadsheetUrl
),请求会因超时异常而失败,我们会收到 404 异常.
这是我们在浏览器控制台中得到的消息:
http://i.imgur.com/h4DjyQ6.png
无论如何,通过在数据源中使用这个新的 url,我们能够使查询正常工作:
"https://docs.google.com/spreadsheets/d/<spreadsheet_id>/gviz/tq"
但使用这种表示法时,setQuery 指令将被忽略,并且返回所有三列而不是前两列 ("SELECT A,B"
)。
我们在几个小工具中使用它,因此想知道:
- 我们如何克服
setQuery
错误? - 有没有一种程序化的方法可以知道电子表格是新版本还是旧版本?
提前谢谢你。
问候,
里卡多
最佳答案
几周前,当我们使用新的 Google 表格进行一些测试时,我遇到了同样的问题。基本上,旧的 Google 表格需要一个具有以下格式的 URL:
https://spreadsheets.google.com/tq?key={key}
虽然新的 Google 表格需要一个具有这种格式的 URL:
https://docs.google.com/spreadsheets/d/{key}/gviz/tq
您应该能够使用域来区分新旧 Google 表格。如果做不到这一点,您可以随时查找 /gviz/
来判断是否正在使用新的 Google 表格。您可以在 this bug report 中找到更多信息。 .
关于您关于 setQuery
的另一点,我今天早上在调试我自己的问题时注意到列 ID 被 Visualization API 返回为“Col 0”、“Col 1” "等,而不是 "A"、"B"等。这可能就是您的 ("SELECT A,B")
查询不起作用的原因。我也刚刚登录了 a bug对于这个问题。
希望对您有所帮助。
关于api - 新的 Google 电子表格导致 Google Visualization API 查询失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23084176/