由于 DocsList 已弃用,此答案已更新,现在始终使用 DriveApp 方法。
在移动文件之前,您必须取消垃圾箱,但这样做会完成您所追求的目标。算法如下:
- 获取所有已删除文件的文件列表(或文件 ID)
- 对于每个文件,
- 取消删除/取消回收文件
- 将文件移动到目标文件夹(详情:从原始文件夹中删除文件,添加到目标恢复文件夹)
这个答案提供了脚本的 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 );
};