我注意到新的文档列表Token和get*ForPaging()
选项现在可用,但我仍在努力使用算法来处理任意大文件/文件夹树的“所有文件和文件夹”。
假设基于Google Drive的网络文件系统包含 n 文件和文件夹。使用Google Apps脚本需要多次运行6分钟。每晚我需要在起始文件夹下的子文件夹树中处理超过30天的所有文件。我只需要处理一次文件(但我的函数是幂等的,所以我不介意我再次运行文件)。
我的递归算法正在工作,但我缺少的是一种占位符的方法,这样我每次调用脚本时都不必从文件夹树的顶部开始。在六分钟内,我只通过了几百个文件夹和几千个文件。
我的问题是我可以存储什么索引以及如何从下次离开的地方开始?
我已经考虑过存储令牌或最后完成的文件夹路径“/ mytop / sub4 / subsub47 /”但是如何帮助我进行另一次调用?如果我从那里开始,就会错误地从树上下来并错过兄弟姐妹和祖先的文件夹。
我已经考虑过“查找”方法并使用“之前:2012/10 ...”样式搜索,但是没有办法将其限制为树中的文件(只有一个文件夹)。
我没有粘贴我的代码,因为它只是标准的递归getFolders / getFiles,并且实际上与问题的核心无关。
答案 0 :(得分:3)
我创建了一个我必须处理的文件夹数组,并将其全部保存以备将来运行。 既然你说重复处理某些文件/文件夹没问题,你甚至不需要对你的函数进行假停止。你可以让它每次都超时。
这样的事情:
var folders = null;
//call this to start the process or set the property manually
function start() {
folders = ['id-of-the-starting-folder'];
work();
}
//set this to run on the trigger
function work() {
if( folders == null )
folders = ScriptProperties.getProperty('folders').split(',');
while( folders.length > 0 ) {
workOnFolder(folders[0]);
folders.shift(); //remove the 1st element
ScriptProperties.setProperty('folders', folders.join());
}
//remove the trigger here
}
function doFolderLater(folder) {
folders.push(folder.getId());
}
function workOnFolder(id) {
var folder = DocsList.getFolderById(id);
folder.getFolders().forEach(doFolderLater);
folder.getFiles().forEach(workOnFile);
}
function workOnFile(file) {
//do your thing
}