首页 > 解决方案 > 复制文件夹中的所有文件,包括子文件夹中的文件

问题描述

我必须复制原始文件夹中每个子文件夹的文件,但目前正在复制最后一个子文件夹的文件,而它正在创建的子文件夹的其余部分是空的,但在原始文件中有没有复制的文件。

例如,有一个主文件夹 Amit->amit1 子文件夹->amit2 子文件夹,目前它只复制 amit 2 子文件夹的文件,其余文件夹为空

var sheet = SpreadsheetApp.getActiveSheet();
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var scriptproperties = PropertiesService.getScriptProperties();

function authorize() {
    spreadsheet.toast("Enter Folder ID and  Select GDrive: Copy Folder->  Make a Copy", "", -1);

}


function onOpen() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var menuEntries = [{
            name: "1. Authorize",
            functionName: "authorize"
        }, {
            name: "2. Make a Copy",
            functionName: "findRootFolder"
        }

    ];
    ss.addMenu("GDrive: Copy Folder", menuEntries);
    spreadsheet.toast("Select GDrive: Copy Folder-> Authorize. This is an One Time Action.", "Get Started", -1);
}

function findRootFolder() {
    var folderId = sheet.getRange("B5").getValue();
    var folderId = folderId.toString().trim();
    var start = new Date();

    try {

        var topFolder = DriveApp.getFolderById(folderId);

        deletekeys();
        spreadsheet.toast("Copy Process Has Started. Please Wait...", "Started", -1);
        getFolders_(topFolder.getName(), topFolder);
        spreadsheet.toast("Folder Has Been Copied Successfully. Please Check Your Google Drive Now.", "Success", -1);
    } catch (e) {
        Browser.msgBox("Error", "Sorry, Error Occured: " + e.toString(), Browser.Buttons.OK);
        spreadsheet.toast("Error Occurred :( Please make sure you Entered Folder ID in B5 Cell.", "Oops!", -1);
    }

}

function getFolders_(path, container) {

    var folders = container.getFolders();

    var count = 0;
    while (folders.hasNext()) {
        count++;
        var folder = folders.next();
    }

    var folderCount = count;
    var fileslist = container.getFiles();
    var fileCountFind = 0;
    while (fileslist.hasNext()) {
        fileCountFind++;
        var file = fileslist.next();
        Logger.log(file.getName());
    }
    var fileCount = fileCountFind;
    var files = container.getFiles();

    Logger.log("container.getName() " + container.getName() + "| folder length " + folderCount + "| files length " + fileCount);

    if (folderCount <= 0) {

        if (fileCount > 0) {
            Logger.log("Just Files Found Loop");
            copyfiles_(container.getName(), files);
        }
    }

    if (folderCount) {
        Logger.log("If loop, Folders Found");
        var folders = container.getFolders();

        while (folders.hasNext()) {

            var folder = folders.next();
            copy_(container.getName(), folder.getName(), files);
            var thisFolder = folder.getName();
            var thisPath = path + "/" + thisFolder;
            Logger.log("Folder Name:" + folder.getName());
            getFolders_(thisPath, folder);

        }

    }
    return;
}

function copy_(containername, childname, files)

{

    if (scriptproperties.getProperty(containername + "copy")) {
        Logger.log("if");
        var parentcontainer = DriveApp.getFolderById(scriptproperties.getProperty(containername + "copy"));

        if (!scriptproperties.getProperty(containername + "processed")) {
            /*process, copy files*/

            while (files.hasNext()) {
                var file = files.next();
                var newFile = file.makeCopy(file.getName(), parentcontainer);
               //parentcontainer.addFile(newFile);
                DriveApp.getRootFolder().removeFile(newFile);
                Utilities.sleep(2000);
            }




        }

        scriptproperties.setProperty(containername + "processed", "true");
        var childfolder = parentcontainer.createFolder(childname + "_copy");
        var childfolderid = childfolder.getId();
        scriptproperties.setProperty(childname + "copy", childfolderid);

    } else {

        Logger.log("else");
        var parentfold = DriveApp.createFolder(containername + "_copy");
        var parentfoldid = parentfold.getId();
        scriptproperties.setProperty(containername + "copy", parentfoldid);



        if (!scriptproperties.getProperty(containername + "processed")) {
            /*process, copy files*/

            while (files.hasNext()) {
                var file = files.next();
                var newFile = file.makeCopy(file.getName(), parentfold);
            //  parentfold.addFile(newFile);
                DriveApp.getRootFolder().removeFile(newFile);
                Utilities.sleep(2000);
            }

        }

        scriptproperties.setProperty(containername + "processed", "true");
        var childfolder = parentfold.createFolder(childname + "_copy");
        var childfolderid = childfolder.getId();
        scriptproperties.setProperty(childname + "copy", childfolderid);

    }
    Logger.log("Container Name: " + containername + "||" + " Child Name: " + childname);
}

function copyfiles_(containername, files) {
    if (scriptproperties.getProperty(containername + "copy")) {
        Logger.log("If Loop, Just files found- down");
        var parentcontainer = DriveApp.getFolderById(scriptproperties.getProperty(containername + "copy"));

        if (!scriptproperties.getProperty(containername + "processed")) {

            while (files.hasNext()) {
                var file = files.next();
                var newFile = file.makeCopy(file.getName(), parentcontainer);
              //parentcontainer.addFile(newFile);
                DriveApp.getRootFolder().removeFile(newFile);
                Utilities.sleep(2000);
            }
        }
        scriptproperties.setProperty(containername + "processed", "true");

    } else {

        Logger.log("Else Loop, Just files found");
        var parentfold = DriveApp.createFolder(containername + "_copy");
        var parentfoldid = parentfold.getId();
        scriptproperties.setProperty(containername + "copy", parentfoldid);

        if (!scriptproperties.getProperty(containername + "processed")) {

            while (files.hasNext()) {
                var file = files.next();
                var newFile = file.makeCopy(file.getName(), parentfold);
              //parentfold.addFile(newFile);
                DriveApp.getRootFolder().removeFile(newFile);
                Utilities.sleep(2000);
            }



        }
        scriptproperties.setProperty(containername + "processed", "true");
    }

}

function deletekeys() {
    scriptproperties.deleteAllProperties();
}

标签: google-apps-script

解决方案


根据您的问题,我了解到您想要复制文件结构中的文件而忽略文件夹。我想出了一个递归函数的示例,它从传递的文件夹到最后一个子文件夹,并复制它遇到的每个文件并将其移动到主文件夹(通过参数传递的那个,而不是主驱动器文件夹):

 function myFunction() {
  
  var fromFolder = '***your folder's ID***';
  var toFolder = fromFolder
  
  // THIS WILL MAKE COPIES OF ALL THE FILES IGNORING THE FOLDER STRUCTURE INTO toFolder
  copyFiles(fromFolder, toFolder)
}

function copyFiles(idToSearch, mainId) {
  var file = Drive.Files.get(idToSearch)
  
  //CHECKS IF THE FOLDER PASSED IS AN ACTUAL FOLDER OR A FILE
  if (file.mimeType != 'application/vnd.google-apps.folder') {
    Logger.log(file.parents[0].id)
    
    // COPY THE FILE
    var copyFile = DriveApp.getFileById(file.id).makeCopy();
    
    
    //Drive.Files.copy(file, file.id)
    
    //UPDATES THE FILE PARENT TO THE ROOT FOLDER
    var optionalArgs = {   
      "addParents": mainId,
      "removeParents": copyFile.getParents().next().getId()
    }
    Drive.Files.patch(Drive.Files.get(copyFile.getId()), copyFile.getId(), optionalArgs)
    
  } else {
    
    var fileChildren = Drive.Children.list(file.id)
    
    for(var i = 0; i < fileChildren.items.length; i++) {
      copyFiles(fileChildren.items[i].id, mainId)
    }
  }
  
}

如果那不是您需要的,请告诉我。


编辑

我找到并尝试了这段代码,它可以工作。

学分:使用 Google Scripts 在 Google Drive 中复制文件夹

function start() {
  
  var sourceFolder = "Copy folder structure";
  var targetFolder = "New folder structure Copy";
  
  var source = DriveApp.getFoldersByName(sourceFolder)
  var target = DriveApp.createFolder(targetFolder);

  if (source.hasNext()) {
    copyFolder(source.next(), target);
  }
  
}

function copyFolder(source, target) {

  var folders = source.getFolders();
  var files   = source.getFiles();
  
  while(files.hasNext()) {
    var file = files.next();
    file.makeCopy(file.getName(), target);
  }
  
  while(folders.hasNext()) {
    var subFolder = folders.next();
    var folderName = subFolder.getName();
    var targetFolder = target.createFolder(folderName);
    copyFolder(subFolder, targetFolder);
  }  
  
}

推荐阅读