【问题标题】:Google apps script to delete old files permanently and keep last 100 files谷歌应用脚​​本永久删除旧文件并保留最后 100 个文件
【发布时间】:2013-02-25 22:19:56
【问题描述】:

我在我的根 google Drive 中创建了一个包含视频文件 (.avi) 的文件夹。当文件总数超过100个文件时,我需要编写一个谷歌应用程序脚本来永久删除旧视频文件吗?即删除除最后(较新)100 个文件之外的所有视频文件。

每个文件的名称都与该文件的创建时间相关,例如:2013-02-25__20-29-45-01.avi

2013-02-25__20-24-49-09.avi

2013-02-25__18-26-24-08.avi

......

所以我认为脚本应该首先按字母顺序列出这些文件,以新文件开头并以旧文件结尾,然后保留前 100 个文件并永久删除所有其他文件。 我知道如何在 bash 脚本中执行此操作,但在我认为他们使用 javascript (.gs) 的谷歌驱动器中不知道。

【问题讨论】:

  • 不确定是否有人会为您完成这项工作,这不是 sto 应该的工作方式...see the faq about that
  • 是的,我知道,有一些例外......;-) 我发现这个想法对我个人使用很有趣......顺便说一句,这只需要一些修改即可使其适用于您的用例,试一试,如果您遇到问题,我会很乐意(或其他人)提供帮助。
  • 在这里发布我的问题之前,我尝试了两天来编辑上面链接中的代码但没有成功,因此我在这里写了我的请求。

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


【解决方案1】:

正如我在 cmets 中所说,您提到的脚本与您想要的相差不远……但我承认您的情况有点复杂,所以假设这将是 sto 政治的另一个例外 ;-)

也就是说,我没有彻底测试这段代码,所以它可能需要一些调整。我在整个脚本中留下了一些注释日志来测试中间结果,不要犹豫使用它们。另外,考虑更新邮件地址,不要忘记setTrashed 可以手动反转;-)(在尝试新代码时更好)

编辑:我今天早上花了一些时间来测试脚本,它有几个“近似值”;-) 这是一个运行良好的“干净”版本

function DeleteMyOldAvi() {
    var pageSize = 200;
    var files = null;
    var token = null;
    var i = null;
    var totalFiles = []
    var toDelete = []
    Logger.clear()

    do {
    var result = DocsList.getAllFilesForPaging(pageSize, token);
    var files = result.getFiles()
    var token = result.getToken();
        for(n=0;n<files.length;++n){
            if(files[n].getName().toLowerCase().match('.avi')=='.avi'){
              totalFiles.push([files[n].getName(),files[n].getDateCreated().getTime(),files[n].getId()]);// store name, Date created in mSec, ID in a subarray
//            Logger.log(files[n].getName()+' created on '+Utilities.formatDate(files[n].getDateCreated(), 'GMT','MMM-dd-yyyy'))
            }
          }    
     } while (files.length == pageSize);// continue until job is done

     totalFiles.sort(function(x,y){ // sort array on milliseconds date created (numeric/descending)
                var xp = x[1];
                var yp = y[1];
                return yp-xp ;
                 });
//     Logger.log(totalFiles.length)

       if(totalFiles.length>100){

        for(nn=totalFiles.length-1;nn>=100;nn--){
          toDelete.push(totalFiles[nn]) ;// store the files to delete
           }
//       Logger.log(toDelete)

        for(n=0;n<toDelete.length;++n){
          var file = toDelete[n]
          DocsList.getFileById(file[2]).setTrashed(true);// move to trash each file that is in the toDelete array
          Logger.log(file[0]+' was deleted');// log the file name to create mail message
          }
          MailApp.sendEmail('myMail@gmail.com', 'Script AUTODELETE report', Logger.getLog());// send yourself a mail
       }else{
          MailApp.sendEmail('myMail@gmail.com', 'Script AUTODELETE report', 'No file deleted');// send yourself a mail
       }
 } 

【讨论】:

  • 感谢 Serge 为编写脚本所付出的努力,我今天测试一下并回复您。
  • 好的,谢谢,你解决了我的问题的第一部分,它对超过 100 个旧 (avi) 文件进行了排序,但它会将它们发送到垃圾箱!不要永久删除它们!我的意思是我想永远删除它们,因为将文件发送到垃圾箱不会释放谷歌驱动器中的一些空间!你知道如何永久删除它们吗?
  • AFAIK 在 GAS 中没有直接的方法来删除文件而不将它们发送到垃圾箱或清空垃圾箱......我认为可以使用对外部 API 的调用,但我建议提出一个关于这个主题的新问题,因为我不知道如何......(我也很感兴趣;-)。同时请考虑采纳答案,值 15 分不是吗?
  • @Sergeins 我们在这里讨论了这个话题:stackoverflow.com/questions/46564653
猜你喜欢
  • 2020-05-14
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多