【问题标题】:Google Script - Compare part of a file name to a subfolders name and move file to subfolder if there is a matchGoogle Script - 将文件名的一部分与子文件夹名称进行比较,如果匹配则将文件移动到子文件夹
【发布时间】:2020-01-13 16:30:12
【问题描述】:

感谢这里的好人,我有一个脚本可以交叉检查文件名和文件夹名称,如果名称匹配,则将文件移动到文件夹(下面的代码)

如果搜索某个文件夹的子文件夹并检查文件以查看部分名称是否与子文件夹名称匹配,我现在正在苦苦挣扎

例如

文件夹:

文件夹名称:example1 子文件夹名称:example1-commercial 子文件夹名称:example1-clients

文件: example1-commercial.pdf(移动到 example1-commercial 文件夹) example1-clients.pdf(移动到 example1-clients 文件夹)

任何帮助将不胜感激!

谢谢!

function folderAndFiles(){
  var files = [];
  var folderMap = {};

  var foldersParent = DriveApp.getFoldersByName("names").next();
  var filesParent = DriveApp.getFoldersByName("files").next();

  var filesIterator = filesParent.getFiles();
  var foldersIterator = foldersParent.getFolders();



  while(filesIterator.hasNext()) {
    var currentFile = filesIterator.next();
    files.push(currentFile);

  }

  while(foldersIterator.hasNext()) {
    var currentFolder =  foldersIterator.next();
    folderMap[currentFolder.getName()] = currentFolder;


  }

  for (var i=0; i<files.length; i++) {
    var file = files[i];
    var fileName = file.getName().replace('.jpg', '');
    var destinationFolder = folderMap[fileName];

    if (destinationFolder) {
      destinationFolder.addFile(files[i]);
      filesParent.removeFile(file);
      Logger.log("Moved");
    }
  }
}

【问题讨论】:

  • 我猜你会想用递归函数遍历文件夹。
  • 开始将您的逻辑分离为可重用的函数。您的代码知道如何获取文件夹的子文件夹,因此您只需要使用新的父级运行该逻辑。然后,您的代码只需更新将文件从“名称匹配”移动到“名称部分匹配”的条件。您在哪里尝试修改代码?

标签: javascript google-apps-script


【解决方案1】:

您可以使用以下代码来实现您的目标:

function sortFiles() {
//  var folders = Drive.Files.list({
//    "q": "mimeType = 'application/vnd.google-apps.folder' and trashed = false",
//    "fields": "items(title, id)"
//  });
  var folders = DriveApp.getFolders();  
//  var files = Drive.Files.list({
//    "q": "mimeType != 'application/vnd.google-apps.folder' and trashed = false",
//    "fields": "items(title, id)"
//  });
  var files = DriveApp.getFiles();
  var folderIDs = [];
  var folderNames = [];
  var fileIDs = [];
  var fileNames = [];

  do {
    var folder = folders.next();
    folderNames.push(folder.getName());
    folderIDs.push(folder.getId());
  } while (folders.hasNext());

  do {
    var file = files.next();
    fileNames.push(file.getName());
    fileIDs.push(file.getId());
  } while (files.hasNext());

  for (var i = 0; i < fileNames.length; i++) {
    for (var j = 0; j < folderNames.length; j++) {
      if (folderNames[j].search(fileNames[i]) > -1) {
        var oldFileParents = DriveApp.getFileById(fileIDs[i]).getParents();
        DriveApp.getFolderById(folderIDs[j]).addFile(DriveApp.getFileById(
          fileIDs[i]));
        if (oldFileParents.hasNext()) {
          do {
            oldFileParents.next().removeFile(DriveApp.getFileById(fileIDs[i]));
          } while (oldFileParents.hasNext());
        }
      }
    }
  }
}

根据您的评论,我已将代码更新为仅使用 DriveApp class 而不使用 Drive API。为了将来参考,我已经注释了对方法 Files.list 的 API 调用,该方法用于收集每个文件和文件夹(回收站中的文件和文件夹除外)。

代码将首先使用.getFolders().getFiles() 方法收集您云端硬盘的所有文件夹和文件。稍后它将为每个文件夹和文件创建两个数组:一个用于 ID,另一个用于名称。然后,迭代名称数组以寻找巧合。找到一处重合后,会使用.getFileById().getParents()方法记录文件的当前文件夹。我们需要使用这种方法,因为单个文件可以位于 Drive 的不同文件夹中。

所以最后的步骤是:首先,收集文件的当前文件夹。之后,我们将把文件包含到新文件夹中。最后,我们必须删除之前在第一步中保存的 parent(s) 文件夹。

如果您需要进一步的帮助或澄清,请再次给我回信。

【讨论】:

  • 嗨!非常感谢!我运行了代码,最初在驱动功能上出现错误,但将其更改为 driveapp。现在我收到此错误“TypeError:无法调用未定义的方法“列表”。(第 2 行,文件“代码”)”有什么想法吗?
  • 你好@Richhawk106!我刚刚更新了我的答案,只使用 DriveApp。看看新代码,看看它是否可以帮助您。
  • 嗨!谢谢你!我正在努力移动文件。我正在尝试比较这两个数组,但是当我将它们注销以检查它是否正常工作时,什么都没有显示?
  • 嗨@Richhawk106!不要觉得有义务编辑任何东西,只需复制并粘贴完整的代码。我已经对其进行了测试,并且可以按描述工作。你在哪里记录数组?如果它们为空,则可能表明它们尚未填充。
猜你喜欢
  • 2020-04-30
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多