如何通过以下脚本将 ContinuationToken 与递归文件夹迭代器一起使用

问题描述 投票:0回答:1

Google Drive 应用程序脚本和 Google 表格

我无法让下面的脚本运行而不出错。 我应该如何配置这个脚本?

  • 我显然不明白我需要填充/更改/设置什么才能使脚本正确运行。

如果我能让脚本运行 - 以下是我的最终目标:

  • 就是通过ID指定特定的Folder(需要搜索)
  • 将数据返回到其绑定的谷歌工作表到特定选项卡,如下所示: 相关文件夹的 Col1 URL, Col2 完整文件夹路径,即。文件夹名称/子文件夹名称/子子文件夹名称/等
  • 注意:必须忽略文件(这会增加总持续时间太多,并且不需要)

给出的说明如下: 原指令如下

function processRootFolder(rootFolder) {
  var MAX_RUNNING_TIME_MS = 1 * 60 * 1000;
  var RECURSIVE_ITERATOR_KEY = "RECURSIVE_ITERATOR_KEY";

  var startTime = (new Date()).getTime();

  // [{folderName: String, fileIteratorContinuationToken: String?, folderIteratorContinuationToken: String}]
  var recursiveIterator = JSON.parse(PropertiesService.getDocumentProperties().getProperty(RECURSIVE_ITERATOR_KEY));
  if (recursiveIterator !== null) {
    // verify that it's actually for the same folder
    if (rootFolder.getName() !== recursiveIterator[0].folderName) {
      console.warn("Looks like this is a new folder. Clearing out the old iterator.");
      recursiveIterator = null;
    } else {
      console.info("Resuming session.");
    }
  }
  if (recursiveIterator === null) {
    console.info("Starting new session.");
    recursiveIterator = [];
    recursiveIterator.push(makeIterationFromFolder(rootFolder));
  }

  while (recursiveIterator.length > 0) {
    recursiveIterator = nextIteration(recursiveIterator, startTime);

    var currTime = (new Date()).getTime();
    var elapsedTimeInMS = currTime - startTime;
    var timeLimitExceeded = elapsedTimeInMS >= MAX_RUNNING_TIME_MS;
    if (timeLimitExceeded) {
      PropertiesService.getDocumentProperties().setProperty(RECURSIVE_ITERATOR_KEY, JSON.stringify(recursiveIterator));
      console.info("Stopping loop after '%d' milliseconds. Please continue running.", elapsedTimeInMS);
      return;
    }
  }

  console.info("Done running");
  PropertiesService.getDocumentProperties().deleteProperty(RECURSIVE_ITERATOR_KEY);
}

// process the next file or folder
function nextIteration(recursiveIterator) {
  var currentIteration = recursiveIterator[recursiveIterator.length-1];
  if (currentIteration.fileIteratorContinuationToken !== null) {
    var fileIterator = DriveApp.continueFileIterator(currentIteration.fileIteratorContinuationToken);
    if (fileIterator.hasNext()) {
      // process the next file
      var path = recursiveIterator.map(function(iteration) { return iteration.folderName; }).join("/");
      processFile(fileIterator.next(), path);
      currentIteration.fileIteratorContinuationToken = fileIterator.getContinuationToken();
      recursiveIterator[recursiveIterator.length-1] = currentIteration;
      return recursiveIterator;
    } else {
      // done processing files
      currentIteration.fileIteratorContinuationToken = null;
      recursiveIterator[recursiveIterator.length-1] = currentIteration;
      return recursiveIterator;
    }
  }

  if (currentIteration.folderIteratorContinuationToken !== null) {
    var folderIterator = DriveApp.continueFolderIterator(currentIteration.folderIteratorContinuationToken);
    if (folderIterator.hasNext()) {
      // process the next folder
      var folder = folderIterator.next();
      recursiveIterator[recursiveIterator.length-1].folderIteratorContinuationToken = folderIterator.getContinuationToken();
      recursiveIterator.push(makeIterationFromFolder(folder));
      return recursiveIterator;
    } else {
      // done processing subfolders
      recursiveIterator.pop();
      return recursiveIterator;
    }
  }

  throw "should never get here";
}

function makeIterationFromFolder(folder) {
  return {
    folderName: folder.getName(), 
    fileIteratorContinuationToken: folder.getFiles().getContinuationToken(),
    folderIteratorContinuationToken: folder.getFolders().getContinuationToken()
  };
}

function processFile(file, path) {
  console.log(path + "/" + file.getName());
}

请注意,原始消息来自 如何将 ContinuationToken 与递归文件夹迭代器一起使用

我正在尝试使用 Senseful 用户给出的答案:35690

我尝试传递文件夹名称和文件夹 ID - 而不是当前的“rootFolder” “函数processRootFolder”

我认为我的问题出在这里:

// [{folderName: String, fileIteratorContinuationToken: String?, folderIteratorContinuationToken: String}]
 

但是我不知道如何获取特定文件夹的“fileIteratorContinuationToken:”或“folderIteratorContinuationToken:”

我希望我能让这段代码的基本原理发挥作用。我可以他们修改输出以将我需要的信息返回到特定选项卡上绑定的谷歌工作表中。

javascript google-sheets google-apps-script google-drive-api
1个回答
0
投票

processFolder 需要一个 DriveApp.Folder 对象。

此函数需要参数,因此无法使用分配函数功能从 Apps 脚本编辑器、自定义菜单项或绘图(按钮)运行。

下面是如何从另一个函数调用 processFolder 函数的示例。

function runner(){
  const folder = DriveApp.getFolderById(/** PUT HERE YOUR FOLDER ID */);
  processFolder(folder);
}
© www.soinside.com 2019 - 2024. All rights reserved.