我需要帮助创建一个Google Drive脚本,该脚本会自动删除除最近24个文件以外的所有旧文件。
我的网络驱动器每小时发送一个名为:
的7z数据库文件DATABASENAME_01.09.2017_07.bak.7z
一般格式为:
DATABASENAME_DD.MM.RRRR_HH.bak.7z
Google云端硬盘上的文件会直接复制(我没有任何文件夹)。 我希望删除文件而不是移动到垃圾箱。这是关于释放空间。
我想使用Stackoverflow上描述的other solutions,但它们不符合我的要求。
据我所知,该脚本不起作用,因为它使用旧的Doclists函数。不幸的是,我不知道script.google中使用的编程语言
答案 0 :(得分:2)
我认为最好的方法是使用DriveApp api。
您应该使用一些功能:
getFiles
允许您选择所有驱动器文件FileIterator
必须根据getDateCreated()
removeFile
api删除最旧的文件或将最旧的文件设置为使用setTrashed
api删除。您可以使用Drive.Files.emptyTrash()
清空垃圾箱(这是在高级Api中)。我们将看到此方法实际上并未完全删除文件,并且会导致意外结果。Drive.Files
(请仔细阅读如何在脚本中启用高级API)。这样可以为您要删除的文件(已经为我们组织它们的查询)创建更快的查询。这或多或少是我要解决你的问题:
// Get all the files
files_iterator = DriveApp.getFilesByType("application/7z-compressed");
var file_list = [];
while (files_iterator.hasNext()) {
var fl = files_iterator.next();
file_list.push(fl);
}
// Sort the files on date created
file_list = file_list.sort(function(fl1, fl2) {
return fl1.getDateCreated() < fl2.getDateCreated();
});
// Removing uneeded file
while (file_list.length > 24) {
var fl = file_list.pop();
DriveApp.removeFile(fl);
}
此代码未经过测试,可能包含错误。使用它需要您自担风险。
如果Mime Type不起作用,另一个解决方案是列出云端硬盘中的所有文件,并仅保留文件名以DATABASENAME
开头的文件:
var files_iterator = DriveApp.getFiles();
var file_list = [];
while (files_iterator.hasNext()) {
var fl = files_iterator.next();
if (fl.getName().match("DATABASENAME"))
file_list.push(fl);
}
我写了一个似乎正常工作的新版本:
function myFunction() {
// Query drive for the files that has name containing "DATABASENAME" as prefix
// the result (items) is ordered by creating date
var files = Drive.Files.list({
q: 'title contains "DATABASENAME"',
orderBy: 'createdDate'
}).items;
// While keeping the last 24 elements, runs a function
// for each element of the Array
files.slice(0, -25).forEach(function(file) {
// Deletes the file (recognized with its ID)
Drive.Files.remove(file.id)
});
}
如果您未启用高级API ,则此功能无效。我已经多次测试,只剩下最后24个元素。您必须等待该函数在再次运行之前结束其执行,或者数组可能变得不一致,第二次执行可能会删除不需要的文件。根据您的云端硬盘帐户中的文件数量,list
功能(作为getFiles
功能)会执行计数和限制的查询。这项操作非常昂贵,每小时运行一次可能会超出配额。我建议你每天运行一次这个功能。
关于list
的一个好处是它实际上允许您通过7z
mimeType("application/x-7z-compressed"
)的字符串进行搜索:
Drive.Files.list({
q: 'mimeType = "application/x-7z-compressed"'
});
这是我在AppScript和我的云端硬盘上实际测试的版本:
function myFunction() {
var file_iterator = DriveApp.getFiles();
var file_list = [];
while (file_iterator.hasNext()) {
var fl = file_iterator.next();
if (fl.getName().match("DATABASENAMES"))
file_list.push(fl);
}
// Sort the files on date created
file_list = file_list.sort(function(fl1, fl2) {
return fl1.getDateCreated() < fl2.getDateCreated();
});
// Removing uneeded file
while (file_list.length > 24) {
var fl = file_list.pop();
// fl.setTrashed(true); // if you want it in the trash
// instead of fully removed.
DriveApp.removeFile(fl);
}
}
但此版本的问题是实际上并未从驱动器中删除文件。我不明白为什么这个功能实际存在,我没有看到它的用法。它只会从视图
中删除文件