You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动