【问题标题】:Delete old files删除旧文件
【发布时间】:2017-09-01 09:19:17
【问题描述】:

我需要帮助创建一个 Google Drive 脚本,该脚本将自动删除除 24 个最新文件之外的所有旧文件。

我的网络驱动器每小时向 Google Drive 发送一个打包 7z 的数据库文件,名为:

DATABASENAME_01.09.2017_07.bak.7z

一般格式:

DATABASENAME_DD.MM.RRRR_HH.bak.7z

直接复制 Google Drive 上的文件(我没有任何文件夹)。 我希望将文件删除而不是移动到垃圾箱。这是关于释放空间。

我想雇用 Stackoverflow 上描述的 other solutions,但他们不符合我的要求。

据我所知,该脚本不起作用,因为它使用了旧的 Doclists 函数。不幸的是,我不知道 script.google 中使用的编程语言

【问题讨论】:

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


    【解决方案1】:

    我认为最好的方法是使用DriveApp api。

    您应该使用一些功能:

    • getFiles 允许您选择所有驱动器文件
    • 您收到的FileIterator必须按照getDateCreated()排序
    • 使用removeFile api 删除最旧的文件或使用setTrashed api 将最旧的文件设置为已删除。您可以使用 Drive.Files.emptyTrash() 清空垃圾箱(这是在 Advanced Api 中)。 A 我们会看到这种方法实际上并没有完全删除文件,并且会导致意想不到的结果。
    • 工作方法:必须通过advanced APIDrive.Files(请仔细阅读如何在您的脚本中启用高级API)。这还允许为您要删除的文件创建更快的查询(已经为我们组织它们的查询)

    这或多或少是我为解决您的问题所做的:

    // Get all the files
    files_iterator = DriveApp.getFilesByType("application/7z-compressed");
    
    var file_list = [];
    while (files_iterator.hasNext()) {
      var fl = files_iterator.next();
      file_list.push(fl); 
    }
    
    // Sort the files on date created
    file_list = file_list.sort(function(fl1, fl2) {
      return fl1.getDateCreated() < fl2.getDateCreated();
    });
    
    // Removing uneeded file
    while (file_list.length > 24) {
      var fl = file_list.pop();
      DriveApp.removeFile(fl);
    }
    

    此代码未经测试,可能包含错误。使用它需要您自担风险。

    如果 Mime Type 不起作用,另一种解决方案是列出驱动器中的所有文件,并仅保留文件名以 DATABASENAME 开头的文件:

    var files_iterator = DriveApp.getFiles();
    
    var file_list = [];
    while (files_iterator.hasNext()) {
      var fl = files_iterator.next();
      if (fl.getName().match("DATABASENAME"))
        file_list.push(fl); 
    }
    

    更稳定的版本

    我编写了一个似乎可以正常工作的新版本:

    function myFunction() {
      // Query drive for the files that has name containing "DATABASENAME" as prefix
      // the result (items) is ordered by creating date
      var files = Drive.Files.list({
        q: 'title contains "DATABASENAME"', 
        orderBy: 'createdDate'
      }).items;
      // While keeping the last 24 elements, runs a function
      // for each element of the Array
      files.slice(0, -25).forEach(function(file) {
        // Deletes the file (recognized with its ID)
        Drive.Files.remove(file.id)
      });
    }
    

    如果您不启用高级 API,此功能将不起作用。我已经测试了多次,只剩下最后 24 个元素。您必须等待函数在再次运行之前结束其执行,否则数组可能会变得不一致,并且第二次执行可能会删除不需要的文件。根据您驱动器帐户中的文件数量,list 函数(作为getFiles 函数)执行countedlimited 的查询。此操作非常昂贵,并且每小时运行一次可能会使您超出配额。我建议您每天运行一次

    list 的一个好处是它实际上允许您通过7z mimeType ("application/x-7z-compressed") 的字符串进行搜索:

    Drive.Files.list({
      q: 'mimeType = "application/x-7z-compressed"'
    });
    

    不推荐使用 DriveApp 的第一个版本

    这是我在 AppScript 和 Drive 中实际测试过的版本:

    function myFunction() {
      var file_iterator = DriveApp.getFiles();
    
      var file_list = [];
      while (file_iterator.hasNext()) {
        var fl = file_iterator.next();
        if (fl.getName().match("DATABASENAMES"))
          file_list.push(fl); 
      }
    
      // Sort the files on date created
      file_list = file_list.sort(function(fl1, fl2) {
        return fl1.getDateCreated() < fl2.getDateCreated();
      });
    
      // Removing uneeded file
      while (file_list.length > 24) {
        var fl = file_list.pop();
        // fl.setTrashed(true); // if you want it in the trash
                                // instead of fully removed.
        DriveApp.removeFile(fl);
      }
    }
    

    但这个版本的问题是实际上并没有从驱动器中删除文件。我不明白为什么这个函数实际上存在,我没有看到它的用法。它只会从 view

    中删除文件

    【讨论】:

    • 我将你的代码插入到函数中我得到一个错误:TypeError: The getFilesByMimeType function can not be found in the Drive object 我将函数更改为 getFilesByType (mimeType),其中 mimeType 是“application / x- 7z-compressed" 更改后的函数没有显示任何错误,但谷歌驱动器上的文件没有任何反应。
    • 因此 Google Drive 中可能不存在 mime 类型“application/x-7z-compressed”。不幸的是,您必须制定一个策略来列出您需要的所有文件,例如,您可以列出根目录中的所有文件,然后将名称以“DATABASENAME”开头的所有文件推入文件列表中。
    • 您在定义元素名称的代码中出错:file_iterator。但是,该脚本仍然不起作用。它不会删除文件。当然,我输入了正确的数据库名称。运行脚本时没有错误。
    • 我刚刚在我的云端硬盘中对其进行了测试,它可以正常工作:删除文件而不留在垃圾箱中...长度输入错误(它被写为 lenght...uff)
    • 我发现了一些错误。如何首先运行脚本 - 它工作正常(剩下 24 个文件)。当我打开脚本的时间表时 - 每小时执行一次,结果发现它删除了超过 24 个文件。我手动运行了几个脚本 - 它删除了所有文件。很抱歉现在看到这个,但正如我所提到的 - 脚本第一次完美运行。我希望脚本删除文件并始终拥有 24 个最近的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2021-01-17
    • 2012-12-16
    • 2012-07-08
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多