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

时间:2018-10-08 16:48:17

标签: google-app-maker

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

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

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

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

在这种情况下,根文件夹对具有链接的域中的任何人都具有编辑权限,因此创建的文件夹将继承此设置,这就是为什么我删除文件夹创建者作为编辑器的原因。

为帮助调试,我在创建每个文件夹后写到控制台,并指出正在处理瞳孔模型中的哪个记录。

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

这是调试控制台中的代码段...

[1]

您可以看到循环似乎再次开始。

这是我的代码...

    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事件在使用(widget.visible = false)调用脚本之前立即隐藏了按钮google.script.run,因此我希望消除实际单击两次的机会!

我很茫然地解释这一点,但是对于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();

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

1 个答案:

答案 0 :(得分:0)

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

通过尝试禁用小部件而不是隐藏小部件可能会有所帮助:

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();