javascript 将复制文件添加到Google App Script代码

piok6c0g  于 2023-09-29  发布在  Java
关注(0)|答案(1)|浏览(101)

我从StackOverflow的其他答案中获得此代码,以显示RootFolder中的所有文件夹,而不会出现超时错误。效果非常好!。我必须运行以循环所有文件夹和子文件夹。其伟大
现在我想复制所有内容显示与function processFile(file,path)到一个目标文件夹
有人能指导我做吗?
非常感谢

function main() {
    var _RootFolder=DriveApp.getFolderById('Replace with root FolderID')
    processRootFolder(_RootFolder) 
}

function processRootFolder(rootFolder) {
    MAX_RUNNING_TIME_MS = 1 * 60 * 1000;
    var RECURSIVE_ITERATOR_KEY = "RECURSIVE_ITERATOR_KEY";

    var startTime = (new Date()).getTime();

    // [{folderName: String, fileIteratorContinuationToken: String?, folderIteratorContinuationToken: String}]
    var recursiveIterator = JSON.parse(PropertiesService.getDocumentProperties().getProperty(RECURSIVE_ITERATOR_KEY));
    if (recursiveIterator !== null) {
        // verify that it's actually for the same folder
        if (rootFolder.getName() !== recursiveIterator[0].folderName) {
          console.warn("Looks like this is a new folder. Clearing out the old iterator.");
          recursiveIterator = null;
        } else {
          console.info("Resuming session.");
        }
    }
    if (recursiveIterator === null) {
        console.info("Starting new session.");
        recursiveIterator = [];
        recursiveIterator.push(makeIterationFromFolder(rootFolder));
    }

    while (recursiveIterator.length > 0) {
        recursiveIterator = nextIteration(recursiveIterator, startTime);

        var currTime = (new Date()).getTime();
        var elapsedTimeInMS = currTime - startTime;
        var timeLimitExceeded = elapsedTimeInMS >= MAX_RUNNING_TIME_MS;
        if (timeLimitExceeded) {
            PropertiesService.getDocumentProperties().setProperty(RECURSIVE_ITERATOR_KEY, JSON.stringify(recursiveIterator));
            console.info("Stopping loop after '%d' milliseconds. Please continue running.", elapsedTimeInMS);
            return;
        }
    }

    console.info("Done running");
    PropertiesService.getDocumentProperties().deleteProperty(RECURSIVE_ITERATOR_KEY);
}

// process the next file or folder
function nextIteration(recursiveIterator) {
    var currentIteration = recursiveIterator[recursiveIterator.length-1];
    if (currentIteration.fileIteratorContinuationToken !== null) {
        var fileIterator = DriveApp.continueFileIterator(currentIteration.fileIteratorContinuationToken);
        if (fileIterator.hasNext()) {
            // process the next file
            var path = recursiveIterator.map(function(iteration) { return iteration.folderName; }).join("/");
            processFile(fileIterator.next(), path);
            currentIteration.fileIteratorContinuationToken = fileIterator.getContinuationToken();
            recursiveIterator[recursiveIterator.length-1] = currentIteration;
            return recursiveIterator;
          } else {
            // done processing files
            currentIteration.fileIteratorContinuationToken = null;
            recursiveIterator[recursiveIterator.length-1] = currentIteration;
            return recursiveIterator;
          }
    }

  if (currentIteration.folderIteratorContinuationToken !== null) {
      var folderIterator = DriveApp.continueFolderIterator(currentIteration.folderIteratorContinuationToken);
      if (folderIterator.hasNext()) {
          // process the next folder
          var folder = folderIterator.next();
          recursiveIterator[recursiveIterator.length-1].folderIteratorContinuationToken = folderIterator.getContinuationToken();
          recursiveIterator.push(makeIterationFromFolder(folder));
          return recursiveIterator;
      } else {
          // done processing subfolders
          recursiveIterator.pop();
          return recursiveIterator;
      }
  }

  throw "should never get here";
}

function makeIterationFromFolder(folder) {
    return {
        folderName: folder.getName(), 
        fileIteratorContinuationToken: folder.getFiles().getContinuationToken(),
        folderIteratorContinuationToken: folder.getFolders().getContinuationToken()
    };
}

function processFile(file, path) {
    console.log(path + "/" + file.getName());
}
xxb16uws

xxb16uws1#

在应用程序脚本中复制的一个简单方法是使用makeCopy()函数:

file.makeCopy("new name", folder);

在这里,您将定义要复制的文件和目标文件夹的ID。将以下函数添加到脚本中:

function copyToFolder(file){
  var destinationFolderId = "ID of Destination Folder"
  file.makeCopy("New File Name", destinationFolderId);
}

然后将其添加到您的函数main函数中:

function nextIteration(recursiveIterator) {
    var currentIteration = recursiveIterator[recursiveIterator.length-1];
    if (currentIteration.fileIteratorContinuationToken !== null) {
        var fileIterator = DriveApp.continueFileIterator(currentIteration.fileIteratorContinuationToken);
        if (fileIterator.hasNext()) {
            // process the next file
            var path = recursiveIterator.map(function(iteration) { return iteration.folderName; }).join("/");
            processFile(fileIterator.next(), path);
            copyToFolder(fileIterator.next()) //ADDED
            currentIteration.fileIteratorContinuationToken = fileIterator.getContinuationToken();
            recursiveIterator[recursiveIterator.length-1] = currentIteration;
            return recursiveIterator;
          } else {
            // done processing files
            currentIteration.fileIteratorContinuationToken = null;
            recursiveIterator[recursiveIterator.length-1] = currentIteration;
            return recursiveIterator;
          }
    }

参考文献:

相关问题