Google Script报错‘editors.hasNext is not a function’及权限查询脚本咨询
Google Drive权限查询脚本问题解答
1. 错误原因及解决方法
- 错误原因:
DriveApp.Folder.getEditors()方法返回的是User[]类型的数组,而非迭代器对象,因此不存在hasNext()和next()方法,调用这两个不存在的方法就会触发报错。 - 解决方法:将遍历编辑器的逻辑改为数组遍历方式,比如使用
forEach或普通for循环:
修改后的代码片段示例:var editors = folder.getEditors(); // 方式1:用forEach遍历数组 editors.forEach(function(editor) { results.push({ Folder: folder.getName(), Editor: editor.getEmail(), Role: 'Editor' }); }); // 方式2:用普通for循环遍历 for (var j = 0; j < editors.length; j++) { var editor = editors[j]; results.push({ Folder: folder.getName(), Editor: editor.getEmail(), Role: 'Editor' }); }
2. 成熟的文件夹权限查询写入Sheet脚本方案
以下是覆盖指定文件夹及其所有子文件夹、文件,并完整收集所有者、编辑者、查看者权限信息的生产级脚本,包含异常处理与性能优化:
function exportDrivePermissionsToSheet() { // 配置项:填写目标文件夹ID和要输出的Sheet名称 const TARGET_FOLDER_IDS = ['FolderID1', 'FolderID2', 'FolderID3']; const SHEET_NAME = '权限查询结果'; // 初始化结果数组,包含表头 const results = [['资源类型', '名称', 'ID', '权限角色', '用户邮箱', '所有者']]; // 递归遍历文件夹及其子内容的核心函数 function traverseFolder(folder) { try { const folderName = folder.getName(); const folderId = folder.getId(); const owner = folder.getOwner().getEmail(); // 收集当前文件夹的权限信息 addPermissions(folder, '文件夹', folderName, folderId, owner); // 遍历所有子文件夹 const subFolders = folder.getFolders(); while (subFolders.hasNext()) { traverseFolder(subFolders.next()); } // 遍历文件夹内的所有文件 const files = folder.getFiles(); while (files.hasNext()) { const file = files.next(); const fileName = file.getName(); const fileId = file.getId(); const fileOwner = file.getOwner().getEmail(); addPermissions(file, '文件', fileName, fileId, fileOwner); } } catch (e) { // 捕获无权限访问的资源,记录错误信息 results.push(['无权限资源', '无法访问', '', '', '', e.message]); } } // 提取并添加权限信息到结果数组的辅助函数 function addPermissions(item, type, name, id, owner) { // 添加所有者信息 results.push([type, name, id, '所有者', owner, owner]); // 添加编辑者(排除重复的所有者) const editors = item.getEditors(); editors.forEach(editor => { const email = editor.getEmail(); if (email !== owner) { results.push([type, name, id, '编辑者', email, owner]); } }); // 添加查看者(排除重复的所有者) const viewers = item.getViewers(); viewers.forEach(viewer => { const email = viewer.getEmail(); if (email !== owner) { results.push([type, name, id, '查看者', email, owner]); } }); } // 遍历所有目标文件夹 TARGET_FOLDER_IDS.forEach(folderId => { try { const folder = DriveApp.getFolderById(folderId); traverseFolder(folder); } catch (e) { // 捕获无效文件夹ID的错误 results.push(['无效文件夹', '无法找到', folderId, '', '', e.message]); } }); // 写入Google Sheet const ss = SpreadsheetApp.getActiveSpreadsheet(); let sheet = ss.getSheetByName(SHEET_NAME); if (!sheet) { sheet = ss.insertSheet(SHEET_NAME); } else { sheet.clear(); } // 批量写入数据,减少API调用次数提升性能 sheet.getRange(1, 1, results.length, results[0].length).setValues(results); // 自动调整列宽适配内容 sheet.autoResizeColumns(1, results[0].length); Logger.log(`权限信息已导出到Sheet:${SHEET_NAME},共${results.length - 1}条有效记录`); }
脚本核心特性:
- 递归遍历目标文件夹的所有层级子文件夹与文件
- 完整记录资源类型、名称、ID、权限角色、用户邮箱、所有者信息
- 处理无权限访问、无效文件夹ID等异常场景
- 采用批量写入方式,避免频繁API调用导致的性能问题
- 自动创建或清空目标Sheet,自动调整列宽
- 自动去重所有者权限(避免同时出现在所有者和编辑/查看者列表中)
内容的提问来源于stack exchange,提问作者Michael J.
相关产品推荐
相关产品推荐

