使用文件名

时间:2019-10-11 01:08:51

标签: file google-apps-script google-drive-api copy

我在Google云端硬盘帐户中有两个文件夹。 “文件夹1”和“文件夹2”。 在“文件夹1”中有多个文件。可以说有一个文件名Test.txt,我想使用Driveapp将Test.txt文件复制到“文件夹2”。我找到了代码,但是它只能与“文件唯一ID”一起使用,无论如何,我们只能通过文件名来创建它吗?

function copyfile() {

var file = DriveApp.getFileById("1pkwQ9te-EtpqC_NC3BoHzOTUoC7axZDcAfxrqMgslwg");

var source_folder = DriveApp.getFolderById("0B8_ub-Gf21e-fkxjSUwtczJGb3picl9LUVVPbnV6Vy1aRFRWc21IVjRkRjBPTV9xMWJLRFU")

var dest_folder = DriveApp.getFolderById("0B8_ub-Gf21e-flJ4VmxvaWxmM2NpZHFyWWxRejE5Y09CRWdIZDhDQzBmU2JnZnhyMTU2ZHM")
// Make a backup copy.

var file2 = file.makeCopy('BACKUP ' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd') + '.' + file.getName());
dest_folder.addFile(file2);

source_folder.removeFile(file2);
  }

如果我使用文件名而不是File Unqiue ID,则会出现错误:

  

“ TypeError:在对象FileIterator中找不到函数makeCopy。”

1 个答案:

答案 0 :(得分:1)

  • 您要通过更改文件名将源文件夹中文件名为Test.txt的文件复制到目标文件夹。
  • 您要使用文件名复制文件。
  • 您想使用Google Apps脚本实现这一目标。

如果我的理解是正确的,那么该修改如何?

修改点:

  • 为了使用文件名检索文件,请使用getFilesByName()方法。在这种情况下,将返回“ FileIterator”,因为相同文件名的文件可以存在于Google云端硬盘中。
    • 将文件名用于getFileById(fileId)时,会发生错误。
    • 使用此方法,为了检索特定文件夹中的文件,请修改为source_folder.getFilesByName(filename)
  • 复制文件后,可以使用makeCopy(name, destination)的方法。这样,可以将文件直接复制到目标文件夹。

修改脚本后,它如下所示。

模式1:

在这种模式下,使用文件夹ID。

修改后的脚本:

function copyfile() {
  var filename = "Test.txt";
  var sourceFolderId = "0B8_ub-Gf21e-fkxjSUwtczJGb3picl9LUVVPbnV6Vy1aRFRWc21IVjRkRjBPTV9xMWJLRFU";
  var destinationFolderId = "0B8_ub-Gf21e-flJ4VmxvaWxmM2NpZHFyWWxRejE5Y09CRWdIZDhDQzBmU2JnZnhyMTU2ZHM";
  var source_folder = DriveApp.getFolderById(sourceFolderId);
  var file = source_folder.getFilesByName(filename);
  if (file.hasNext()) {
    var dest_folder = DriveApp.getFolderById(destinationFolderId);
    var srcFile = file.next();
    var newName = 'BACKUP ' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd') + '.' + srcFile.getName();
    srcFile.makeCopy(newName, dest_folder);
  }
}
  • 运行脚本时,如果源文件夹中存在文件名Test.txt的文件,则该文件将被复制到目标文件夹。

模式2:

在此模式下,使用文件夹名称。

修改后的脚本:

function copyfile() {
  var filename = "Test.txt";
  var sourceFolderName = "Folder 1";
  var destinationFolderName = "Folder 2";
  var source_folder = DriveApp.getFoldersByName(sourceFolderName).next();
  var file = source_folder.getFilesByName(filename);
  if (file.hasNext()) {
    var dest_folder = DriveApp.getFoldersByName(destinationFolderName).next();
    var srcFile = file.next();
    var newName = 'BACKUP ' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd') + '.' + srcFile.getName();
    srcFile.makeCopy(newName, dest_folder);
  }
}
  • 在这种情况下,它假设Folder 1Folder 2的文件夹已存在于Google云端硬盘中。

参考:

如果我误解了您的问题,而这不是您想要的方向,我深表歉意。

编辑:

  • 您要复制文件夹Folder 1中的两个文件“ Test.txt”和“ Test2.txt”。

在这种情况下,以下脚本如何?

示例脚本1:

function copyfile() {
  var filenames = ["Test.txt", "Test2.txt"];
  var sourceFolderName = "Folder 1";
  var destinationFolderName = "Folder 2";
  var source_folder = DriveApp.getFoldersByName(sourceFolderName).next();
  for (var i = 0; i < filenames.length; i++) {
    var filename = filenames[i];
    var file = source_folder.getFilesByName(filename);
    if (file.hasNext()) {
      var dest_folder = DriveApp.getFoldersByName(destinationFolderName).next();
      var srcFile = file.next();
      var newName = 'BACKUP ' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd') + '.' + srcFile.getName();
      srcFile.makeCopy(newName, dest_folder);
    }
  }
}
  • 如果要添加文件名,请将它们添加到filenames数组中。

示例脚本2:

如果要将Folder 1文件夹中的所有文件复制到Folder 2文件夹中,则可以使用以下脚本。

function copyfile() {
  var sourceFolderName = "Folder 1";
  var destinationFolderName = "Folder 2";
  var source_folder = DriveApp.getFoldersByName(sourceFolderName).next();
  var files = source_folder.getFiles();
  var dest_folder = DriveApp.getFoldersByName(destinationFolderName).next();
  while (files.hasNext()) {
    var srcFile = files.next();
    var newName = 'BACKUP ' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd') + '.' + srcFile.getName();
    srcFile.makeCopy(newName, dest_folder);
  }
}