在Google Dirve中实现文件夹移动功能

-1 google-apps-script google-drive-api

我对编写任何类型的脚本都是陌生的,并且正在尝试编写Google Apps脚本来搜索文件夹中的特定字符串,如果找到,则将文件夹移动到另一个文件夹。

我可以复制一个文件夹,但不能移动它,因为复制的文件夹具有与原始文件夹相同的ID,删除一个文件夹会删除另一个文件夹。据我所知,我可以通过从文件夹中删除合适的孩子来实现这一点。我已经在API资源管理器中进行了尝试,它确实达到了我的期望。

问题是我一生都无法解决如何实现script.google.comGoogle 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)

Mog*_*dad 5

首先,让我们澄清一些困惑。提供了谷歌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)