我如何复制&将文件移动到Google Apps脚本中的文件夹?

时间:2013-02-04 22:04:10

标签: google-apps-script move

有没有办法复制和重命名文件并将该副本移动到特定文件夹而不在根文件夹中有第二个副本?我已经使用了复制,重命名,按不同顺序移动的组合,但每次,我仍然最终得到了根驱动器重命名文件的副本。这是默认的吗?至少可以说很烦人。

3 个答案:

答案 0 :(得分:7)

编辑:我查看了您的原始问题(编辑前),从那里我了解到您对文件和文件夹在Google云端硬盘中的工作方式的困惑。

当您复制文件时,您会在根文件夹中获得一个新文件,当您将此新文件添加到另一个文件夹时,您必须将其视为在此文件上粘贴标签而不创建任何新副本。

您实际上可以在根目录和其他文件夹中看到该文件,但它是具有2个不同标签的同一文件!(您确实注意到,因为您尝试删除它并看到它在两个地方都被删除了)

您必须做的唯一事情就是将新文件放在其文件夹中,而不是在根目录中显示它以删除“根标签”。

这就是Google驱动器的工作方式。当你考虑它并与本地硬盘存储器进行比较时,它就变得合乎逻辑:当你在同一个逻辑驱动器上将文件从一个文件夹移动到另一个文件夹时,你不会移动数据(即磁盘上的字节),而只是告诉它磁盘操作系统,该文件位于地图上的其他位置。

因此,将Google云端硬盘视为一个(非常)大型磁盘机,数十亿个文件无法移动,但您可以根据需要添加多个标签;-)(最重要的标签是您的Google帐户ID !)

在你描述的情况下玩这些标签只需尝试这个简单的功能:

function copyAndMove(file,folder){
var newfile=file.makeCopy('copy of '+file.getName());// here you can define the copy name the way you want...
newfile.addToFolder(folder);//  add the copy to the folder
newfile.removeFromFolder(DocsList.getRootFolder());// and remove it from your root folder
}

测试它只需使用2个必需参数:file对象和folder对象,您可以从许多不同的方法获得该对象,有关如何获取的详细信息,请参阅DocsList documentation如果你需要,但我想你已经知道了; - )

答案 1 :(得分:6)

在新版本的google apps脚本中,您需要完成以下任务:

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

答案 2 :(得分:2)

是的,谷歌没有提供移动方法有点奇怪。但是,考虑到驱动器如何工作以及文件可以属于多个文件夹,您可以编写自己的移动。这是我写的一个简单的移动函数:

// Moves a file to a new folder by removing all current
// parent folders and then adding the new one.
function moveFileTo(fileObj, folderObj) {
  // Attempt the move only if folderObj has a value.
  // Otherwise, the file will be left without a folder.
  // (Lost files can be found in the "All items" area.)
  if (folderObj) {
    var folders = fileObj.getParents();
    for (var i = 0; i < folders.length; i++) {
      fileObj.removeFromFolder(folders[i]);
    }
    fileObj.addToFolder(folderObj);
    return true;
  }
  return false;
}

基本上,像这样使用它:

var file = DocsList.getFileById(fileID);
var folder = DocsList.getFolder('Some folder name');

// Make a backup copy.
var file2 = file.makeCopy('BACKUP ' + Utilities.formatDate(new Date(), Session.getTimeZone(), 'yyyy-MM-dd') + '.' + file.getName());
// Move the backup file.
if (moveFileTo(file2, folder)) {
  ...

我应该注意到这个简单的功能就是......简单。它假设你可以打击所有父文件夹 - 拥有或共享。如果您不小心,这会对各种用户的各种共享文件夹中的共享文件产生意外后果。但是,它不会删除未与此脚本的用户共享的父文件夹 - 这很好。无论如何,更好地控制事物的一个明显选择是指定“from”文件夹以及“to”文件夹。