首页 文章

如何使用Google Apps脚本在个人Google Drives和Team Drives之间移动文件?

提问于
浏览
1

最近,我通过Google的Team Drive early adopter计划访问了Google Team Drive .

created a Google Docs file调用 Hello, world! ,然后编写了一个简短的Google Apps脚本函数,该函数使用addFile()方法更新文件附加到的Google Cloud 端硬盘文件夹:

function move_or_link_file() {
  var source = DriveApp.getFolderById("<sourceID>");
  var fileiter = source.getFilesByName("Hello, world!");
  var dest = DriveApp.getFolderById("<destID>");
  while (fileiter.hasNext()) {
    var file = fileiter.next();
    dest.addFile(file);
  }
}

通常,Google Cloud 端硬盘文件夹的网址与以下格式相符: https://drive.google.com/drive/folders/<alphanumericID> . 虽然它可能有点不合适,但我可以在各种操作场景和条件下测试我的代码,只需在Web浏览器中打开Google Drive文件夹的不同组合,选择文件夹URL的 <alphanumericID> 部分,然后手动复制和粘贴值将此字符串分为 <sourceID><destID> .

经过测试,我能够识别出导致三种不同行为的四种不同输入条件:

案例1:<sourceID>和<destID>都是我个人Google Cloud 端硬盘中的文件夹:

在这种情况下,脚本的行为就像它正在创建一个符号链接一样: Hello, world! 文件现在出现在两个目录中 . 请注意,它实际上是相同的文件,而不是两个相同的副本:例如,如果我打开文档,那么文档URL(如文件夹URL)也遵循以下模式: https://docs.google.com/document/d/<documentID>/edit . 我可以告诉该文件是相同的,因为当我打开它时,文档的URL共享相同的 <documentID> ,无论我使用哪个父文件夹来访问它 .

对于案例1,我还可以通过在文件迭代器循环的末尾附加一行额外的行 source.removeFile(file); 来使脚本更像 mv 命令 .

案例2:<sourceID>是我个人Google Cloud 端硬盘中的文件夹,而<destID>是 Cloud 端硬盘中的文件夹:

在这种情况下,默认情况下脚本的行为类似于 mv 命令,而不是作为符号链接,即使没有我在案例1中提到的removeFile()方法的额外调用:即, Hello, world! 文件只是从我的个人驱动器中消失并重新出现在团队驱动器中 .

案例3:<sourceID>和<destID>都是Google Team Drive中的文件夹:

这会导致来自Google Apps脚本的错误消息: Cannot use this operation on a Team Drive item. (line 7, file "move_or_link_file") .

案例4:<sourceID>是团队驱动器中的文件夹,而<destID>是我个人Google Cloud 端硬盘中的文件夹:

与案例3相同的错误 .

现在这里有一个非常奇怪的部分:GSuite图形用户界面(即,当您通过Web浏览器访问Google Drive文件和文件夹时使用的内容)通过右键单击时出现的弹出窗口提供 Move 命令文件 . 这个类似于Unix的 mv 命令的GUI版本对于上述所有四种情况都表现相同:无论您是在个人驱动器或团队驱动器之间来回移动文件夹,还是在驱动器内部移动,都可以正确并且每次都将文件移动到您期望的位置 .

因此,我认为必须能够通过Google 's API, somehow, given that they'实现 mv 命令,显然已经为GUI界面的用户完成了它 .

因此我的问题是:鉴于经验上可以在个人驱动器和团队驱动器中的文件夹的任意组合之间来回移动文件,我将如何仅使用Google Apps脚本提供的API调用实际执行此操作?

另外,一个额外的问题:假设,与案例1类似,而不是在同一个团队驱动器中的两个不同文件夹之间移动文件,我实际上想要创建一个将文件附加到两个文件夹的符号链接 - 我将如何使用Google API也可以这样做吗? (即,我怎样才能使案例3的行为更像案例1?)

1 回答

  • 1

    Google Team Drives最近才开始允许使用脚本 . 我想象在案例2甚至没有打算的情况下你能够实现的文件移动 . 团队驱动器仍有一些限制(例如,您无法移动文件夹) .

    对于案例1,我可以简单地指出您的脚本实际上不是移动命令 . 您应该将Google Cloud 端硬盘文件夹设想为Gmail代码 . 文件根本没有文件夹 . 您的脚本只是为文件指定了一个标记,因此它可以显示在许多文件夹中(就像电子邮件可以包含许多Gmail标记并显示在每个标记“文件夹”中) .

    它适用于案例2,因为Team Drive是您个人驱动器中的独立实体 . 实质上,当您将其添加到团队驱动器时,您必须放弃该文件的所有权 . 据我所知,团队驱动器认为向其添加文件意味着应该从所有其他父项中删除它 . 我认为这就是为什么在案例3和4中你不能移动任何物品 . 所有者是团队驱动器本身,但命令是作为常规Gsuite用户发送的 .

    驱动REST api最近(3月初开始)更新后与团队驱动器一起工作:https://developers.google.com/drive/v3/web/about-teamdrives所以我相信技术上你正在寻找的东西可以完成,但是考虑到团队驱动器仍有一些限制,我不认为将会记录,也可以 .

相关问题