【问题标题】:installing a trigger by script keeps adding triggers to template sheet通过脚本安装触发器不断将触发器添加到模板表
【发布时间】:2020-07-03 04:04:54
【问题描述】:

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

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

}

创建函数在共享驱动器上的文件夹中创建模板的重命名副本,添加日历事件,并将某些数据写入驱动器中用作数据库的另一个电子表格。我在模板文件中手动安装了 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()

WOss 是我刚刚通过复制模板创建的电子表格,我检查了记录器并且 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') 

   {}

 }

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

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

    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;
    }
    

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

    【讨论】:

    • 感谢您的帮助,我认为这应该可以解决我的问题,我现在就去试验一下。我确实对我的原始问题进行了广泛的编辑以解决这个问题,并希望让以后发现这个问题的人更清楚。
    • 是的,看起来好多了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多