2013-02-04 211 views
2

有没有办法复制和重命名文件,并将该副本移动到特定的文件夹,而不需要在根文件夹中有第二个副本?我已经使用了复制,重命名和按不同顺序移动的组合,但每次我最终都会得到重命名文件的根驱动器副本。这是默认情况下?至少可以说是令人讨厌的。如何将文件复制并移动到Google Apps脚本中的文件夹?

回答

2

是的,Google不提供移动方法有点奇怪。但是,考虑到驱动器是如何工作的,并且文件可以属于多个文件夹,那么您就有自己的动作。下面是一个简单的移动功能,我写道:

// 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”文件夹。

+0

当使用'file.makeCopy'时,新创建的文件位于根文件夹中,因此您不需要所有这些'getParents'的东西。保持简单;-) –

+1

@Sergeinsas你假设我写这个函数只移动新鲜的副本。永远不要做任何事 – juanitogan

+0

我没有假设任何东西:你写了“像这样使用...做一个备份副本...” –

7

编辑︰我看了你原来的问题(在编辑之前),并从那里我明白了你有关文件和文件夹如何在Google云端硬盘中工作的困惑。

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

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

你必须做的唯一事情就是在文件夹中获取新文件并且不在根目录中显示它“根标签”。

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

因此,考虑Google Drive是一个非常大的磁盘单元,它拥有数十亿个文件,无法移动,但您可以根据需要粘贴尽可能多的标签;-)(最重要的标签是您的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对象ANF的folder对象,你可以得到从许多不同的方法,请参阅DocsList documentation了解如何获取它的详细信息,但如果您需要但我想您已经知道;-)

+0

谢谢你的回答也帮助了我。我想知道这是怎么回事,为什么有两个副本。我希望我去上这种学校。 – zachdyer

0

在新版本的Google应用程序脚本中,您需要实现的任务是如下:

file.makeCopy("new name", folder); 
相关问题