如何使用Google Apps脚本在个人Google云端硬盘和团队驱动器之间移动文件?

时间:2017-04-24 18:42:34

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

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

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

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云端硬盘文件夹的网址与以下格式匹配:https://drive.google.com/drive/folders/<alphanumericID>。虽然它可能有点不合适,但我可以在各种操作场景和条件下测试我的代码,只需在Web浏览器中打开Goog​​le Drive文件夹的不同组合,选择文件夹URL的<alphanumericID>部分,然后手动复制 - 并将此字符串的值粘贴到<sourceID><destID>

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

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

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

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

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

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

案例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>是Team Drive中的文件夹,而<destID>是我个人Google云端硬盘中的文件夹:

与案例3相同的错误。

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

所以,我认为必须可能通过Google的API实现mv命令,不知何故,因为他们显然已经为GUI界面的用户完成了它。 / p>

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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