如何用Apps Script设置仅域内用户可访问的文件权限
按域名设置Google Drive文件/文件夹权限的正确实现
可以仅通过域名限制Google Drive文件/文件夹的访问权限,你的代码问题出在错误使用了addViewers和addEditors方法——这两个方法仅接受单个用户邮箱或邮箱数组,不支持直接传入域名字符串。以下是修正后的完整实现:
核心修正点
- 使用
DriveApp.setSharing()结合DriveApp.Access.DOMAIN参数,直接为整个域名设置权限 - 若需在私有权限基础上追加域名访问,可使用
addPermission()方法并指定DriveApp.PermissionType.DOMAIN - 注意:该特性仅适用于Google Workspace(原G Suite)账号,个人Google账号无法使用域共享功能
修正后的完整代码
function updatePermissions() { // 补全工作表对象获取(原代码未定义,需确保工作表名称正确) var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheetDatabase = ss.getSheetByName("sheetDatabase"); var sheetSetting = ss.getSheetByName("sheetSetting"); var domainSetting = sheetDatabase.getRange('K3').getValue(); var domain = sheetDatabase.getRange('K4').getValue(); // 格式应为 guru.smk.belajar.id(无需@前缀) Logger.log("当前目标域名: " + domain); // 获取目标文件夹和文件 var folderAplikasiPklID = sheetSetting.getRange(6, 3).getValue(); var folder = DriveApp.getFolderById(folderAplikasiPklID); var spreadsheetID = sheetSetting.getRange(7, 3).getValue(); var ssJurnalPKL = DriveApp.getFileById(spreadsheetID); if (domainSetting === 'ARRANGED') { // 1. 设置文件夹:仅域内用户可查看 folder.setSharing(DriveApp.Access.DOMAIN, DriveApp.Permission.VIEW); // 若需保留私有权限同时追加域访问,可替换为: // folder.setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.VIEW); // folder.addPermission(domain, DriveApp.PermissionType.DOMAIN, DriveApp.Permission.VIEW); // 2. 设置表格:仅域内用户可编辑(先清理现有权限) // 移除所有现有查看者和编辑者 ssJurnalPKL.getViewers().forEach(viewer => ssJurnalPKL.removeViewer(viewer)); ssJurnalPKL.getEditors().forEach(editor => ssJurnalPKL.removeEditor(editor)); // 设置域内编辑权限 ssJurnalPKL.setSharing(DriveApp.Access.DOMAIN, DriveApp.Permission.EDIT); // 若需追加权限而非替换,可替换为: // ssJurnalPKL.addPermission(domain, DriveApp.PermissionType.DOMAIN, DriveApp.Permission.EDIT); } else if (domainSetting === 'UNREGULATED') { // 设置为任何人可通过链接编辑 ssJurnalPKL.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.EDIT); } Logger.log('权限更新完成'); };
额外注意事项
- 域名格式需为
guru.smk.belajar.id,无需添加@前缀 - 确保运行脚本的账号拥有目标文件/文件夹的所有者权限
- 若需混合权限(如部分外部用户+域内用户),请使用
addPermission()方法追加权限,而非直接用setSharing()覆盖
内容的提问来源于stack exchange,提问作者PSAB Plalangan
相关产品推荐
相关产品推荐

