【问题标题】:Google Sheets API throwing 401 error while append rows to spreadsheet without loginGoogle Sheets API 在未登录的情况下将行附加到电子表格时引发 401 错误
【发布时间】:2024-05-23 11:30:01
【问题描述】:

目标:提交表单并将数据存储到谷歌电子表格

文档:link

到目前为止我做了什么:

var CLIENT_ID = 'my_client_id.apps.googleusercontent.com';
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";

var authorizeButton = document.getElementById('authorize_button');
  var signoutButton = document.getElementById('signout_button');
 function handleClientLoad() {
    gapi.load('client:auth2', initClient);
  }
function initClient() {
    gapi.client.init({
      apiKey: API_KEY,
      clientId: CLIENT_ID,
      discoveryDocs: DISCOVERY_DOCS,
      scope: SCOPES
    })
function updateSigninStatus(isSignedIn) {
    if (isSignedIn) {
      //authorizeButton.style.display = 'none';
      //signoutButton.style.display = 'block';
      //listMajors();
    } else {
      //authorizeButton.style.display = 'block';
      //signoutButton.style.display = 'none';
    }
  }
function appendPre(message) {
    var pre = document.getElementById('content');
    var textContent = document.createTextNode(message + '\n');
    pre.appendChild(textContent);
  }
function update_docs(data) {
    var params = {
      spreadsheetId: '1YXMlr_-I45AWM2b9QnLkuLQoI6dq6wEuVOcttOMv9hU',
      range: 'A:I',  // TODO: Update placeholder value.
      valueInputOption: 'RAW',
      insertDataOption: 'INSERT_ROWS',
    };

  var valueRangeBody = {

    "range": 'A:I', // 9 cols
    "majorDimension": 'ROWS',
    "values": [
      [
        data[0].value,//nom,
        data[1].value,//prenom,
        data[2].value,//email,
        data[3].value,//user_phone,
        data[4].value,//company_name,
        data[5].value,//user_type,
        data[6].value,//account_name,
        data[7].value,//password,
        data[8].value,//comptes_sources,
      ]
    ]

  };

  var request = gapi.client.sheets.spreadsheets.values.append(params, valueRangeBody);
  request.then(function(response) {
    console.log(response.result);
  }, function(reason) {
    console.error('error: ' + reason.result.error.message);
  });
}

如果我登录到我的 Google 帐户,我可以成功地将行附加到电子表格中。

问题:我可以在不登录的情况下追加行吗(如果可以,请提供一些文档/代码)? 因为如果我从私人窗口提交表单,它会引发 401 错误。

错误信息:error: Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential.

【问题讨论】:

  • 在您的脚本中,您似乎尝试使用 API 密钥附加行。不幸的是,API 密钥不能用于将行附加到电子表格,因为 API 密钥不能用于 POST 和 PUT 方法。请使用从 OAuth2 或服务帐户检索到的访问令牌,如错误消息所述。如果这对您的情况没有用处,我深表歉意。

标签: javascript google-api google-oauth google-sheets-api google-api-js-client


【解决方案1】:

我认为在开始研究之前,您需要了解一些事情。

私人数据和公共数据之间存在差异。

  • 公开数据,搜索公开上传的 youtube 视频
  • 私人数据、我的个人 gmail 帐户、驱动器帐户、日历帐户。

即使将工作表设置为公开也无济于事,因为使用 api 密钥将工作表公开时,您只能读取工作表而不能更新它。

回答:不,如果应用程序没有经过身份验证并有权访问数据,您就不能追加一行。

假设这是您个人拥有的工作表,您可以设置服务帐户身份验证并授予服务帐户访问工作表的权限,然后它就可以为您进行更改,而无需您登录。但是,这取决于您的应用程序的工作方式以及您使用的语言。我不认为 javascript 支持服务帐户身份验证。

【讨论】:

  • 感谢这个概念。是的,javascript 不支持服务帐户身份验证。解决了从 javascript 转换为 php 的问题。