【问题标题】:How to have onFormSubmit(e) and onEdit(e) together nested如何将 onFormSubmit(e) 和 onEdit(e) 嵌套在一起
【发布时间】:2019-09-05 08:46:38
【问题描述】:

我希望 onFormSubmit(e) 成为我的主要函数触发器,并且我希望在其中嵌套 onEdit(e)。基本上,无论如何,触发器都会运行 onFormSubmit,但如果有任何编辑,它会在 onEdit 中执行其他操作,如果没有,它会执行其他操作。

我无法理解并使其发挥作用。

我的脚本触发器将 onFormSubmit 显示为唯一的函数,而 onEdit 不在下拉列表中。

function onFormSubmit(e){
    ScriptApp.newTrigger("onEdit").timeBased().after(60000).create();
  function onEdit(e){
    var ss = SpreadsheetApp.getActiveSpreadsheet().getRange('SpeedVSD');
    var sheet = ss.getSheetByName("Responses 1");
    var row = ss.range.getRow();
    var col = ss.range.getColumn();

    if (col >= ss.getColumn() && col <= ss.getLastColumn() && row >= ss.getRow() && row <= ss.getLastRow()){
      console.log("You edited a Cell within Range");

    }

  }

编辑:设法获得我的 lastRow 值。但是,我仍然希望获得一个可以获取所有列的 lastRow 值的命令,而不是手动执行它。

编辑:使用FOR 循环有助于整理值。

//This is to get the Last Row on Column 2 value.
var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheetByName('FIRST');

  var row = sheets.getLastRow();
  for(var i = 1; i <= sheets.getLastColumn(); i++){
  var myID = sheets.getRange(row, i).getValue();
  }

  console.log("Row Number: "+row);
  console.log("Content of last Row: "+myID);```


【问题讨论】:

    标签: javascript google-apps-script google-sheets triggers javascript-scope


    【解决方案1】:

    如果您希望onEdit() 始终运行,您只需将其创建为单独的函数即可。然后你可以从onFormSubmit() 调用它,像这样:

    function onFormSubmit(e){
       //does something you need...
       onEdit();
    }
    onEdit(e){
       //do the onEdit code...
    }
    

    唯一的问题是onFormSubmit() 的事件eonEdit() 的事件不同,因此使用事件可能不是最好的主意。但是,从另一个函数调用另一个函数会很有趣,就像使用任何其他函数一样。

    【讨论】:

    • 这个onEdit 只是一个普通的函数吧?它不会调用function onEdit(e) 的属性,对吗?
    • 我的ss.range.getRow(); 和 ss.range.getColumn();`` 我试图将 e 替换为 ss 但它仍然没有工作。我做得对还是我错过了什么
    • 这个onEdit() 确实会与触发器一起使用,这意味着它会在编辑工作表的情况下被调用,是否使用e 作为参数取决于您的需要。至于未定义,你想从ss.range.getRow();ss.range.getColumn(); 得到什么?
    • 获取活动行和列还是我使用了错误的语句?
    • 活跃是什么意思,被编辑的那个?还是当前在工作表中选择的?
    【解决方案2】:
    function onFormSubmit(e){
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheets = ss.getSheetByName('FIRST');
      var row = sheets.getLastRow();
      var myIDCol2 = 2;
      var myIDCol3 = 3;
      var myID2 = sheets.getRange(row, myIDCol2).getValue();
      var myID3 = sheets.getRange(row, myIDCol3).getValue();
      console.log("Speed Before Trigger Value: "+myID2);
      console.log("Voltage Before Trigger Value: "+myID3);
        ScriptApp.newTrigger("responsechange").timeBased().after(60000).create();
    
      }
    
    function responsechange(){
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheets = ss.getSheetByName('FIRST');
    
      var row = sheets.getLastRow();
      var myIDCol2 = 2;
      var myIDCol3 = 3;
      /*for(var i = 1; i <= sheets.getLastColumn(); i++){
    
        console.log("Content of last Row: "+myID);
      }*/
       var myID2 = sheets.getRange(row, myIDCol2).getValue();
      var myID3 = sheets.getRange(row, myIDCol3).getValue();
      var template1 = HtmlService.createTemplateFromFile("speed1");
      var template2 = HtmlService.createTemplateFromFile("voltage");
      template1.speed1 = myID2;
      template2.voltage = myID3;
      console.log("Speed After Trigger Value: "+myID2);
      console.log("Voltage After Trigger Value: "+myID3);
    
    
    
    
    
    
    
      if((myID2 >=100) || (myID2 <= 50)){
        MailApp.sendEmail("someone@gmail.com","Out of Range Notification Speed","",{htmlBody: template1.evaluate().getContent()});
      }
    
      if((myID3 >=100) || (myID3 <= 50)){
        MailApp.sendEmail("someone@gmail.com","Out of Range Notification Voltage","",{htmlBody: template2.evaluate().getContent()});
      }
    
      }
    

    有了这个,我设法使它工作,在表单提交时,假设值低于 50 和高于 100,它将在基于时间的触发器之后触发一封电子邮件。我还尝试在基于时间的触发器内,我将值编辑为在范围内并且它没有发送电子邮件。但是,现在唯一的问题是,如果触发器有很多,它会通过说停止触发器 此脚本的触发器过多。必须先从脚本中删除触发器,然后才能添加更多触发器。

    但从好的方面来说,我设法获得了最后一个提交的值,以检查它是否被编辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多