我正在使用Google Drive存储家中IP摄像头的运动检测记录。我正在运行以下脚本(略有修改),以自动从我的谷歌驱动器中删除超过3天的文件:
自动删除谷歌驱动器中的文件
剧本定于每天早上5点左右播出。我遇到的问题是,当有太多的文件要删除时,我会收到一个错误,说我已经超过了最大写入速率。这是因为set trash命令包含在for循环中。如果我添加睡眠来减缓循环,那么我会收到另一个错误,说脚本没有在允许的时间内完成。
我可能只跑两三次,但那太笨重了。
我如何修改这个脚本,让它创建一个要删除的文件的临时列表,并在它最终退出循环时执行删除?我对GAS语言和语法没有太多经验,所以细节会非常棒。
此代码将返回超过30天的文件的所有文件ID。它与其他帖子中引用的代码非常不同。您正在使用的代码中有一个不推荐使用的类。DocsList现在不推荐使用。我给您的代码使用DriveApp,并使用searchFiles()
方法。
谷歌文档-搜索文件
gs脚本
function getFilesByDate() {
var arrayOfFileIDs = [];
var ThirtyDaysBeforeNow = new Date().getTime()-3600*1000*24*30;
// 30 is the number of days
//(3600 seconds = 1 hour, 1000 milliseconds = 1 second, 24 hours = 1 day and 30 days is the duration you wanted
//needed in yr-month-day format
var cutOffDate = new Date(ThirtyDaysBeforeNow);
var cutOffDateAsString = Utilities.formatDate(cutOffDate, "GMT", "yyyy-MM-dd");
//Logger.log(cutOffDateAsString);
var theFileID = "";
//Create an array of file ID's by date criteria
var files = DriveApp.searchFiles(
'modifiedDate < "' + cutOffDateAsString + '"');
while (files.hasNext()) {
var file = files.next();
theFileID = file.getId();
arrayOfFileIDs.push(theFileID);
//Logger.log('theFileID: ' + theFileID);
//Logger.log('date last updated: ' + file.getLastUpdated());
}
return arrayOfFileIDs;
//Logger.log('arrayOfFileIDs: ' + arrayOfFileIDs);
};
如果需要,您可以取消对Logger.log()
语句的注释,运行代码,并查看代码返回的内容。以下Logger.log()
语句:
//Logger.log('date last updated: ' + file.getLastUpdated());
将打印检索到的文件的日期。
上面的代码没有删除任何文件,也没有将任何内容设置为垃圾。它只是按日期搜索文件,并创建一个包含所有文件ID的数组。
因此,删除或丢弃文件的函数可以首先调用该函数,并获得所有要处理的文件ID的列表
最好在不删除任何文件的情况下测试代码,以确保代码在运行删除任何内容的版本之前获得正确的文件。
如果您想删除文件而不首先将其设置为垃圾,那是可以做到的。
下面的示例使用高级谷歌硬盘服务。有关启用高级驱动器服务的当前方式,请参阅文档。
//To delete a file without first sending it to the trash requires the Advanced Drive API to be enabled
function deleteFile(idToDLET) {
idToDLET = 'the File ID';
//This deletes a file without needing to move it to the trash
var rtrnFromDLET = Drive.Files.remove(idToDLET);
}
要调用获取要删除的文件ID的函数,它看起来像这样:
警告!这会删除文件而不将其发送到垃圾桶!***确保您知道要删除的内容
function deleteFiles() {
var arrayIDs = getFilesByDate();
for (var i=0; i < arrayIDs.length; i++) {
Logger.log('arrayIDs[i]: ' + arrayIDs[i]);
//This deletes a file without needing to move it to the trash
var rtrnFromDLET = Drive.Files.remove(arrayIDs[i]);
}
};
使用Sandy上面发布的解决方案,我将其修改为特定于文件夹。
function getOldFileIDs() {
var fileIDs = [];
// Old date is 30 days
var oldDate = new Date().getTime() - 3600*1000*24*30;
var cutOffDate = Utilities.formatDate(new Date(oldDate), "GMT", "yyyy-MM-dd");
// Get folderID using the URL on google drive
var folder = DriveApp.getFolderById('XXXXXXX');
var files = folder.searchFiles('modifiedDate < "' + cutOffDate + '"');
while (files.hasNext()) {
var file = files.next();
fileIDs.push(file.getId());
Logger.log('ID: ' + file.getId() + ', Name: ' + file.getName());
}
return fileIDs;
};
function deleteFiles() {
var fileIDs = getOldFileIDs();
fileIDs.forEach(function(fileID) {
DriveApp.getFileById(fileID).setTrashed(true);
});
};
我想出了另一个解决方案。只有当你的谷歌硬盘文件同步到你的硬盘时,这才有效。
如果你的Google Drive文件同步到你的硬盘,那么如果你在本地硬盘文件夹中删除它们,它们也会从Google Drive中删除。因此,任务变成了如何从你的谷歌文件夹中自动删除超过X天的文件。
这是一个Windows Powershell脚本,它将允许您执行以下操作:https://gallery.technet.microsoft.com/scriptcenter/Delete-files-older-than-x-13b29c09
使用以下配置运行脚本:
powershell -file c:usersownerdocumentswindowsdeleteolddeleteold.ps1 -FolderPath "C:UsersownerGoogle DriveiSpyvideoBedroom" -FileAge 30 -logfile c:usersownerdocumentswindowsdeleteoldlogsBedroom.log -CreateTime -NoFolder
我可以从同步的谷歌硬盘"卧室"文件夹中删除所有30天以上的iSpy文件。
遵循以下说明:
http://blogs.technet.com/b/heyscriptingguy/archive/2012/08/11/weekend-scripter-use-the-windows-task-scheduler-to-run-a-windows-powershell-script.aspx
我可以使用Windows任务计划程序自动运行脚本。
问题解决了。