首先,让我们澄清一些困惑。Google Apps Script 、Drive Services和Docslist Services提供了两个与 Drive 相关的“服务” 。您引用的文档适用于Google Drive SDK,这不是一回事。如果您使用 Google Apps 脚本进行编程,请忽略 SDK 文档。
接下来,让我们谈谈 Drive 上的文件夹或文件是什么,以及它如何影响“复制”、“移动”和“删除”的概念。文件或文件夹可能有一个文件夹作为父文件夹。事实上,它可能有多个父母。如果我们想将相同的文件或文件夹“复制”到另一个文件夹,我们只需将其作为子文件夹添加到目标文件夹。在这一点上,看起来我们有两个具有相同 ID 的项目 - 但我们实际上拥有的是一个有两个父项的项目。如果我们然后从原始文件夹中删除文件或文件夹(在某种程度上不拥有它),它将留下一个父级,这将看起来像“移动”。该文件或文件夹不会被“删除”。另一方面,如果不是删除父/子关系,删除文件或文件夹,看起来我们已经“删除了两个文件夹”,正如您所描述的。
因此,您的“移动”脚本需要添加新的父/子关系,并删除另一个。
在编辑器中打开新脚本时显示的DrivemoveFileToFolder()
启动器脚本包含一个名为.
这个函数做你正在寻找的东西,除了它正在移动的东西是一个文件。但是,用于文件的方法具有用于文件夹的表亲,因此您可以进行一些替换以结束moveFolderToFolder()
:
/**
* This script moves a specific folder into a given folder, and removes the folder
* from all other folders that previously contained it. For more information on
* interacting with files, see
* https://developers.google.com/apps-script/drive/file
*/
function moveFolderToFolder(sourceFolderId, targetFolderId) {
var targetFolder = DriveApp.getFolderById(targetFolderId);
var sourceFolder = DriveApp.getFolderById(sourceFolderId);
var currentFolders = sourceFolder.getParents();
while (currentFolders.hasNext()) {
var currentFolder = currentFolders.next();
currentFolder.removeFolder(sourceFolder);
}
targetFolder.addFolder(sourceFolder);
};
如果要处理文件夹Names,则需要使用getFoldersByName()
收集所有匹配的文件夹,然后将使用迭代next()
到列表中。以下是如何修改该函数以使用文件夹名称。为简化起见,它假设只有一个具有给定名称的文件夹,如果不是这样,则抛出异常。一旦我们对感兴趣的文件夹有了句柄,函数的平衡就与前面的例子一样。
function moveNamedFolderToFolder(sourceFolderName, targetFolderName) {
var matchedFolders = DriveApp.getFoldersByName(sourceFolderName);
if (matchedFolders.hasNext()) {
var sourceFolder = matchedFolders.next();
if (matchedFolders.hasNext()) throw new Error( "Source Folder Name not unique" );
}
matchedFolders= DriveApp.getFoldersByName(targetFolderName);
if (matchedFolders.hasNext()) {
var targetFolder = matchedFolders.next();
if (matchedFolders.hasNext()) throw new Error( "Target Folder Name not unique" );
}
var currentFolders = sourceFolder.getParents();
while (currentFolders.hasNext()) {
var currentFolder = currentFolders.next();
currentFolder.removeFolder(sourceFolder);
}
targetFolder.addFolder(sourceFolder);
};