将已删除的google驱动器文件还原到目标文件夹

时间:2013-01-25 08:58:06

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

我需要将目前在我的google驱动器垃圾箱中的所有文件移动到某个文件夹,或者如果无法完成,请将它们恢复到原始位置。发生了一些乱七八糟的事情,我在垃圾桶里有一些有价值的文件,其中有6个,所以我更愿意将它们移到一个单独的目录中,备份它或在本地​​同步并稍后查看这些文件。

这是我到目前为止的脚本:

function moveFilesFromTrash() {
  var pageSize = 200;
  var files = null;
  var token = null;

  var cestisti = DocsList.getFolder('cestisti');

  do {
    var result = DocsList.getAllFilesForPaging(pageSize, token);
    files = result.getFiles();
    token = result.getToken();
    for (var i = 0; i < files.length; i++) {
      if (files[i].isTrashed == true) {
        Logger.log(files[i].getName());
//      files[i].setTrashed(false)
        files[i].addToFolder(cestisti);
    }
  } while (files.length == pageSize);
}

问题是它不起作用。

通过文件项翻页的代码部分可以正常工作,我是从我的其他工作脚本中获取的。我只是不知道它是否解析垃圾文件夹或标签。我不知道setTrashed()addtofolder()是否有效 - 我不知道。现在前者被注释掉了,因为我更愿意复制项目而不是恢复它们,但如果不可能,我可以恢复。

3 个答案:

答案 0 :(得分:1)

试   if(files [i] .isTrashed()== true)

我建议您放入一些诊断程序(Logger.log)来缩小问题范围

答案 1 :(得分:1)

由于DocsList已弃用,此答案已更新,现在始终使用DriveApp方法。

您必须在移动文件之前取消删除文件,但这样做可以完成您所追求的目标。这是算法:

  1. 获取所有已删除文件的文件(或文件ID)列表
  2. 对于每个文件,
    • 取消删除/取消删除文件
    • 将文件移至目标文件夹(详细信息:从原始文件夹中删除文件,添加到目标恢复文件夹)
  3. 这个答案提供了完成此操作的脚本片段;完整脚本在gist中以Google表格插件的形式提供,包含菜单和用户界面元素。

    恢复所有已删除的文件

    此函数使用DriveApp.search()获取所有已删除文件的列表,然后将它们恢复到指定的文件夹rescueFldr,如果尚未创建,则会创建该文件夹。

    /**
     * Untrash then move all trashed files to rescue folder.
     * From: http://stackoverflow.com/a/14541247/1677912
     * 
     * @returns {Number}   Count of Rescued files.
     */
    function rescueAllFiles() {
      // Find or create target folder
      var rescueFldrIterator = DriveApp.getFoldersByName(rescueFldrName);
      var rescueFldr = rescueFldrIterator.hasNext() ? rescueFldrIterator.next() : DriveApp.createFolder(rescueFldrName);
    
      // Get file iterator with all trashed files
      var trashed = DriveApp.searchFiles('trashed=true');
    
      var count = 0;
      while (trashed.hasNext()) {
        var file = trashed.next();
        // Untrash the file
        if (rescueFile( file, rescueFldr )) count++;
      }
      return(count);
    };
    

    恢复特定的已删除文件

    如果您想要更多地控制将要恢复的文件,并且您不能简单地修改上面使用的搜索参数,另一种方法可能是在电子表格中列出文件ID,并让脚本使用该作为其输入。

    使用已删除的文件填充电子表格

    /**
     * Get array of files in user's Google Drive trash, and write
     * into currently active sheet.
     * From: http://stackoverflow.com/a/14541247/1677912
     * 
     * @returns   {Object[]}   Array of DriveApp file objects
     */
    function getTrashedFiles() {
      var trashedSearch = DriveApp.searchFiles('trashed=true');
      var files = [];
      files.push(["ID","File Name","Type","URL"]);
      while (trashedSearch.hasNext()) {
        var file = trashedSearch.next();
        files.push([file.getId(),file.getName(),docTypeToText_(file.getMimeType()),file.getUrl()]);
      }
      var sheet = SpreadsheetApp.getActiveSheet();
      sheet.clear();
      sheet.getRange(1, 1, files.length, files[0].length)
           .setValues(files);
      return files;
    }
    

    手动文件ID集合

    (自动检索的替代方法,仅供参考。)既然你只是做了一次,那就让我们作弊吧。在“文件列表”页面的底部,使用API​​资源管理器检索所有已删除文件的ID!

    API Explorer file list

    如果您从脚本调用API,则输出显示就像您收到的一样。

    File list output

    Cut&amp;将输出粘贴到文本文件中,然后将其剥离为文件ID。 (我使用gvim执行此操作,只需几个命令。)将结果保存为csv文件,并将其作为电子表格将其拉入云端硬盘。这就是它的样子。 (包括标题行;脚本假定有一个标题行。)

    spreadsheet with trashed file ids

    处理已删除的文件

    现在,已删除文件的列表位于电子表格中,编写了恢复文件和脚本。搬家很容易。

    /**
     * Untrash then move files listed in spreadsheet to rescue folder.
     * From: http://stackoverflow.com/a/14541247/1677912
     * 
     * @returns {Number}   Count of Rescued files.
     */
    function rescueListedFiles() {
      var fileList = SpreadsheetApp.getActiveSheet()
                                   .getDataRange().getValues()
                                   .splice(1);  // Skip header line
      // Find or create target folder
      var rescueFldrIterator = DriveApp.getFoldersByName(rescueFldrName);
      var rescueFldr = rescueFldrIterator.hasNext() ? rescueFldrIterator.next() : DriveApp.createFolder(rescueFldrName);
    
      var count = 0;  
      for (var i=0; i<fileList.length; i++) {
        var fileId = fileList[i][0];
        var file = DriveApp.getFileById(fileId);
        // Untrash the file
        if (rescueFile( file, rescueFldr )) count++;
      }
      return( count );
    };
    

答案 2 :(得分:1)

请记住,文件不在文件夹中。文件具有称为文件夹的标签,并且可以有多个文件夹(标签)。甚至'破坏'也是一个标签。设置为垃圾桶只会创建一个覆盖其他标签(文件夹)的已删除标签。下面的代码不会移动任何东西。它只是重置标签(文件夹) 编辑:Trashed不是标签,而是条件:其他所有内容

    for (var i = 0; i < files.length; i++) {
      if (files[i].isTrashed()) {  // don't forget ()
        Logger.log(files[i].getName());
        var folders = files[i].getParents();
        // remove existing folders(labels)
        for(var f = 0; f < folders.length; f++ ) {
          files[i].removeFromFolder( folders[f] );
        };
        // remove trashed label
        files[i].setTrashed(false);
        // add cestisti label(add to cestisti folder)
        files[i].addToFolder(cestisti);
       }
    }