Passing event objects from one function to another

邮差的信 提交于 2019-12-10 22:39:41

问题


I decided to break this onEdit(e) function up into multiple functions, but when I did, the event objects (e) portion got "lost." After messing with it for a while, I finally got it to work again, but I don't think it's the most efficient solution. Any suggestions, or is this good enough?

Basically, I just added var e = e; and that made it work again.

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;

}  

Here is the function that didn't seem to be receiving the 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:


So as not to inflate discussion in comments: you can safely remove the var e = e assignment from the script, as it does not affect the problems that your updated version of the script solved:

  1. e is an event object that is constructed as a response to trigger being fired. Since in your case the trigger is an onEdit(e) trigger, event object is undefined until an edit is made in the target Spreadsheet (please, note that script-triggered edits do not count);
  2. Even if you called the function with a parameter (like doSomething(e)), in case you either do not access the parameter via the arguments object, or explicitly define it in a function declaration function doSomething(e), the event object won't be persisted;

Also, you might've missed the e binding in the last subCatDV() call + the if statement can be optimized (btw, don't use the equality comparison, use the identity comparison instead, it will save you debugging time in the future):

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

Useful links

  1. event object reference;

  2. arguments object reference;



来源:https://stackoverflow.com/questions/56534680/passing-event-objects-from-one-function-to-another

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!