通过脚本安装触发器会不断向模板工作表添加触发器



我一直在处理的模板遇到了问题。我在共享驱动器上的文件夹中有一个模板文件,其中包含一个包含创建函数和关闭函数的脚本,由这个安装在编辑从下拉列表中运行的脚本触发。

function onMyEdit(e) {
if(sh.getName()=="Sheet2" && e.range.columnStart==6 && e.range.rowStart==3 && e.value) {
switch(e.value) {
case 'Create':
Create();
break;
case 'Close':
Close();
}
e.range.setValue('');
}
}

create 函数在共享云端硬盘上的文件夹中创建了模板的重命名副本,添加日历事件,并将某些数据写入云端硬盘中用作数据库的另一个电子表格。我在模板文件中手动安装了 onMyEdit 函数的触发器,但是当我创建副本时触发器不起作用,因此关闭函数不会从新创建的工作表运行。我尝试对创建函数进行编程以在新工作表上安装触发器。使用这个

var WOssID = WOss.getId(); //get the ID of the newly created work order spreadsheet
Logger.log(WOssID)
ScriptApp.newTrigger('onMyEdit')
.forSpreadsheet(WOssID)
.onEdit()
.create()

其中 WOs 是我刚刚通过复制模板创建的电子表格,我检查记录器和 ID 是否与新工作表匹配。这确实修复了它,所以我可以从新创建的工作表运行关闭函数,但它似乎向模板工作表而不是新工作表添加一个触发器,并且每次我从模板文件运行创建函数时,它都会不断添加一个触发器,直到它限制在 20 然后它全部中断。我一定误解了什么,因为我不明白为什么当我有正在调用的新创建的工作表的 ID 时它会向模板工作表添加触发器。还希望让这一切在 iPad 上运行,所以相信这意味着我不能在菜单、打开通话或可点击按钮上使用添加的内容。任何帮助,不胜感激。

更新

因此,我现在有一个简单的 onEdit 触发器,该触发器在第一次编辑时为我的工作订单工作表创建一个已安装的 onMyEdit 触发器,并且不会在我的模板文件中创建多个触发器。但是,我需要找到一种在新创建的工作表中授权它的方法,而无需进入脚本编辑器。如果我打开新创建的工作表并进行编辑,则新安装的触发器将显示在项目触发器中,但在我尝试先从脚本编辑器运行它之前,它不会运行,此时它要求授权。有没有办法将授权绑定到一个复选框,单击该复选框时,弹出窗口似乎授权已安装的触发器,以便它可以运行?

function onEdit(){
var WOss = SpreadsheetApp.getActiveSpreadsheet(); 
var WOssID = WOss.getId();
var allTriggers = 
ScriptApp.getUserTriggers(WOss)//ScriptApp.getProjectTriggers();
Logger.log(allTriggers.length)
if(allTriggers.length == '0' ){
ScriptApp.newTrigger('onMyEdit').forSpreadsheet(WOssID).onEdit().create()
}
else(allTriggers.length != '0') 
{}
}

这是我用来创建触发器的函数:

function createOnFormSubmitTriggerForSpreadsheet() {
const ssid=SpreadsheetApp.getActive().getId();
const resp=SpreadsheetApp.getUi().prompt("Create On Form Submit Trigger", "Enter Function Name", SpreadsheetApp.getUi().ButtonSet.OK_CANCEL);
if(resp.getSelectedButton()==SpreadsheetApp.getUi().Button.OK) {
let funcname=resp.getResponseText();

下一行阻止我为同一函数创建多个触发器

if(!isTrigger(funcname)) {//I use this to keep from creating more than one trigger

我建议你也这样做

ScriptApp.newTrigger(funcname).forSpreadsheet(ssid).onFormSubmit().create();   
}
}
}
function isTrigger(funcName){
var r=false;
if(funcName){
var allTriggers=ScriptApp.getProjectTriggers();
for (let i=0;i<allTriggers.length;i++){
if(funcName==allTriggers[i].getHandlerFunction()){
r=true;
break;
}
}
}
return r;
}

而且不要残忍,但你的代码是一团糟,你不需要描述你的整个项目,我们只想看到产生问题的最少代码。 你说你不知道什么是重要的,什么是不重要的。 当你花时间创建一个最小的可重现示例时,你会学到更多关于你的代码的知识,我经常发现我最终会自己解决问题。

最新更新