2

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

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

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

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

我曾考虑过存储令牌或最后完成的文件夹路径“/mytop/sub4/subsub47/”,但这对我进行另一次调用有何帮助?如果我从那里开始,它会错误地从那里沿着树向下工作并且错过兄弟姐妹和祖先文件夹。

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

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

4

1 回答 1

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
}
于 2012-11-06T10:35:22.653 回答