Google Sheets v4更新影响JSON Endpoint数据?2021年6月8日关闭

我读到了这篇article关于Google Sheet API v4更新的文章。我需要更改当前代码结构吗?

我正在使用simple JSON data在Web上显示Google工作表数据。我在Web上做了一些基于PHP和JavaScript的项目,使用以下代码:

.HTML
 var sf = https://spreadsheets.google.com/feeds/list/1l7VfPOI3TYtPuBZlZ-JMMiZW1OK6rzIBt8RFd6KmwbA/1/public/values?alt=json

 $.getJSON(sf, function(data) {
 var sd = data.feed.entry;

 key = data.feed.entry[i]['gsx$key']['$t'];
 name = data.feed.entry[i]['gsx$name']['$t'];
 img = data.feed.entry[i]['gsx$img']['$t'];
 rice = data.feed.entry[i]['gsx$price']['$t'];

.php

$url = 'https://spreadsheets.google.com/feeds/list/1l7VfPOI3TYtPuBZlZ-JMMiZW1OK6rzIBt8RFd6KmwbA/1/public/values?alt=json';
$file = file_get_contents($url); 
$json = json_decode($file);

$rows = $json->{'feed'}->{'entry'};

$key = $row->{'gsx$key'}->{'$t'};
$price = $row->{'gsx$price'}->{'$t'};
$img = $row->{'gsx$img'}->{'$t'};
$name = $row->{'gsx$name'}->{'$t'};

我真的需要更新什么吗?


解决方案

我相信您的目标如下。

  • 您要将终结点从工作表API v3更改为其他。

问题和解决方法:

在Sheets API v3中,无需访问令牌和API密钥即可使用此API。但是在表APIv4的情况下,需要使用访问令牌和/或API密钥。看来这就是目前的规格。当我看到您的脚本时,没有使用访问令牌和API密钥。因此,在这个答案中,作为一种变通办法,我想提出一种从电子表格中检索不带访问令牌和API密钥的值的方法。终结点如下所示。

https://docs.google.com/spreadsheets/d/{spreadsheetId}/gviz/tq
这是与查询语言一起使用的终结点。作为一个重要的点,在这种情况下,Google电子表格需要发布为Web发布。请小心这个。当我看到您的电子表格的URL时,该电子表格似乎已发布为Web发布。因此,您的电子表格可以与以下脚本一起使用。

在此答案中,使用的是Java脚本。

示例脚本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(([sSw]+))/);
  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);
});

引用:

  • Query Language Reference
  • Response Format
  • Method: spreadsheets.get of Sheets API v4

相关文章