我需要将目前在我的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()
是否有效 - 我不知道。现在前者被注释掉了,因为我更愿意复制项目而不是恢复它们,但如果不可能,我可以恢复。
答案 0 :(得分:1)
试 if(files [i] .isTrashed()== true)
我建议您放入一些诊断程序(Logger.log)来缩小问题范围
答案 1 :(得分:1)
由于DocsList已弃用,此答案已更新,现在始终使用DriveApp方法。
您必须在移动文件之前取消删除文件,但这样做可以完成您所追求的目标。这是算法:
这个答案提供了完成此操作的脚本片段;完整脚本在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;
}
(自动检索的替代方法,仅供参考。)既然你只是做了一次,那就让我们作弊吧。在“文件列表”页面的底部,使用API资源管理器检索所有已删除文件的ID!
如果您从脚本调用API,则输出显示就像您收到的一样。
Cut&amp;将输出粘贴到文本文件中,然后将其剥离为文件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 );
};
答案 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);
}
}