如何通过Google Apps Script从根文件夹ID获取文件URL
问题与解答
问题背景
这段代码会遍历整个云端硬盘搜索同名文件,不仅效率极低,还会返回所有匹配的同名文件:
var Files = DriveApp.getFilesByName(Filename); while(Files.hasNext()) {...}
已知根文件夹ID和文件名,能不能通过限定搜索范围的方式直接获取文件URL?比如类似下面的代码:
var FileURL = DriveApp.OpenFolder(FolderID).getFileByName(Filename).getURL();
解答
你的思路完全正确——缩小搜索范围到指定文件夹能大幅提升效率,不过代码需要做几点修正:
- Google Apps Script中打开文件夹的正确方法是
DriveApp.getFolderById(FolderID),而非DriveApp.OpenFolder(注意方法名的拼写与大小写) getFileByName()仅返回第一个匹配的文件;如果找不到文件会直接抛出错误,建议添加异常处理
基础版(获取第一个匹配文件的URL)
function getTargetFileUrl(folderId, filename) { try { const targetFolder = DriveApp.getFolderById(folderId); const targetFile = targetFolder.getFilesByName(filename).next(); return targetFile.getUrl(); } catch (error) { console.log(`获取失败:${error.message}`); return null; } }
进阶版(获取文件夹下所有同名文件的URL)
如果需要收集该文件夹下所有同名文件的URL,可以遍历结果:
function getAllMatchingFileUrls(folderId, filename) { const targetFolder = DriveApp.getFolderById(folderId); const matchingFiles = targetFolder.getFilesByName(filename); const urlList = []; while (matchingFiles.hasNext()) { urlList.push(matchingFiles.next().getUrl()); } return urlList; }
递归版(搜索文件夹及所有子文件夹)
如果需要覆盖指定文件夹的所有子层级,可使用递归搜索:
function searchInSubfolders(folder, filename, resultList) { // 搜索当前文件夹 const files = folder.getFilesByName(filename); while (files.hasNext()) { resultList.push(files.next().getUrl()); } // 递归处理子文件夹 const subfolders = folder.getFolders(); while (subfolders.hasNext()) { searchInSubfolders(subfolders.next(), filename, resultList); } } function getAllUrlsIncludingSubfolders(folderId, filename) { const rootFolder = DriveApp.getFolderById(folderId); const urlList = []; searchInSubfolders(rootFolder, filename, urlList); return urlList; }
内容的提问来源于stack exchange,提问作者Undefined
相关产品推荐
相关产品推荐

