将事件对象从一个函数传递到另一个函数

时间:2019-06-10 23:32:05

标签: object events google-apps-script google-sheets javascript-objects

我决定将此onEdit(e)函数分解为多个函数,但是当我这样做时,事件对象(e)部分就“丢失了”。经过一段时间的摸索,我终于让它重新工作了,但我认为这不是最有效的解决方案。有什么建议吗,还是足够好?

基本上,我刚刚添加了var e = e;,这使得它再次可以正常工作。

function onEdit(e){
  Logger.log(e);

  if(e.range.getSheet().getName() == 'Estimate'){   
    var e = e;
    Logger.log("Starting subCatDV...");
    subCatDV(e);
    Logger.log("Finished subCatDV!");


    Logger.log("Starting itemDV...");
    itemDV(e);
    Logger.log("Finished itemDV!");


    Logger.log("Starting subItemDV...");
    subItemDV(e);
    Logger.log("Finished subItemDV!");

  }    

  if(e.range.getSheet().getName() == 'Items'){
    subCatDV();
  }

  return;

}  

这是似乎没有收到event objects

的函数
function subItemDV(e){
  // Populate sub-item data validations

  var estss = SpreadsheetApp.getActive().getSheetByName('Estimate');
  var itemss = SpreadsheetApp.getActive().getSheetByName('Items');
  var subItemDVss = SpreadsheetApp.getActive().getSheetByName('subItemDataValidations');
  var activeCell = estss.getActiveCell();

  Logger.log("I'm in subItemDV...");
  Logger.log(e);
  Logger.log(activeCell);

  Logger.log("Checking sheet name...");

  if(activeCell.getColumn() == 3 && activeCell.getRow() > 1){
    if(e.range.getSheet().getName() == 'Items') return;

    Logger.log("Not in 'Items' sheet!  Moving on...");

    activeCell.offset(0, 1).clearContent().clearDataValidations();

    var subItem = subItemDVss.getRange(activeCell.getRow(),activeCell.getColumn(),itemss.getLastColumn()).getValues();
    var subItemIndex = subItem[0].indexOf(activeCell.getValue()) + 2;


    Logger.log("Checking subItemIndex...");

    if(subItemIndex != 0){

      var subItemValidationRange = subItemDVss.getRange(activeCell.getRow(),4,1,subItemDVss.getLastColumn());
      var subItemValidationRule = SpreadsheetApp.newDataValidation().requireValueInRange(subItemValidationRange).build();

      activeCell.offset(0, 1).setDataValidation(subItemValidationRule);

      Logger.log("Finished checking subItemIndex...");

    }
  }
}  

1 个答案:

答案 0 :(得分:1)

以免在评论中增加讨论的内容:您可以安全地从脚本中删除var e = e分配,因为它不会影响脚本更新版本解决的问题:

  1. e是一个事件对象,构造为对触发触发器的响应。由于在您的情况下,触发器是onEdit(e)触发器,因此事件对象是undefined,直到在目标电子表格中进行了编辑为止(请注意,脚本触发编辑不会数);
  2. 即使您使用参数调用函数(例如doSomething(e)),也可能无法通过arguments对象访问参数,或者在函数声明{{1 }},事件对象将不会保留;

此外,您可能错过了上一次function doSomething(e)调用中的e绑定,并且可以优化subCatDV()语句(顺便说一句,不要使用equality comparison ,请改用identity比较,这将为您节省以后的调试时间):

if

有用的链接

  1. 事件对象reference;

  2. var name = e.range.getSheet().getName(); if(name === 'Estimate') { doSomething(e); }else if(name === 'Items') { //identity comparison ensures type match; doSomethingElse(e); } 对象reference;