修改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
相关产品推荐
相关产品推荐

