Google Sheets API POST请求报401错误(JavaScript)求助
解决Google Sheets API追加数据的401错误及代码修正
核心问题:API密钥无法用于写入操作
API密钥仅适用于只读请求,要实现追加/更新数据,必须使用OAuth 2.0授权,且请求的授权范围(Scope)必须包含读写权限:https://www.googleapis.com/auth/spreadsheets(如果只需要修改特定表格,也可以用https://www.googleapis.com/auth/spreadsheets.currentonly)。
代码修正步骤
1. 确保OAuth授权初始化正确
在调用任何API之前,必须完成gapi.auth2的初始化,并且确保用户已授权正确的Scope:
// 初始化Auth2,替换成你的客户端ID function initAuth() { gapi.load('auth2', function() { gapi.auth2.init({ client_id: '你的客户端ID', scope: 'https://www.googleapis.com/auth/spreadsheets' // 必须是读写权限的Scope }).then(function(authInstance) { // 检查是否已登录 if (!authInstance.isSignedIn.get()) { authInstance.signIn(); // 未登录则触发登录授权 } }); }); } // 页面加载时调用初始化 window.onload = initAuth;
2. 修正追加数据的函数
你的原代码存在Promise链断裂、变量未定义的问题,以下是修正后的版本:
// 先定义获取当前日期的函数 function getCurrentDate() { const date = new Date(); // 格式化为YYYY-MM-DD,可根据需求调整 return `${date.getFullYear()}-${String(date.getMonth()+1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`; } function fv1Passivated(callback) { // 把callback作为参数传入 const currentDate = getCurrentDate(); const values = [[currentDate]]; const body = { values }; try { // 先确认用户已登录授权 const authInstance = gapi.auth2.getAuthInstance(); if (!authInstance.isSignedIn.get()) { console.log('用户未登录,请先授权'); authInstance.signIn(); return; } gapi.client.sheets.spreadsheets.values.append({ spreadsheetId: SHEET_ID, // 确保这个变量已正确定义 range: 'FV1!A2:A', valueInputOption: 'USER_ENTERED', resource: body }).then((response) => { const result = response.result; console.log(`${result.updates.updatedCells} cells appended.`); if (callback) callback(response); }).catch((err) => { console.error('追加数据失败:', err.message); }); } catch (err) { console.error('函数执行出错:', err.message); } }
3. 关键注意事项
- Scope必须正确:如果之前授权的是只读Scope(比如
https://www.googleapis.com/auth/spreadsheets.readonly),需要让用户重新授权,清除之前的授权缓存(浏览器设置里找到Google相关的权限,删除后重新登录)。 - Promise链不要中断:原代码第一个then回调没有返回response,导致第二个then拿不到结果,直接合并成一个then即可。
- 确保SHEET_ID正确:确认表格ID是从Google Sheets URL中提取的(URL中
d/和/edit之间的字符串),且用户登录的账号有该表格的编辑权限。
4. 本地测试注意事项
localhost测试时,必须在Google Cloud Console的OAuth 2.0客户端ID设置中,把http://localhost:端口号添加到已授权的JavaScript来源和已授权的重定向URI中,否则会出现授权失败或401错误。
内容的提问来源于stack exchange,提问作者Andrew Jordan
相关产品推荐
相关产品推荐

