在Google云端硬盘中实施文件夹移动功能

时间:2013-08-23 02:56:13

标签: google-apps-script google-drive-api

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

我可以复制文件夹,但不能移动它,因为复制的文件夹与原始文件夹具有相同的ID,删除一个文件夹会删除另一个文件夹。从我能够弄清楚我可以通过从文件夹中删除正确的孩子来实现这一点。我在API资源管理器中尝试了这一点,它完成了我的期望。

问题是我不能为我的生活弄清楚如何实现Google Drive SDK page in script.google.com中给出的例子。如果我粘贴示例代码后,我会得到一个丢失的名字。操作员错误。没有任何脚本命令允许我删除子项。

可能这是一个简单的问题,源于我尝试通过这个项目学习一些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);
  }
}

1 个答案:

答案 0 :(得分:4)

首先,让我们澄清一些困惑。两个与驱动相关的服务"提供在Google Apps脚本中使用,Drive ServicesDocslist Services 。您引用的文档适用于Google Drive SDK,这不是一回事。如果您要在Google Apps脚本中进行编程,请忽略SDK文档。

接下来,让我们来谈谈云端硬盘驱动器上 的文件夹或文件,以及它如何影响"复制",""移动&#的概念34;和"删除"。文件或文件夹可以将文件夹作为父级。事实上,它可能有多个父母。如果我们想要拥有相同的文件或文件夹"复制"到另一个文件夹,我们只是将它作为子文件添加到目标文件夹。在这一点上,我们可能看起来有两个具有相同ID的项目 - 但我们实际拥有的是一个有两个父项的项目。如果我们然后从原始文件夹中删除文件或文件夹(在某种程度上取消它),它将留下一个父项,这将显示为" move"。文件或文件夹不会被删除"。另一方面,如果不是删除父/子关系,我们 DO 删除文件或文件夹,我们就会删除这两个文件夹",因为你有描述

所以,你的"移动"脚本需要添加新的父/子关系,并删除另一个。

在编辑器中打开新脚本时显示的 Drive 启动脚本包含一个名为moveFileToFolder()的函数。

Screenshot

此功能可以满足您的需求,除了它移动的东西是文件。但是,用于文件的方法具有文件夹的表兄弟,因此您可以进行一些替换,最终得到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);
};

如果您要处理文件夹名称,则需要使用getFoldersByName()收集所有匹配的文件夹,然后使用next()进行迭代。以下是如何修改该功能以使用文件夹名称。为简化起见,它假设只有 ONE 文件夹具有给定名称,并且如果不是这种情况则抛出异常。一旦我们掌握了我们感兴趣的文件夹,该功能的余额将与前一个示例保持一致。

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);
};