Передача объектов событий из одной функции в другую - PullRequest
2 голосов
/ 11 июня 2019

Я решил разбить эту 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 Ответ

1 голос
/ 11 июня 2019

Чтобы не раздувать обсуждение в комментариях: вы можете безопасно удалить назначение var e = e из скрипта, так как это не влияет на проблемы, которые решала ваша обновленная версия скрипта:

  1. e - это объект события , который создается как ответ на срабатывание триггера.Поскольку в вашем случае это триггер onEdit(e), объект события будет undefined до тех пор, пока в целевой таблице не будет произведено редактирование (обратите внимание, что правки, запускаемые сценарием правки не учитываются);
  2. Даже если вы вызвали функцию с параметром (например, doSomething(e)), в случае, если вы либо не обращаетесь к параметру через объект arguments, либо явно определяете его в объявлении функции function doSomething(e), событиеобъект не будет сохранен;

Кроме того, возможно, вы пропустили привязку e в последнем вызове subCatDV() + оператор if может быть оптимизирован (кстати, неиспользуйте сравнение на равенство , вместо этого используйте идентификацию , это сэкономит вам время отладки в будущем):

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

Полезные ссылки

  1. объект события ссылка ;

  2. arguments объект ссылка ;

...