我相信你的目标如下。
- 您想要将端点从 Sheets API v3 更改为其他端点。
问题和解决方法:
在 Sheets API v3 中,无需访问令牌和 API 密钥即可使用此 API。但对于 Sheets API v4,需要使用访问令牌和/或 API 密钥。看来这是当前的规范。当我看到你的脚本时,没有使用访问令牌和 API 密钥。因此,在这个答案中,作为一种解决方法,我想提出一种在没有访问令牌和 API 密钥的情况下从电子表格中检索值的方法。终点如下。
https://docs.google.com/spreadsheets/d/{spreadsheetId}/gviz/tq
这是与查询语言一起使用的端点。重要的是,在这种情况下,Google 电子表格需要作为 Web 发布进行发布。请小心这一点。当我看到您的电子表格的 URL 时,该电子表格似乎已作为 Web 发布发布。因此您的电子表格可以与以下脚本一起使用。
在这个答案中,使用了Javascript脚本。
示例脚本1:
在此示例脚本中,直接检索电子表格的值作为 CSV 数据。
var sf = "https://docs.google.com/spreadsheets/d/1l7VfPOI3TYtPuBZlZ-JMMiZW1OK6rzIBt8RFd6KmwbA/gviz/tq?tqx=out:csv";
$.ajax({url: sf, type: 'GET', dataType: 'text'})
.done(function(csv) {
console.log(csv);
})
.fail((e) => console.log(e.status));
示例脚本2:
在此示例脚本中,电子表格的值作为 JSON 数据进行检索,并将其解析为标题行和值。
var sf = "https://docs.google.com/spreadsheets/d/1l7VfPOI3TYtPuBZlZ-JMMiZW1OK6rzIBt8RFd6KmwbA/gviz/tq?tqx=out:json";
$.ajax({url: sf, type: 'GET', dataType: 'text'})
.done(function(data) {
const r = data.match(/google\.visualization\.Query\.setResponse\(([\s\S\w]+)\)/);
if (r && r.length == 2) {
const obj = JSON.parse(r[1]);
const table = obj.table;
const header = table.cols.map(({label}) => label);
const rows = table.rows.map(({c}) => c.map(e => e ? (e.v || "") : "")); // Modified from const rows = table.rows.map(({c}) => c.map(({v}) => v));
console.log(header);
console.log(rows);
}
})
.fail((e) => console.log(e.status));
示例脚本 3:
例如,当使用Sheets API v4时,示例脚本如下。在这种情况下,将使用 API 密钥。并且需要公开共享电子表格。请小心这一点。
var url = "https://sheets.googleapis.com/v4/spreadsheets/1l7VfPOI3TYtPuBZlZ-JMMiZW1OK6rzIBt8RFd6KmwbA/values/Sheet1?key=###"
$.getJSON(url, function(data) {
console.log(data.values);
});
参考:
- 查询语言参考 https://developers.google.com/chart/interactive/docs/querylanguage
- 响应格式 https://developers.google.com/chart/interactive/docs/dev/implementing_data_source#response-format
- 方法:Sheets API v4的spreadsheets.get https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/get