Google表格脚本读取云端JSON文件遇权限错误,已配置OAuth仍报错
问题分析与解决方案
核心错误点
- 操作对象混淆:你要读取的是Google云端硬盘中的普通JSON文件,但代码里用了
DocumentApp.openById(),这个方法是用来打开Google Docs格式文档的,完全不适用于普通JSON文件。 - 权限不匹配:你配置的是Google Docs的权限,但操作的是Drive中的文件,需要的是Drive相关权限。
- 函数调用方式错误:在表格单元格直接调用自定义函数(如
=jsonTest())时,这类函数运行在受限环境,无法访问需要OAuth授权的服务(比如DriveApp/DocumentApp)。
修正步骤
1. 更新权限配置
修改manifest文件的oauthScopes,添加Drive只读权限(如果需要写入可换成更宽的权限):
{ "timeZone": "Europe/Paris", "dependencies": { }, "exceptionLogging": "STACKDRIVER", "runtimeVersion": "V8", "oauthScopes": [ "https://www.googleapis.com/auth/drive.readonly", "https://www.googleapis.com/auth/spreadsheets" ] }
2. 编写正确的读取函数
替换原函数为以下代码,通过DriveApp读取云端硬盘的JSON文件,并添加菜单触发方式(避免单元格调用的权限限制):
// 打开表格时添加自定义菜单 function onOpen() { const ui = SpreadsheetApp.getUi(); ui.createMenu('自定义工具') .addItem('读取JSON文件', 'readJsonFromDrive') .addToUi(); } // 读取Drive中的JSON文件 function readJsonFromDrive() { // 替换为你的JSON文件ID const jsonFileId = '替换成你的JSON文件ID'; try { // 获取文件并读取内容 const file = DriveApp.getFileById(jsonFileId); const jsonContent = file.getBlob().getDataAsString(); // 解析JSON(按需处理,这里示例将解析后的数据写入A1单元格) const parsedData = JSON.parse(jsonContent); const activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); activeSheet.getRange('A1').setValue(JSON.stringify(parsedData)); // 可选:弹出提示告知成功 SpreadsheetApp.getUi().alert('JSON文件读取成功,内容已写入A1单元格'); } catch (error) { SpreadsheetApp.getUi().alert('读取失败:' + error.message); } }
3. 触发函数的方式
保存代码后刷新表格,会看到顶部出现「自定义工具」菜单,点击「读取JSON文件」,按照提示完成授权即可执行。
关键说明
- 不要在单元格直接调用需要授权的自定义函数,这类函数必须通过菜单、按钮或定时触发器来触发。
- 确保你使用的文件ID是云端硬盘中JSON文件的ID(可从文件的URL中获取,URL中
d/和/edit之间的字符串就是ID)。
内容的提问来源于stack exchange,提问作者Jens Stuber
相关产品推荐
相关产品推荐

