最近,我通过 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?)