Events 将事件对象从触发器函数传递到另一个函数
我决定将这个Events 将事件对象从触发器函数传递到另一个函数,events,google-apps-script,google-sheets,triggers,Events,Google Apps Script,Google Sheets,Triggers,我决定将这个onEdit(e)trigger函数分解为多个函数,但当我这样做时,事件对象(e)部分“丢失”。在处理了一段时间后,我终于让它重新工作,但我认为这不是最有效的解决方案 有什么建议吗,或者这足够好吗?基本上,我只是添加了vare=e这使它再次工作 函数onEdit(e){ Logger.log(e); 如果(e.range.getSheet().getName()=='Estimate'){ var e=e; Logger.log(“启动子载波TDV…”); 副TDV(e); Logg
onEdit(e)
trigger函数分解为多个函数,但当我这样做时,事件对象(e)
部分“丢失”。在处理了一段时间后,我终于让它重新工作,但我认为这不是最有效的解决方案
有什么建议吗,或者这足够好吗?基本上,我只是添加了vare=e代码>这使它再次工作
函数onEdit(e){
Logger.log(e);
如果(e.range.getSheet().getName()=='Estimate'){
var e=e;
Logger.log(“启动子载波TDV…”);
副TDV(e);
Logger.log(“完成了subCatDV!”);
Logger.log(“启动itemDV…”);
项目d(e);
log(“Finished itemDV!”);
Logger.log(“启动子项dv…”);
分项dV(e);
log(“完成的子项dv!”);
}
如果(例如,range.getSheet().getName()=='Items'){
subCatDV();
}
返回;
}
下面是似乎没有接收事件对象的函数
函数子项dv(e){
//填充子项数据验证
var estss=SpreadsheetApp.getActive().getSheetByName('Estimate');
var itemss=SpreadsheetApp.getActive().getSheetByName('Items');
var subItemDVss=SpreadsheetApp.getActive().getSheetByName('subItemDataValidations');
var activeCell=estss.getActiveCell();
Logger.log(“我在subItemDV…”);
Logger.log(e);
Logger.log(activeCell);
Logger.log(“检查表名…”);
if(activeCell.getColumn()==3&&activeCell.getRow()>1){
如果(如range.getSheet().getName()=='Items')返回;
Logger.log(“不在‘项目’表中!继续…”);
activeCell.offset(0,1.clearContent().clearDataValidations();
var subItem=subItemDVss.getRange(activeCell.getRow(),activeCell.getColumn(),itemss.getLastColumn()).getValues();
var subItemIndex=子项[0]。indexOf(activeCell.getValue())+2;
log(“正在检查子项索引…”);
如果(子项索引!=0){
var subItemValidationRange=subItemDVss.getRange(activeCell.getRow(),4,1,subItemDVss.getLastColumn());
var subItemValidationRule=SpreadsheetApp.newDataValidation().RequireValidationRange(subItemValidationRange).build();
activeCell.offset(0,1).setDataValidation(subItemValidationRule);
Logger.log(“已完成检查子项索引…”);
}
}
}
以避免在评论中夸大讨论:您可以安全地从脚本中删除var e=e
赋值,因为它不会影响脚本更新版本所解决的问题:
e
是一个事件对象,构造为对触发的触发器的响应。因为在您的情况下,触发器是一个onEdit(e)
触发器,所以事件对象是未定义的
,直到在目标电子表格中进行编辑为止(请注意,脚本触发的编辑不算在内)李>
即使使用参数调用函数(如doSomething(e)
),如果不通过参数
对象访问该参数,或者在函数声明函数doSomething(e)
中显式定义该参数,事件对象也不会被持久化李>
另外,您可能错过了上一次subCatDV()
call中的e
绑定,以及if
语句可以优化(顺便说一句,不要使用,而是使用比较,这将在将来节省调试时间):
有用的链接
事件对象
参数
对象
请澄清在什么调用期间以及在什么情况下,事件对象
会丢失?它被构造为触发器(在您的例子中为“onEdit”),如果您不重新分配或修改它,它将在整个回调链中保持。顺便说一句,由于您的两个if
语句检查相同的内容,因此您应该使用一个if..else
语句,而不是使用Hello@OlegValter!谢谢你的回复!我编辑了OP以反映受影响的功能。嗨,特雷!谢谢你的澄清!你能告诉我你遇到了什么问题吗?从您当前的代码判断,没有任何东西会导致事件对象
变得未定义
(顺便说一句,这就是您所说的“丢失”的意思吗?)是的,我想这就是我的意思。我只是摸索着加油,试着自学。所以我并不总是使用合适的行话。在我添加vare=e之前
并将(e)
添加到每个函数中,它只是没有传递值并在函数中间停止。因此,所有的记录器
都被分散到了整个系统中。试图确定停止的位置请不要对字符串literalsID使用===您是指字符串对象吗?正如'foo'=='foo'
通过了严格的平等性测试,以及var f='foo';f=='foo'
和var f='foo';var ff=‘foo’;f===ff
甚至模板文本。
var name = e.range.getSheet().getName();
if(name === 'Estimate') {
doSomething(e);
}else if(name === 'Items') { //identity comparison ensures type match;
doSomethingElse(e);
}