You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:23:09