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

修改Google Apps Script限制Drive文件夹列表层级至2级或仅父级

修改后的Google Apps Script(限制文件夹遍历层级)

方案1:仅列出父文件夹的直接子文件夹

如果只需要展示目标文件夹下的直接子文件夹(不深入任何子层级),修改getChildFolders函数移除递归调用即可:

function onOpen() {     
  var SS = SpreadsheetApp.getActiveSpreadsheet();
  var ui = SpreadsheetApp.getUi();                      
  SpreadsheetApp.getUi()                              
    .createMenu('Custom Scripts')                               
    .addItem('List Files and Folders (1 Level)', 'listFilesAndFolders')                       
    .addToUi();         
}
                    
function listFilesAndFolders(){
  var folderId = Browser.inputBox('Enter folder ID', Browser.Buttons.OK_CANCEL);
  if (folderId === "") {
    Browser.msgBox('Folder ID is invalid');
    return;
  }
  getFolderTree(folderId, true); 
};

// Get Folder Tree
function getFolderTree(folderId, listAll) {
  try {
    var parentFolder = DriveApp.getFolderById(folderId);
    var sheet = SpreadsheetApp.getActiveSheet();
    sheet.clear();
    sheet.appendRow(["Full Path", "Name","Type" ,"Date", "URL", "Last Updated", "Description", "Size","Owner Email"]);
    
    getChildFolders(parentFolder.getName(), parentFolder, sheet, listAll);
  } catch (e) {
    Logger.log(e.toString());
  }
};

// 仅处理当前文件夹的直接子项,不递归
function getChildFolders(parentName, parent, sheet, listAll) {
  var childFolders = parent.getFolders();
 
  while (childFolders.hasNext()) {
    var childFolder = childFolders.next();
    var data = [ 
      parentName + "/" + childFolder.getName(),
      childFolder.getName(),
      "Folder",
      childFolder.getDateCreated(),
      childFolder.getUrl(),
      childFolder.getLastUpdated(),
      childFolder.getDescription(),
      childFolder.getSize()/1024,
      childFolder.getOwner().getEmail()
    ];
    sheet.appendRow(data);
    
    if (listAll) {
      var files = childFolder.getFiles();
      while (files.hasNext()) {
        var childFile = files.next();
        data = [ 
          parentName + "/" + childFolder.getName() + "/" + childFile.getName(),
          childFile.getName(),
          "File",
          childFile.getDateCreated(),
          childFile.getUrl(),
          childFile.getLastUpdated(),
          childFile.getDescription(),
          childFile.getSize()/1024,
          childFile.getOwner().getEmail()
        ];
        sheet.appendRow(data);
      }
    }
    // 移除递归调用,停止深入子文件夹
  }
};

关键改动

  • 删除原函数末尾的递归调用,避免遍历更深层级
  • 优化listAll判断逻辑,代码更清晰

方案2:遍历到2级子文件夹(父→子→孙文件夹)

如果需要展示父文件夹的直接子文件夹,以及这些子文件夹的直接子文件夹(共2级深度),通过添加层级参数控制递归深度:

function onOpen() {     
  var SS = SpreadsheetApp.getActiveSpreadsheet();
  var ui = SpreadsheetApp.getUi();                      
  SpreadsheetApp.getUi()                              
    .createMenu('Custom Scripts')                               
    .addItem('List Files and Folders (2 Levels)', 'listFilesAndFolders')                       
    .addToUi();         
}
                    
function listFilesAndFolders(){
  var folderId = Browser.inputBox('Enter folder ID', Browser.Buttons.OK_CANCEL);
  if (folderId === "") {
    Browser.msgBox('Folder ID is invalid');
    return;
  }
  getFolderTree(folderId, true); 
};

// Get Folder Tree
function getFolderTree(folderId, listAll) {
  try {
    var parentFolder = DriveApp.getFolderById(folderId);
    var sheet = SpreadsheetApp.getActiveSheet();
    sheet.clear();
    sheet.appendRow(["Full Path", "Name","Type" ,"Date", "URL", "Last Updated", "Description", "Size","Owner Email"]);
    
    // 初始层级设为0(对应父文件夹)
    getChildFolders(parentFolder.getName(), parentFolder, sheet, listAll, 0);
  } catch (e) {
    Logger.log(e.toString());
  }
};

// 带层级控制的遍历函数
function getChildFolders(parentName, parent, sheet, listAll, currentLevel) {
  var childFolders = parent.getFolders();
 
  while (childFolders.hasNext()) {
    var childFolder = childFolders.next();
    var data = [ 
      parentName + "/" + childFolder.getName(),
      childFolder.getName(),
      "Folder",
      childFolder.getDateCreated(),
      childFolder.getUrl(),
      childFolder.getLastUpdated(),
      childFolder.getDescription(),
      childFolder.getSize()/1024,
      childFolder.getOwner().getEmail()
    ];
    sheet.appendRow(data);
    
    if (listAll) {
      var files = childFolder.getFiles();
      while (files.hasNext()) {
        var childFile = files.next();
        data = [ 
          parentName + "/" + childFolder.getName() + "/" + childFile.getName(),
          childFile.getName(),
          "File",
          childFile.getDateCreated(),
          childFile.getUrl(),
          childFile.getLastUpdated(),
          childFile.getDescription(),
          childFile.getSize()/1024,
          childFile.getOwner().getEmail()
        ];
        sheet.appendRow(data);
      }
    }
    // 仅当前层级小于1时递归(层级0→处理1级文件夹,层级1→处理2级文件夹,之后停止)
    if (currentLevel < 1) {
      getChildFolders(parentName + "/" + childFolder.getName(), childFolder, sheet, listAll, currentLevel + 1);  
    }
  }
};

关键改动

  • 新增currentLevel参数跟踪遍历层级,初始调用设为0
  • 添加层级判断条件,限制递归仅到2级子文件夹
  • 优化文件遍历逻辑

内容的提问来源于stack exchange,提问作者Abdel Elshebshiry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:54:14