DriveApp.removeFile的真正目的是什么?

时间:2017-10-04 12:15:33

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

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());
}

但是此代码的结果是仅从我的云端硬盘网络界面中删除可视文件(我不使用客户端),但文件(从文档中)仍然是存在于"所有项目"。

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

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开发者已经考虑"semantic" difference between remove and delete实施了这些方法?

2 个答案:

答案 0 :(得分:1)

将Google云端硬盘“文件夹”视为附加到文件的标签,即我们在Gmail中附加标签的方式。这实际上就是它们,它们的功能与硬盘上的目录不同。可能存在没有任何标签的文件,也可能有多个标签。方法folder.remove(file)从驱动器中删除该文件夹的标签。并DriveApp.remove(file)执行相同的操作,但标签为“我的驱动器”。 “从其所有父母中删除”意味着您从文件中删除所有标签,包括“我的云端硬盘”。你还有文件。

  

是否有任何实际的方法可以完全删除文件而不通过垃圾箱并且不使用高级服务?

不,没有。脚本文件删除是一项危险的操作,考虑到脚本是共享的,其中一些是恶意的。因此谷歌决定以这种方式限制可能的损害,因为在没有明确启用高级服务的情况下不允许通过GAS直接删除。

答案 1 :(得分:0)

DriveApp.removeFile只需从用户的云端硬盘中删除指定的文件即可。此方法不会删除文件,但如果从其所有父项中删除文件,则无法在驱动器中看到该文件,除非通过搜索或使用"所有项目"视图。正如此thread中所述,GAS中没有直接的方法可以删除文件而不将其发送到垃圾箱或清空垃圾箱。