【问题标题】:Restore trashed google drive files to a target folder将删除的谷歌驱动器文件恢复到目标文件夹
【发布时间】:2013-01-25 08:58:06
【问题描述】:

我需要将目前在我的 Google 云端硬盘回收站中的所有文件移动到某个文件夹,或者,如果无法完成,请将它们恢复到其原始位置。发生了一些混乱,我在垃圾箱中有一些有价值的文件,其中大约 6 gig,所以我宁愿将它们移动到单独的目录,备份或在本地同步,稍后再查看这些文件。

这是我目前的脚本:

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() 是否有效——我不知道。现在前者被注释掉了,因为我宁愿复制项目而不是恢复它们,但如果这不可能,我可以恢复。

【问题讨论】:

  • 当我有文件 ID 时,我使用了 isTrashed(),所以我知道它有效。但是如何获取已删除文件的文件 ID?到目前为止,我的实验表明 Trash 文件夹不是文件夹,至少不是出现在 getAllFolders() 的结果中的文件夹。还有什么想法吗?
  • 根据this,javascript的驱动api支持undelete,但同样需要文件id。
  • 同意 Mogsdad 对我来说听起来像是一个错误 - 用户的 docslist 是否定义在任何地方以排除垃圾?
  • 驱动 api 还支持查询已删除的项目,因此您可以通过该路线获取已删除的文件

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


【解决方案1】:

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

在移动文件之前,您必须取消垃圾箱,但这样做会完成您所追求的目标。算法如下:

  1. 获取所有已删除文件的文件列表(或文件 ID)
  2. 对于每个文件,
    • 取消删除/取消回收文件
    • 将文件移动到目标文件夹(详情:从原始文件夹中删除文件,添加到目标恢复文件夹)

这个答案提供了脚本的 sn-ps 来完成这个;完整的脚本可在gist 中以 Google 表格插件的形式提供,包括菜单和 UI 元素。

恢复所有垃圾文件

此函数使用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 Explorer 检索所有已删除文件的 ID!

如果您从脚本调用 API,输出会显示为您收到的输出。

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

处理垃圾文件

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

/**
 * 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 );
};

【讨论】:

  • 要将文本文件缩减为仅 ID::g!/"id"/d 删除所有没有“id”的行,然后 :g/"/s/^ *"id": //。保存文件就完成了。
  • // 将恢复的文件移动到目标目录。 file.addToFolder(targetFolder);不移动,只添加到另一个文件夹
  • 您必须先取消垃圾文件才能移动它,错误!没有任何东西被移动。
  • 对不起,斯坎普迈克尔,你在那儿出了问题。这不是 Gmail。 Trashed 不是文件夹。像我一样尝试真正让它发挥作用。
  • 谢谢你,Mogsdad,至少部分起到了作用。现在,我到«cesisti»的所有文件仍然链接(标记)到他们的原始文件夹。这至少以不同的方式搞砸了一切。现在我只需要删除与 «cesisti» 不同的标签...如果您有任何提示,我会尝试为此编写另一个脚本;-) 再次感谢您,您帮了很多忙。祝你有美好的一天。
【解决方案2】:

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

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

【讨论】:

  • 谢谢。试过了,不开心。我已经有一些 logger.log 诊断,日志变空并且执行转录重复以下内容:DocsList.getFolder([cestisti]) DocsList.getAllFilesForPaging([200, null]) FilesResult.getFiles() FilesResult.getToken() Token.toString() DocsList.getAllFilesForPaging([200, Token]) Token.getToken() Token.getToken() FilesResult.getFiles() FilesResult.getToken() Token.toString() DocsList.getAllFilesForPaging([200, Token]) 我怀疑 getAllFilesForPaging 没有进入垃圾箱......我只是想知道 isTrashed 属性是什么?谢谢。
  • if (files[i].isTrashed() == true) -- 因为 files[i].isTrashed() 为真或假,== true 不是必需的
【解决方案3】:

请记住,文件不在文件夹中。文件具有称为文件夹的标签,并且可以有多个文件夹(标签)。甚至“垃圾”也是一个标签。设置为垃圾只会创建一个覆盖其他标签(文件夹)的垃圾标签。下面的代码不会移动任何东西。它只是重置标签(文件夹) 编辑: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);
       }
    }

【讨论】:

  • 如何获得包含已删除文件的文件列表? Tiziano 的原始 files = result.getFiles(); 似乎只返回带垃圾=false 的文件。
  • 哎哟!感谢您的反馈。不知道如何被丢弃。救命!
  • 尚未尝试但请参阅方法 getAllFiles() 返回用户文档列表中的所有文件,最大为 DEFAULT_RESULT_SIZE。 ------ developers.google.com/apps-script/class_docslist#getAllFiles
  • 不幸的是,没有。正如在我的回答中一样,我发现 API 支持将获取已删除文件的查询,但该功能尚未应用于应用程序脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2021-06-13
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
相关资源
最近更新 更多