能否使用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身份认证获取访问令牌,具体步骤和调整后的代码如下:
创建OAuth2客户端ID
在Google Cloud控制台中,为你的应用创建OAuth2客户端ID,应用类型选择「Chrome 应用」或「桌面应用」(适配书签工具的浏览器运行环境),并配置授权重定向URI。获取OAuth2访问令牌
在书签工具中添加授权逻辑,通过弹出窗口引导用户登录Google账号并授权Sheets API权限,获取访问令牌。调整代码使用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
相关产品推荐
相关产品推荐

