You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用API Key通过JavaScript调用Google Sheets API向私有表格追加数据?

问题描述

我正在编写一款书签工具,用于在网页中抓取数据并保存至我的私有Google表格,计划使用spreadsheets.values.append方法将数据追加至表格最后一行。已启用Google Sheets API,并生成了无应用限制、无API限制的API Key,但执行代码后收到401响应。在Google Sheets参考文档的「Try this method」功能中测试时,返回如下错误:

{
  "error": {
    "code": 401,
    "message": "API keys are not supported by this API. Expected OAuth2 access token or other authentication credentials that assert a principal. See https://cloud.google.com/docs/authentication",
    "status": "UNAUTHENTICATED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "CREDENTIALS_MISSING",
        "domain": "googleapis.com",
        "metadata": {
          "method": "google.apps.sheets.v4.SpreadsheetsService.AppendValues",
          "service": "sheets.googleapis.com"
        }
      }
    ]
  }
}

请问是否有办法使用API Key实现向我的Google表格追加行?以下是我的JavaScript代码:

var sheetId = "MY_SHEET_ID";
var sheetName = "Sheet1";
var apiKey = "MY_API_KEY";

var url = "https://sheets.googleapis.com/v4/spreadsheets/" + sheetId + "/values/" + sheetName + "!A1:append?valueInputOption=USER_ENTERED";
var data = [["test value"]];

var xhr = new XMLHttpRequest();
xhr.open("POST", url);
xhr.setRequestHeader("Authorization", "Bearer " + apiKey);
xhr.setRequestHeader("Content-Type", "application/json");

xhr.onreadystatechange = function() {
  if (xhr.readyState === 4 && xhr.status === 200) {
    console.log(xhr.responseText);
  }
};

var jsonData = {
  "range": sheetName,
  "majorDimension": "ROWS",
  "values": data
};

xhr.send(JSON.stringify(jsonData));
解决方案

无法使用API Key实现向私有Google表格追加行,原因如下:

  • spreadsheets.values.append属于需要用户身份认证的写操作,API Key仅能用于访问公开资源的只读接口,或无需验证用户身份的特定写接口。私有表格的写操作必须验证操作人的身份(即断言主体),而API Key无法提供用户身份信息,因此会返回401错误。

针对书签工具的场景,你需要改用OAuth2身份认证获取访问令牌,具体步骤和调整后的代码如下:

  1. 创建OAuth2客户端ID
    在Google Cloud控制台中,为你的应用创建OAuth2客户端ID,应用类型选择「Chrome 应用」或「桌面应用」(适配书签工具的浏览器运行环境),并配置授权重定向URI。

  2. 获取OAuth2访问令牌
    在书签工具中添加授权逻辑,通过弹出窗口引导用户登录Google账号并授权Sheets API权限,获取访问令牌。

  3. 调整代码使用OAuth2令牌
    将原代码中的API Key替换为OAuth2访问令牌,修改后的代码示例:

var sheetId = "MY_SHEET_ID";
var sheetName = "Sheet1";
// 替换为通过OAuth2流程获取的访问令牌
var accessToken = "USER_OAUTH2_ACCESS_TOKEN";

var url = "https://sheets.googleapis.com/v4/spreadsheets/" + sheetId + "/values/" + sheetName + "!A1:append?valueInputOption=USER_ENTERED";
var data = [["test value"]];

var xhr = new XMLHttpRequest();
xhr.open("POST", url);
xhr.setRequestHeader("Authorization", "Bearer " + accessToken);
xhr.setRequestHeader("Content-Type", "application/json");

xhr.onreadystatechange = function() {
  if (xhr.readyState === 4) {
    if (xhr.status === 200) {
      console.log(xhr.responseText);
    } else {
      console.error("请求失败:", xhr.statusText, xhr.responseText);
    }
  }
};

var jsonData = {
  "majorDimension": "ROWS",
  "values": data
};

xhr.send(JSON.stringify(jsonData));

补充说明:如果你的表格可以设置为公开可编辑,那么可以使用API Key配合部分写接口,但这种方式存在安全风险(任何人拿到API Key都能修改表格),不建议用于私有数据场景。

内容的提问来源于stack exchange,提问作者user1542316

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:55:50