跨多个运行处理所有文件和文件夹的算法

时间:2012-11-05 23:17:20

标签: google-apps-script

我注意到新的文档列表Tokenget*ForPaging()选项现在可用,但我仍在努力使用算法来处理任意大文件/文件夹树的“所有文件和文件夹”。

假设基于Google Drive的网络文件系统包含 n 文件和文件夹。使用Google Apps脚本需要多次运行6分钟。每晚我需要在起始文件夹下的子文件夹树中处理超过30天的所有文件。我只需要处理一次文件(但我的函数是幂等的,所以我不介意我再次运行文件)。

我的递归算法正在工作,但我缺少的是一种占位符的方法,这样我每次调用脚本时都不必从文件夹树的顶部开始。在六分钟内,我只通过了几百个文件夹和几千个文件。

我的问题是我可以存储什么索引以及如何从下次离开的地方开始?

我已经考虑过存储令牌或最后完成的文件夹路径“/ mytop / sub4 / subsub47 /”但是如何帮助我进行另一次调用?如果我从那里开始,就会错误地从树上下来并错过兄弟姐妹和祖先的文件夹。

我已经考虑过“查找”方法并使用“之前:2012/10 ...”样式搜索,但是没有办法将其限制为树中的文件(只有一个文件夹)。

我没有粘贴我的代码,因为它只是标准的递归getFolders / getFiles,并且实际上与问题的核心无关。

1 个答案:

答案 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
}