如何让Google Script访问私有Google Sheets且不开放编辑权限?
解决Google Sheets脚本仅访问私有文件的权限方案
核心思路是使用Google服务账号(Service Account),让脚本以服务账号身份访问私有Sheet,无需给普通用户开放私有Sheet的权限。具体步骤如下:
1. 创建并配置Google Cloud项目
- 打开Google Cloud控制台,新建一个项目。
- 在项目中搜索并启用Google Sheets API。
2. 创建服务账号并生成密钥
- 进入项目的「IAM与管理」→「服务账号」页面,点击「创建服务账号」。
- 填写账号名称和描述后,为该账号分配权限:根据需求选择「Editor」(编辑)或「Viewer」(查看)权限(仅赋予私有Sheet所需的最小权限)。
- 进入服务账号详情页,切换到「密钥」标签,点击「添加密钥」→「创建新密钥」,选择JSON格式并下载密钥文件,妥善保存(不要泄露)。
3. 授权服务账号访问私有Sheet
- 打开你的私有Google Sheet,点击右上角「共享」按钮。
- 输入服务账号的邮箱(可从下载的JSON密钥文件的
client_email字段获取),赋予对应的访问权限(和步骤2中分配的权限匹配),点击「发送」。
4. 修改公开Sheet的脚本,实现服务账号鉴权
- 打开公开Sheet的脚本编辑器,先添加OAuth2库:点击「资源」→「库」,输入库ID
1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF,选择最新版本并保存。 - 为了安全存储密钥,点击「文件」→「项目属性」→「脚本属性」,添加以下属性:
PRIVATE_KEY:粘贴JSON密钥文件中private_key字段的内容(注意保留换行和格式)CLIENT_EMAIL:粘贴JSON密钥文件中client_email字段的内容CLIENT_ID:粘贴JSON密钥文件中client_id字段的内容
- 编写脚本示例(以读取私有Sheet数据为例):
function getSheetsService() { const props = PropertiesService.getScriptProperties(); return OAuth2.createService('PrivateSheetAccess') .setTokenUrl('https://oauth2.googleapis.com/token') .setPrivateKey(props.getProperty('PRIVATE_KEY')) .setClientEmail(props.getProperty('CLIENT_EMAIL')) .setClientId(props.getProperty('CLIENT_ID')) .setPropertyStore(PropertiesService.getScriptProperties()) .setScope('https://www.googleapis.com/auth/spreadsheets'); } function fetchPrivateSheetData() { const service = getSheetsService(); if (!service.hasAccess()) { throw new Error('鉴权失败:' + service.getLastError()); } const privateSheetId = '你的私有Sheet ID'; const range = 'Sheet1!A1:B10'; // 按需修改范围 const apiUrl = `https://sheets.googleapis.com/v4/spreadsheets/${privateSheetId}/values/${range}`; const response = UrlFetchApp.fetch(apiUrl, { headers: { Authorization: `Bearer ${service.getAccessToken()}` } }); const data = JSON.parse(response.getContentText()); // 这里可以处理拉取到的数据,比如写入公开Sheet SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getRange('A1').setValue(data.values[0][0]); } - 首次运行脚本时,会提示授权,按照指引完成权限确认即可。
注意事项
- 密钥文件和脚本属性中的敏感信息必须严格保密,禁止泄露给无关人员。
- 遵循最小权限原则:服务账号仅获得私有Sheet所需的最低权限(如仅需读取则设为查看权限)。
- 若需要推送数据到私有Sheet,只需修改API请求为POST/PUT方法,参考Google Sheets API文档调整请求体即可。
内容的提问来源于stack exchange,提问作者nord_poster
相关产品推荐
相关产品推荐

