如何将 onFormSubmit(e) 和 onEdit(e) 嵌套在一起
How to have onFormSubmit(e) and onEdit(e) together nested
我希望 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);```
如果您希望 onEdit()
始终为 运行,只需将其创建为一个单独的函数即可。然后你可以从 onFormSubmit()
调用它,像这样:
function onFormSubmit(e){
//does something you need...
onEdit();
}
onEdit(e){
//do the onEdit code...
}
唯一的问题是 onFormSubmit()
的事件 e
与 onEdit()
的事件不同,因此使用事件可能不是最好的主意。但是,从一个函数调用另一个函数会像调用任何其他函数一样有趣。
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,它将在基于时间的触发器之后触发一封电子邮件。我也在基于时间的触发器中尝试过,我将值编辑为在范围内并且它没有发送电子邮件。然而,现在唯一的问题是,如果有很多触发器,它会停止触发器说
此脚本有太多触发器。必须先从脚本中删除触发器,然后才能添加更多触发器。
但好的一面是,我设法获取了最后提交的值,以检查它是否被编辑过。
我希望 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);```
如果您希望 onEdit()
始终为 运行,只需将其创建为一个单独的函数即可。然后你可以从 onFormSubmit()
调用它,像这样:
function onFormSubmit(e){
//does something you need...
onEdit();
}
onEdit(e){
//do the onEdit code...
}
唯一的问题是 onFormSubmit()
的事件 e
与 onEdit()
的事件不同,因此使用事件可能不是最好的主意。但是,从一个函数调用另一个函数会像调用任何其他函数一样有趣。
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,它将在基于时间的触发器之后触发一封电子邮件。我也在基于时间的触发器中尝试过,我将值编辑为在范围内并且它没有发送电子邮件。然而,现在唯一的问题是,如果有很多触发器,它会停止触发器说 此脚本有太多触发器。必须先从脚本中删除触发器,然后才能添加更多触发器。
但好的一面是,我设法获取了最后提交的值,以检查它是否被编辑过。