Google App脚本continuefolderiteration不会从上一个文件夹继续,而是每次都重新启动

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

我正在尝试在每个文件夹(A)中查找特定的电子表格(目标)。这些文件夹位于文件夹(B)中,而文件夹(B)又位于文件夹(C)中。我当前的脚本已检索文件夹(C),并在每个文件夹(B)中搜索文件夹(A),然后搜索电子表格。但是,由于文件夹(B)的数量众多,我在文件夹(A)级别放置了一个continuationtoken以跟踪已搜索了哪个文件夹(B)[或者至少我认为这就是我正在做的事情]。我遇到的问题是,脚本始终从相同的第一个文件夹(B)恢复,而不是从搜索到的最后一个文件夹(B)继续。

文件夹(C)= baseFolder

文件夹(B)=学生文件夹

文件夹(A)=评估文件夹

电子表格(目标)=包含给定搜索关键字的任何电子表格

以下是我正在使用的脚本的摘要。


        if (continuationToken == null) {
            // firt time execution, get all files from Drive
            var allFolders = baseFolder.getFolders();
            var Tokenalert = ui.alert('There is no token');
          } 

          else {
            // not the first time, pick up where we left off
            var allFolders = DriveApp.continueFolderIterator(continuationToken);
          }

          while (allFolders.hasNext() && end.getTime() - start.getTime() <= maxTime) {
            i++;
            var studentFolder = allFolders.next();
            var AssessmentFolder = studentFolder.getFoldersByName("02 Assessment");
            if (AssessmentFolder.hasNext() == true){
              Logger.log(studentFolder.getName());
              progress.getRange(i,1).setValue(studentFolder.getName());
              AssessmentFolder = AssessmentFolder.next();
              if (AssessmentFolder.searchFiles(checkcode).hasNext() == true){ 

                var filetochange = AssessmentFolder.searchFiles(checkcode); 
                var editfile = filetochange.next();
                progress.getRange(i,2).setValue(editfile);
                Logger.log(editfile);var fileid = editfile.getId();
                var editss = SpreadsheetApp.openById(fileid);

                Logger.log(editss.getName());
                progress.getRange(i,3).setValue(fileid);
                var editsheet = editss.getSheetByName(sheettoedit); 
                // remove protection from the sheet mentioned
                // Protect the active sheet except B2:C5, then remove all other users from the list of editors.
                var protection = editsheet.protect().setDescription('Test');

                if (protectrange != 0) {
                  var unprotected = editsheet.getRange(protectrange);
                }

                if (protectrange2 != 0) {
                var unprotected2 = editsheet.getRange(protectrange2);
                }

                else {
                unprotected2 = unprotected;
                }

                if (protectrange3 != 0) {
                  var unprotected3 = editsheet.getRange(protectrange3);
                }

                else {
                  unprotected3 = unprotected2;
                }

                protection.setUnprotectedRanges([unprotected, unprotected2]);

                // Ensure the current user is an editor before removing others. Otherwise, if the user's edit
                // permission comes from a group, the script throws an exception upon removing the group.
                var me = Session.getEffectiveUser();
                protection.addEditor(me);
                protection.removeEditors(protection.getEditors());

                if (protection.canDomainEdit()) {
                  protection.setDomainEdit(false);
                }

                progress.getRange(i,4).setValue("complete");
              }

              else {
                progress.getRange(i,4).setValue("fail");
              }
            }

            end = new Date()

          }

          // Save your place by setting the token in your user properties
          if(allFolders.hasNext()){
            var continuationToken = allFolders.getContinuationToken();
            userProperties.setProperty('CONTINUATION_TOKEN', continuationToken);
            progress.getRange(1,6).setValue(continuationToken);
          } else {
            i++;
            progress.getRange(i,1).setValue("Completed")
            // Delete the token
            PropertiesService.getUserProperties().deleteProperty('CONTINUATION_TOKEN');
            ss.deleteSheet("Progress");

            var Completionalert = ui.alert('completed');
          }

请原谅我的凌乱代码,因为我是编码新手。

我已经检查了,并且继续令牌已存储并被检索。我还确保脚本在存储令牌之前不会过早结束。我能想到的唯一问题是,或者我再次输入令牌的方式有误,或者存储了错误的令牌。但是我不确定。我曾尝试将令牌存储在B级和A级,但是这没有意义,而且行不通。

此外,我已经阅读以下内容:

[https://developers.google.com/apps-script/reference/drive/folder-iterator然而,它并不是很有帮助,因为它仅显示了如何获取令牌。

[Google Apps Script: How to use ContinuationToken with recursive folder iterator,但我不理解术语递归。

如果有人能够解释continuationtoken的工作原理,那就太好了。它是否仅跟踪最后一个文件夹并从那里继续?还是实际上占据了整个文件夹列表并给出了位置?

欢迎对脚本其他部分的任何副手反馈^^,并提前谢谢!:)

google-apps-script google-sheets google-drive-api
1个回答
0
投票
  1. script run-time limitations
    • 常规用户:6分钟
    • 业务 / 企业 / 教育:30分钟

简要浏览Quotas for Google Services的详细文章


  1. 看看Stackoverflow威胁Google Apps Script: How to use ContinuationToken with recursive folder iterator,它与您的问题相似

  1. Recursive function是调用自身的函数

这里是将基数恢复为指数幂的函数的小例子

function pow(a, b) {
  if (b === 1) { return a } 
  else { return a * pow(a, b - 1) }
}
console.log(pow(3, 3)) // same as 3 * 3 * 3 = 27

P.S。这仅是示例,请使用Math.pow()代替


是否可以澄清您的担忧?

© www.soinside.com 2019 - 2024. All rights reserved.