-1 google-apps-script google-drive-api
我对编写任何类型的脚本都是陌生的,并且正在尝试编写Google Apps脚本来搜索文件夹中的特定字符串,如果找到,则将文件夹移动到另一个文件夹。
我可以复制一个文件夹,但不能移动它,因为复制的文件夹具有与原始文件夹相同的ID,删除一个文件夹会删除另一个文件夹。据我所知,我可以通过从文件夹中删除合适的孩子来实现这一点。我已经在API资源管理器中进行了尝试,它确实达到了我的期望。
问题是我一生都无法解决如何实现script.google.com的Google Drive SDK页面中给出的示例。如果我粘贴示例代码,则会在后面得到一个缺少的名称。操作员错误。没有一个脚本命令允许我删除一个孩子。
这可能是一个简单的问题,是由于我试图通过执行此项目来学习一些JavaScript而引起的,但是对于在Google Script中实现移动功能的任何帮助或建议,我将不胜感激。
具体的问题是:如何实现移动文件夹脚本?这是我正在尝试的方法,但是它同时删除了两个文件夹:
while (contents.hasNext()) {
folder = contents.next();
name = folder.getName();
if (name.search("XYZ") != -1) {
moveFolder = folder;
targetFolder.addFolder(moveFolder) moveFolder.setName('DEL_' +
moveFolder.getName());
removeFolder(moveFolder);
}
}
Run Code Online (Sandbox Code Playgroud)
首先,让我们澄清一些困惑。提供了谷歌Apps脚本,中使用两个驱动相关的“服务” 驱动器服务,并已超出DocsList服务。您引用的文档是针对Google Drive SDK的,这不是同一回事。如果您使用Google Apps脚本编程,请忽略SDK文档。
接下来,让我们来谈谈什么是文件夹或文件是在驱动器,以及如何影响的“复制”,“移动”和“删除”的概念。文件或文件夹可能有一个文件夹作为父文件夹。实际上,它可能有多个父母。如果要将相同的文件或文件夹“复制”到另一个文件夹,则只需将其作为子文件夹添加到目标文件夹。在这一点上,看起来我们有两个具有相同ID的项目-但实际上我们只有一个有两个父项的项目。然后,如果我们从原始文件夹中删除文件或文件夹(以某种方式将其删除),则该文件或文件夹将留有一个父对象,这看起来像是“移动”。该文件或文件夹将不会被“删除”。另一方面,如果不是删除父/子关系, 删除文件或文件夹,就像您所描述的,我们似乎已经“删除了两个文件夹”。
因此,您的“移动”脚本需要添加一个新的父/子关系,并删除另一个。
在编辑器中打开新脚本时出现的Drive起动器脚本包含一个名为的函数moveFileToFolder()。

此功能可以满足您的需求,只是它要移动的东西是文件。但是,用于文件的方法具有文件夹的表亲,因此您可以做一些替换以得到最终结果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);
};
Run Code Online (Sandbox Code Playgroud)
如果要处理文件夹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);
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2141 次 |
| 最近记录: |