使用 DriveApp.createFolder 创建文件夹会产生重复项

Creating folders using DriveApp.createFolder gives duplicates

我正在使用 for 循环在 App Maker 的 Pupils 模型中迭代超过 105 条记录。 对于模型中的每条记录,我从模型中的字段中提取文件夹名称。

我正在使用文件夹名称作为 DriveApp.createFolder() 的输入。

每个文件夹都在同一个根文件夹中生成,因此我最终得到一个包含 105 个新创建文件夹的根文件夹。

对于每个创建的文件夹,我将文件夹的所有权分配给特定用户并删除文件夹创建者的编辑权限。

在这种情况下,根文件夹具有授予域中具有 link 的任何人的编辑权限,因此创建的文件夹继承了此设置,这就是我删除文件夹创建者作为编辑者的原因。

为了帮助我进行调试,我在创建每个文件夹后写入控制台,并指出正在处理学生模型中的哪条记录。

发生的情况是,在根文件夹中创建了大约 25 到 30 个文件夹后,for 循环似乎再次开始,但同时又从中断处继续!

这是调试控制台的片段...

[

你可以看到循环似乎又开始了。

这是我的代码...

    function createEvidenceFolder(){
    var person = Session.getActiveUser().getEmail();
    var pupils = app.models.Pupils.newQuery();
    pupils.filters.EvidenceFolder._equals = null;
    pupils.filters.Roll._equals = "Current";
    var pupil = pupils.run();
    var folder = "XXXThe Root Folder IDXXX";
    for (var x = 0; x < pupil.length; x++){
    var fname = pupil[x].Folder_Name;    
  console.log("Processing record "+x+" for "+fname);    
 var root = DriveApp.getFolderById(folder);
 var createdfolder = root.createFolder(fname).getId();
 Utilities.sleep(1000);
 DriveApp.getFolderById(createdfolder).setOwner("The email address of the User").removeEditor(person);
  pupil[x].EvidenceFolder = createdfolder;   
  }
  app.saveRecords(pupil);   
  console.log("Processed "+x+" evidence folders");
}

我在寻找答案时返回并添加了 Utilities.sleep(1000)

为什么我得到的文件夹数量是我应该得到的两倍?

为什么 for 循环似乎 运行 并发?

顺便说一下,脚本是从按钮上的 onclick 事件触发的。 onclick 事件在使用 google.script.run 调用脚本之前立即隐藏按钮 (widget.visible = false) 所以我希望消除实际点击两次的机会!

我无法解释这一点,但我对 App Maker 和编程也很陌生。

有没有人有任何见解?

编辑..误读了Morfinismo回复后的评论部分!

widget.visible = false;
google.script.run.withFailureHandler(function(err,user){
  console.log("The error was "+err+" and the user was "+user);}).createEvidenceFolder();

以上代码来自处理触发服务器脚本的按钮。

就我而言,如果您决定隐藏按钮而不是禁用它,应该没有任何问题。如果不检查应用程序,几乎不可能判断出哪里出了问题。我最好的猜测是应用程序中的某处有一些代码触发了该行为,或者不太可能是应用程序制造商系统中的错误。我相信后者的可能性很小,因为我尝试了与您类似的设置并且没有出错。

无论哪种方式,尝试禁用小部件而不是隐藏可能会有所帮助:

console.log("Starting process");
widget.enabled= false; 
google.script.run.withFailureHandler(function(err){
    console.log("The error was "+err);}
).withSuccessHandler(function(){
    widget.enabled=true; 
    console.log("Finished process");
}).createEvidenceFolder();