Google AppScript是一项非常有用的服务,但是有一种我不了解的文件删除机制。相同的讨论适用于文件夹删除。我已经replied some questions on SO where file removal was required,但仍有一些我不清楚的地方。

DriveApp documentation说明了方法DriveApp.removeFile


  从用户云端硬盘的根目录中删除给定的文件。此方法不会删除文件,但是如果从所有父文件中删除了文件,则除非通过搜索文件或使用“所有项目”视图,否则无法在云端硬盘中看到该文件。


我试图用这样的测试脚本来检查这种方法的行为:

function remove() {
  var files = DriveApp.getFilesByName("file_to_remove");
  while (files.hasNext())
    DriveApp.removeFile(files.next());
}


但是此代码的结果是仅从外观上从Drive网络界面中删除文件(我未使用客户端),但是该文件(如来自文档)仍存在于“所有项目”中。

删除文件的另一种方法是将其设置为已删除,因此,在我第一次手动清除垃圾箱时实际上已将其删除:

function trash() {
  var files = DriveApp.getFilesByName("file_to_remove");
  while (files.hasNext())
    files.next().setTrashed(true);
}


但我仍然不喜欢这种方法(文件仍在使用我的一部分-极为有限的:P-配额)。

最后一种方法(这就是我现在正在使用的方法)采用了高级Google服务,例如:

function advanced_remove() {
  var files = DriveApp.getFilesByName("file_to_remove");
  while (files.hasNext())
    Drive.Files.remove(files.next().id);
}


但是我不喜欢使用服务(操作数量有限)。也可以通过Drive对象清空垃圾箱(如果使用前面的示例,则为Drive.emptyTrash()

恕我直言,文件删除是一项非常基本的操作,应通过标准DriveApp API进行,而不是采用无法完全删除文件或要求我手动清空垃圾桶的其他方法。

我的问题是:


removeFile的真正目的是什么?从其所有父级中删除意味着什么(我假设父级是包含文件的文件夹)?
有什么实际方法可以完全删除文件,而无需经过垃圾桶且不使用高级服务?
我不是英语母语人士:也许Google Developers考虑了"semantic" difference between remove and delete实现了这些方法?

最佳答案

将Google云端硬盘“文件夹”视为附加到文件的标签,这就是我们在Gmail中附加标签的方式。它们实际上就是它们,它们的功能不像硬盘驱动器上的目录。一个文件可能存在,没有任何标签,或者可以有多个标签。方法folder.remove(file)从驱动器中删除该文件夹的标签。和DriveApp.remove(file)一样,但标签为“ My Drive”。 “从其所有父项中删除”意味着您从文件中删除了所有标签,包括“我的云端硬盘”。您仍然有文件。


  有什么实际方法可以完全删除文件,而无需经过垃圾箱且不使用高级服务?


不,那里没有。考虑到脚本是共享的,并且其中一些是恶意的,因此删除脚本文件是危险的操作。因此,Google决定以这种方式限制可能的损害,方法是在未经显式启用的高级服务的情况下,不允许通过GAS彻底删除。

关于javascript - DriveApp.removeFile的真正目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46564653/

10-12 19:01