我正在使用for循环在App Maker的Pupils模型中迭代超过105条记录。 对于模型中的每条记录,我将从模型中的字段中提取文件夹名称。
我正在使用文件夹名称作为DriveApp.createFolder()
的输入。
每个文件夹都在同一个根文件夹中生成,因此我最终得到一个其中包含105个新创建的文件夹的根文件夹。
对于每个创建的文件夹,我将文件夹的所有权分配给特定用户,并从文件夹创建者中删除编辑权限。
在这种情况下,根文件夹对具有链接的域中的任何人都具有编辑权限,因此创建的文件夹将继承此设置,这就是为什么我删除文件夹创建者作为编辑器的原因。
为帮助调试,我在创建每个文件夹后写到控制台,并指出正在处理瞳孔模型中的哪个记录。
发生的情况是,在根文件夹中创建了大约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
事件在使用(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();
上面的代码来自处理触发服务器脚本的按钮。
答案 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();