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

2023-12-29

最近,我通过 Google 访问了 Google Team DriveTeam Drive 早期采用者 https://gsuiteupdates.googleblog.com/2016/11/google-team-drives-early-adopter.html程序。

I 创建了一个 Google 文档文件 https://developers.google.com/apps-script/overview called Hello, world!,然后编写了一个简短的 Google Apps 脚本函数,该函数使用addFile() https://developers.google.com/apps-script/reference/drive/folder#addFile(File)更新文件附加到的 Google Drive 文件夹的方法:

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

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

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

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

对于情况 1,我还可以让脚本表现得更像mv只需附加一行即可命令,source.removeFile(file);到文件迭代器循环的末尾。

Case 2: <sourceID>是我个人 Google 云端硬盘中的一个文件夹<destID>是团队云端硬盘中的一个文件夹:

在这种情况下,脚本的行为就像mv默认情况下命令,而不是作为符号链接,即使没有额外调用removeFile() https://developers.google.com/apps-script/reference/drive/folder#removeFile(File)我在案例 1 中提到的方法:即Hello, world!文件只是从我的个人驱动器中消失并重新出现在团队驱动器中。

Case 3: <sourceID> and <destID>都是 Google Team Drive 中的文件夹:

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

Case 4: <sourceID>是团队云端硬盘中的文件夹,而<destID>是我个人 Google 云端硬盘中的一个文件夹:

与情况 3 相同的错误。

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

所以,我认为一定是possible实施一个mv不知何故,他们已经通过 Google 的 API 执行了命令,因为他们显然已经为 GUI 界面的用户做到了这一点。

因此我的问题是:鉴于它是经验上可能的要在个人驱动器和团队驱动器中的文件夹的任意组合之间来回移动文件,我实际上会如何做到这一点,仅使用 Google Apps 脚本提供的 API 调用?

另外,还有一个额外问题:假设与案例 1 类似,我实际上想创建一个将文件附加到两个文件夹的符号链接,而不是在同一团队云端硬盘中的两个不同文件夹之间移动文件 - 我将如何使用Google API 也能做到这一点吗? (即,如何让案例 3 表现得更像案例 1?)


Google Team Drives 最近才开始允许使用一般脚本。我可以想象在情况 2 中您能够实现的文件移动甚至不是预期的。团队驱动器仍然存在一些限制(例如您无法移动文件夹)。

对于情况 1,我可以简单地指出您的脚本实际上并不是移动命令。您实际上应该将 Google Drive 文件夹想象为 Gmail 标签。文件可以根本没有文件夹。您的脚本只是为文件分配一个标签,因此它可以出现在许多文件夹中(就像电子邮件可以有许多 Gmail 标签并出现在每个标签“文件夹”中一样)。

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

Drive REST api 最近(约三月初)更新为与团队驱动器配合使用:https://developers.google.com/drive/v3/web/about-teamdrives https://developers.google.com/drive/v3/web/about-teamdrives因此,我相信从技术上讲,您正在寻找的东西是可以完成的,但是考虑到团队驱动器仍然存在一些限制,我认为它不会被记录得很好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐