如何在Google Apps Script中按文件名部分文本搜索并复制文件?
解决Google Apps Script中部分文件名匹配并复制文件的问题
我明白你现在的需求——要在Google Apps Script里找出所有文件名包含Daily Stock Summary Report Kadlunga的文件,然后复制到名为Kadlunga的文件夹里,之前的代码只能匹配完整文件名对吧?别担心,我们只需要调整文件名的判断逻辑,就能实现部分匹配的效果。
基础版:仅处理指定文件夹下的文件
这个版本会遍历Attachments文件夹根目录下的所有文件,复制符合条件的到目标文件夹:
function copyMatchingFiles() { const dApp = DriveApp; // 获取源文件夹(Attachments) const sourceFolderIterator = dApp.getFoldersByName("Attachments"); if (!sourceFolderIterator.hasNext()) { console.log("未找到名为'Attachments'的源文件夹"); return; } const sourceFolder = sourceFolderIterator.next(); // 获取目标文件夹(Kadlunga),不存在则自动创建 const targetFolderIterator = dApp.getFoldersByName("Kadlunga"); const targetFolder = targetFolderIterator.hasNext() ? targetFolderIterator.next() : dApp.createFolder("Kadlunga"); // 定义要匹配的文件名关键词 const matchKeyword = "Daily Stock Summary Report Kadlunga"; // 遍历源文件夹下的所有文件 const files = sourceFolder.getFiles(); while (files.hasNext()) { const file = files.next(); const fileName = file.getName(); // 核心:判断文件名是否包含目标关键词(includes方法直观易懂) // 如果需要忽略大小写,可以改成:fileName.toLowerCase().includes(matchKeyword.toLowerCase()) if (fileName.includes(matchKeyword)) { // 复制文件到目标文件夹,保留原文件名 file.makeCopy(fileName, targetFolder); console.log(`已成功复制文件: ${fileName}`); } } }
进阶版:递归处理所有子文件夹
如果你的目标文件可能分散在Attachments的子文件夹里,可以用这个递归版本,它会遍历所有层级的子文件夹:
function copyMatchingFilesRecursive() { const dApp = DriveApp; const sourceFolderIterator = dApp.getFoldersByName("Attachments"); if (!sourceFolderIterator.hasNext()) { console.log("未找到名为'Attachments'的源文件夹"); return; } const sourceFolder = sourceFolderIterator.next(); const targetFolderIterator = dApp.getFoldersByName("Kadlunga"); const targetFolder = targetFolderIterator.hasNext() ? targetFolderIterator.next() : dApp.createFolder("Kadlunga"); const matchKeyword = "Daily Stock Summary Report Kadlunga"; // 调用递归函数处理文件夹 processFolder(sourceFolder, targetFolder, matchKeyword); } // 递归处理单个文件夹及其子文件夹 function processFolder(sourceFolder, targetFolder, matchKeyword) { // 处理当前文件夹的文件 const files = sourceFolder.getFiles(); while (files.hasNext()) { const file = files.next(); const fileName = file.getName(); if (fileName.includes(matchKeyword)) { file.makeCopy(fileName, targetFolder); console.log(`已复制文件: ${fileName}`); } } // 递归处理子文件夹 const subFolders = sourceFolder.getFolders(); while (subFolders.hasNext()) { const subFolder = subFolders.next(); processFolder(subFolder, targetFolder, matchKeyword); } }
关键逻辑说明
- 部分匹配实现:用
fileName.includes(matchKeyword)替代完整文件名匹配,这个方法会检查文件名中是否包含指定的字符串。如果需要忽略大小写,只需要把文件名和关键词都转成小写(或大写)后再判断即可。 - 文件夹健壮性处理:代码里先检查源文件夹是否存在,避免找不到文件夹时报错;目标文件夹如果不存在会自动创建,不用手动提前建立。
- 文件复制:使用
makeCopy()方法,第一个参数是复制后的文件名(这里保留原文件名),第二个参数是目标文件夹,非常直观。
内容的提问来源于stack exchange,提问作者Dan V




