2

我需要将目前在我的谷歌驱动器垃圾箱中的所有文件移动到某个文件夹,或者,如果无法完成,请将它们恢复到原始位置。发生了一些混乱,我在垃圾箱中有一些有价值的文件,其中一些 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()有效 - 我不知道。现在前者被注释掉了,因为我更喜欢复制项目而不是恢复它们,但如果这不可能,我可以恢复。

4

3 回答 3

2

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

您必须先取消垃圾文件,然后才能移动它,但这样做会完成您所追求的。这是算法:

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

这个答案提供了脚本片段来完成这个;完整的脚本可作为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 Explorer 文件列表

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

文件列表输出

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

带有已删除文件 ID 的电子表格

处理垃圾文件

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

/**
 * 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 );
};
于 2013-01-26T20:26:30.127 回答
1

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

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

于 2013-01-25T18:52:09.590 回答
1

请记住,文件不在文件夹中。文件具有称为文件夹的标签,并且可以有多个文件夹(标签)。甚至“垃圾”也是一个标签。设置为垃圾只会创建一个覆盖其他标签(文件夹)的垃圾标签。下面的代码不会移动任何东西。它只是重置标签(文件夹)编辑:垃圾不是标签,而是一个条件:其他一切都成立

    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);
       }
    }
于 2013-01-27T14:11:32.170 回答