我决定将此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...");
}
}
}
答案 0 :(得分:1)
以免在评论中增加讨论的内容:您可以安全地从脚本中删除var e = e
分配,因为它不会影响脚本更新版本解决的问题:
e
是一个事件对象,构造为对触发触发器的响应。由于在您的情况下,触发器是onEdit(e)
触发器,因此事件对象是undefined
,直到在目标电子表格中进行了编辑为止(请注意,脚本触发编辑不会数); doSomething(e)
),也可能无法通过arguments
对象访问参数,或者在函数声明{{1 }},事件对象将不会保留; 此外,您可能错过了上一次function doSomething(e)
调用中的e
绑定,并且可以优化subCatDV()
语句(顺便说一句,不要使用equality comparison ,请改用identity比较,这将为您节省以后的调试时间):
if
有用的链接