-1

我对编写任何类型的脚本都很陌生,我正在尝试编写一个 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);
  }
}
4

1 回答 1

6

首先,让我们澄清一些困惑。Google Apps Script 、Drive ServicesDocslist 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);
};
于 2013-09-06T21:18:39.380 回答