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