Google脚本问题:有没有一种方法可以一次将文件副本创建到多个文件夹中?

时间:2019-11-26 18:02:07

标签: google-apps-script

我有一个电子表格,我在其中编写了用于填充文件夹名称(第1列)及其ID(第2列)的代码。

我想用包含独立文件夹(如果需要的话,一个“共享驱动器”文件夹)的每个文档的副本填充该电子表格中列出的每个文件夹。当我执行以下代码时,将在源文件夹(共享驱动器文件夹)中而不是在目标文件夹(即在电子表格中捕获ID的文件夹)中创建每个文档的副本。如果重要的话,每个副本都用电子表格中的folderID标记。有人可以告诉我如何获取此代码以在适当的目标文件夹中而不是源文件夹中创建副本吗?

function CopiestoFolder() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var data = ss.getDataRange() //Get all non-blank cells
                 .getValues() //Get array of values
                 .splice(1); //Remove header line
  //Define column numbers for data. Array starts at 0.
  var NAME = 0;
  var FOLDERID = 1;

  //For each folder ID listed in spreadsheet, create a copy of
  //each item in the Resume Resources folder.  

  for (var i = 0; i < data.length; i++) {
    var name = data[i][NAME];
    var folderId = data[i][FOLDERID];

    var srcFolder = DriveApp.getFolderById("folder ID");
    var dstFolder = folderId;
    var files = srcFolder.getFiles();

    while (files.hasNext()) {
      var file = files.next();
      var f = file.makeCopy(dstFolder);
      if (file.getMimeType() == MimeType.GOOGLE_APPS_SCRIPT) {
        dstFolder.addFile(file);
        f.getParents().next().removeFile(file);
      }
    }
  }    
}

3 个答案:

答案 0 :(得分:0)

我对脚本文件有此问题。这是我固定的方法。或者我应该说这是Tanaike修复它的方式。您将需要启用Drive API。

var res=file.makeCopy(copyName,subFldr);
      if (file.getMimeType() == MimeType.GOOGLE_APPS_SCRIPT) {
        Drive.Files.update({"parents": [{"id": subFldr.getId()}]}, res.getId(), null, {"supportsTeamDrives":true}); // Added
      }

答案 1 :(得分:0)

file.makeCopy()方法具有3个重载:

//Accepts no parameters
file.makeCopy();

//Accepts a name parameter as a string
file.makeCopy(name);

//Accepts a destination parameter as an instance of a Folder class
file.makeCopy(destination);

//Accepts 2 parameters, the first of which is name (String) and the second one is destination (Folder).
file.makeCopy(name, destination); 

您正在尝试传递文件夹ID而不是实际文件夹,该文件夹将被解释为文件夹名称(而不是目标名称)。另外,以下代码表示您的'dstFolder'参数是一个字符串,但是您尝试在其上调用'addFile()'方法:

var folderId = data[i][FOLDERID];
var dstFolder = folderId;
dstFolder.addFile(file);

答案 2 :(得分:0)

  • 如果要通过makeCopy将文件复制到另一个文件夹,则应传递一个Folder作为参数,而不是文件夹ID(字符串)。如果提供字符串(您的ID)作为参数,则脚本will interpret将此ID作为您希望复制文件具有的name。因此,您首先应该通过getFolderById(id)将文件夹从其ID中取出。因此,您应该更改此行:
var dstFolder = folderId;

对此:

var dstFolder = DriveApp.getFolderById(folderId);
  • 您正在复制文件,然后检查文件是否为Google Apps脚本项目。我假设您只想复制GAS项目,因此应将其包含在if块中。另外,在if块中,您正在使用addFile,它也可以用于将文件复制到另一个文件夹(它将文件添加到所需的文件夹)。因此,您不需要使用这两个功能,它们的作用基本上相同(将文件复制到所需的文件夹中)。

  • 您正在使用removeFile,如果要将原始文件保留在原始文件夹中,则没有必要。

因此while块可能类似于:

    while (files.hasNext()) {
      var file = files.next();
      if (file.getMimeType() == MimeType.GOOGLE_APPS_SCRIPT) {
        dstFolder.addFile(file);
      }
    }

最后,您的完整代码如下:

function CopiestoFolder() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var data = ss.getDataRange() //Get all non-blank cells
                 .getValues() //Get array of values
                 .splice(1); //Remove header line
  //Define column numbers for data. Array starts at 0.
  var NAME = 0;
  var FOLDERID = 1;

  //For each folder ID listed in spreadsheet, create a copy of
  //each item in the Resume Resources folder.  

  for (var i=0; i<data.length; i++) {
    var name = data[i][NAME];
    var folderId = data[i][FOLDERID];

    var srcFolder = DriveApp.getFolderById("folder ID");
    var dstFolder = DriveApp.getFolderById(folderId);  
    var files = srcFolder.getFiles();

    while (files.hasNext()) {
      var file = files.next();
      if (file.getMimeType() == MimeType.GOOGLE_APPS_SCRIPT) {
        dstFolder.addFile(file);
      }
    }
  }     
}

我希望这会有所帮助。