0

我希望 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);```


4

2 回答 2

2

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

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

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

于 2019-09-05T10:23:38.913 回答
0
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,它将在基于时间的触发器之后触发一封电子邮件。我还在基于时间的触发器内尝试过,我将值编辑为在范围内,但它没有发送电子邮件。但是,现在唯一的问题是,如果触发器很多,它会通过说 这个脚本有太多触发器来停止触发器。必须先从脚本中删除触发器,然后才能添加更多触发器。

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

于 2019-09-09T06:56:21.453 回答