0

这是 Google Sheets API 上的又一个错误 403。嗯,尝试使用一些自定义 HTML 过滤器从电子表格中读取数据并将其公开在网站上。

所以,有这个问题: Google Sheets API 上的错误 403

尽管如此,我还是不知道该怎么做。我已经在谷歌云平台中设置了我的服务帐户,授予它访问我的电子表格的权限 - 我什至通过链接访问了我的电子表格(但这仅限于来自我组织的电子邮件,所以无论如何它似乎没用)。我还为我的服务帐户激活了域范围的委派 - 根本没有任何区别。我很确定这个问题与错误的密钥或一些拼写错误无关,因为当我从工作表中删除对服务电子邮件的访问权限时,我收到了 403 错误,但它带有一条消息,说调用者没有无权访问该电子表格。

人们一直在提到 OAuth,但我不想使用它,因为我打算使用简单的 API 访问,就像在这个 Google GitHub 示例中一样。我正在使用我的企业帐户,因此可能存在与此相关的一些问题。

这是 HTML(我从 python 上的简单 HTTP 服务器运行,而不是直接运行,因为 GAPI 不能localhost/很好地处理源):

<!DOCTYPE html>
<html>
  <head>
    <title>Google Sheets API Quickstart</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <p>Google Sheets API Quickstart</p>

    <!--Add buttons to initiate auth sequence and sign out-->
    <button id="authorize_button" style="display: none;">Authorize</button>
    <button id="signout_button" style="display: none;">Sign Out</button>

    <pre id="content" style="white-space: pre-wrap;"></pre>

    <script type="text/javascript">
      // Client ID and API key from the Developer Console
      var API_KEY = 'My-API-KEY';
      var DISCOVERY_DOCS = ["https://sheets.googleapis.com/$discovery/rest?version=v4"];
      var SCOPES = "https://www.googleapis.com/auth/spreadsheets.readonly";

      function handleClientLoad() {
        gapi.load('client', initClient);
      }

      function initClient() {
        gapi.client.init({
          apiKey: API_KEY,
          discoveryDocs: DISCOVERY_DOCS
        }).then(function(){listMajors();})
      }

      function appendPre(message) {
        var pre = document.getElementById('content');
        var textContent = document.createTextNode(message + '\n');
        pre.appendChild(textContent);
      }

      function listMajors() {
        gapi.client.sheets.spreadsheets.values.get({
          spreadsheetId: 'my-spreadsheet-id',
          range: 'Sheet1!A1:A10',
        }).then(function(response) {
          var range = response.result;
          if (range.values.length > 0) {
            appendPre('Name, Major:');
            for (i = 0; i < range.values.length; i++) {
              var row = range.values[i];
              // Print columns A and E, which correspond to indices 0 and 4.
              appendPre(row[0] + ', ' + row[4]);
            }
          } else {
            appendPre('No data found.');
          }
        }, function(response) {
          appendPre('Error: ' + response.result.error.message);
        });
      }
    </script>

    <script async defer src="https://apis.google.com/js/api.js"
      onload="this.onload=function(){};handleClientLoad()"
      onreadystatechange="if (this.readyState === lete') this.onload()">
    </script>
  </body>
</html>


有没有人知道我错过了什么,或者我还能尝试什么?

编辑:公开共享电子表格不是一种选择。这是一个商业电子邮件,因此,我在这里得到的唯一选择是在域范围内共享它,正如我在上面已经说过的那样。此外,这是一个业务电子表格,因此包含敏感数据。公开揭露它是没有意义的。除此之外,我已经与服务电子邮件共享了电子表格。毕竟,我想要实现的是在不使用 oauth 的情况下从电子表格中读取数据,并将其嵌入网站(我知道有一个内置的嵌入工具,但这不适合我,因为我需要添加一个html过滤器)。

4

1 回答 1

0

如果您尝试访问未公开的电子表格,则必须使用OAuth 2.0。由于它不是公共资源,因此您必须使用有权访问此资源的帐户的凭据

在您提供的示例中,他们正在访问公共资源,因此 API 密钥就足够了。那不是你的情况。

参考:

于 2020-02-18T10:30:56.440 回答