使用谷歌脚本在谷歌驱动器中合并具有相同名称的文件夹

时间:2016-08-01 03:10:15

标签: google-apps-script

谁知道如何使用谷歌脚本合并谷歌驱动器中具有相同名称的文件夹?

步骤01:查找根文件夹中是否有任何重复文件夹;

步骤02:如果是,请选择一个文件夹作为主文件夹,然后将另一个文件夹中的所有文件(具有相同名称)移动到该主文件夹;

步骤03:删除其他文件夹(同名)。

非常感谢提前。

Merge Folder with the same name under the same Folder

2 个答案:

答案 0 :(得分:0)

目前,

Class Folder没有现有方法将文件从Google云端硬盘中的一个文件夹移动到另一个文件夹。

据我所知,Seeing duplicate files after sync on desktop Drive version 1.14存在问题。但是,您可以按照以下步骤在论坛中遵循给定的解决方法:

步骤01: How to Find duplicates files (by name and/or size) in a specific folder of my google drive

步骤02: How do I copy & move a file to a folder in Google Apps Script?

步骤03:您可以使用Class Folder中的URL方法,该方法只能用于从当前文件夹中删除指定的文件夹。

我希望有所帮助。

答案 1 :(得分:0)

我的方法:

  1. 选择要在其中检查同名文件夹的父文件夹
  2. 遍历所有子文件夹并获取其名称
  3. 使用找到的每个文件夹名称查找父文件夹中的所有文件夹
  4. 指定给定folderName的第一次迭代作为目标文件夹
  5. 如果有多个具有指定名称的文件夹,请将此文件夹中的所有文件和文件夹移至目标文件夹并删除该文件夹
  6. 试试这个:

    我已经在一些垃圾数据上成功测试了这个功能。

    function mergeDuplicateFolders() {
    
      var parentFolder = DriveApp.getFolderById('{paste your folder ID here}'); //parent folder which will be scanned for duplicates
      var childFolderIterator = parentFolder.getFolders(); //all folders within parent folder
    
      //iteration over all folders in parent directory
      while (childFolderIterator.hasNext()) {
        var childFolder = childFolderIterator.next();
        var childFolderName = childFolder.getName();
        var childSameNameIterator = parentFolder.getFoldersByName(childFolderName);
    
        //just check if folder with givn name exist (there should be at least one)
        if(childSameNameIterator.hasNext()) {
          var destFolder = childSameNameIterator.next();
    
          //iteration over 2nd and all other folders with given name
          while (childSameNameIterator.hasNext()) {      
            var toMergeFolder = childSameNameIterator.next();
            var filesToMove = toMergeFolder.getFiles();
            var foldersToMove =  toMergeFolder.getFolders()
    
            //iteration over all files    
            while (filesToMove.hasNext()) {
              var file  = filesToMove.next();
              moveFile(file, destFolder);
            }
    
            //iteration over all subfolders    
            while (foldersToMove.hasNext()) {
              var folder  = foldersToMove.next();
              moveFolder(folder, destFolder);
            }
           //trashes empty folder
            toMergeFolder.setTrashed(true);
          }
        }
    
      }
    
    }
    
    //custom function which removes all parents from speciefied file and adds file to new folder
    function moveFile(file, destFolder) {
      var currentParents = file.getParents();
      while (currentParents.hasNext()) { // be careful, this loop will remove all parents from the file... if you want to have this file in multiple folders you should add if statement to remove it only from specified folder
        var currentParent = currentParents.next();
        currentParent.removeFile(file); 
      }
      destFolder.addFile(file);
      Logger.log("File moved to " + destFolder.getName());
    }
    
    //custom function which removes all parents from speciefied folder and adds that folder to new one
    function moveFolder(folder, destFolder) {
      var currentParents = folder.getParents();
      while (currentParents.hasNext()) { // be careful, this loop will remove all parents from the folder... if you want to have this folder in multiple folders you should add if statement to remove it only from specified folder
        var currentParent = currentParents.next();
        currentParent.removeFolder(folder);
      }
      destFolder.addFolder(folder);
      Logger.log("Folder moved to " + destFolder.getName());
    }
    

    您的申请:

    您当然可以编辑此函数的前两行,并添加parentFolderId作为该函数的参数。然后,您可以在自己的迭代中使用此函数,并检查多个文件夹中的重复项。

    function mergeDuplicateFolders(parentFolderId) {
    
      var parentFolder = DriveApp.getFolderById(parentFolderId);
    
      //...continue with the code from above
    

    警告

      

    小心点。在Google云端硬盘中,您可以在多个文件夹中拥有一个文件   此代码将从所有文件中删除文件(在同名文件夹中)   父文件夹,只在一个文件夹中移动它们。如果你喜欢删除它   只有具有相同名称的文件夹,您需要添加一些if语句   在moveFolder()moveFile()个函数中。

         

    Google脚本只允许(大约)6分钟运行自定义功能。如果要检查大量文件夹,则应该进行一些解决方法。您可以添加例如执行时间限制。示例如下:Prevent Google Scripts from Exceeding the Maximum Execution Time Limit

    编辑:

    当然有更简单的方法来删除文件只有frome merged文件夹...删除自定义函数并以这种方式编辑两个迭代...我没有先实现它。

    //iteration over all files
    while (filesToMove.hasNext()) {
      var file = filesToMove.next();
      toMergeFolder.removeFile(file); 
      destFolder.addFile(file);
    }
    
    //iteration over all subfolders
    while (foldersToMove.hasNext()) {
      var folder = foldersToMove.next(); 
      toMergeFolder.removeFolder(folder);
      destFolder.addFolder(folder);
    }