如何在不使用 oauth2 的情况下使用电子表格 API 读取数据

How to read data using the spreadsheets API without using oauth2

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

所以,有这个问题: Error 403 on Google Sheets API

仍然,我不知道该怎么办。我在 google 云平台中设置了我的服务帐户,授予它访问我的 Spreadsheet 的权限 - 我什至通过 link 访问了我的 SpreadSheet(但这仅限于来自我的组织,所以它看起来毫无用处)。我还为我的服务帐户激活了域范围的委派 - 根本没有任何区别。我很确定问题与错误的密钥或某些拼写错误无关,因为当我从 sheet 中删除对服务电子邮件的访问权限时,我收到 403 错误,但它附带一条消息说来电者无权访问该价差sheet.

人们不断提到 OAuth,但我不想使用它,因为我打算使用简单的 API 访问,如 this Google GitHub example。我正在使用我的企业帐户,因此可能存在一些与此相关的问题。

这是 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>


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

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

如果您尝试访问不是 public 的电子表格,您将不得不使用 OAuth 2.0。由于它不是 public 资源,您必须使用有权访问此资源的帐户的 凭据

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

参考: