Я работаю над созданием системы в таблицах Google, которая будет использоваться для отслеживания ежедневной посещаемости и производительности сотрудников на ежедневной основе. Для этого я использую раскрывающиеся списки, зависящие от нескольких уровней, которые можно легко реализовать с помощью фильтров и сопоставлений. Каждый раз, когда я пытаюсь запустить свой код, я получаю сообщение об ошибке в функциональном блоке onEdit. Я использую следующие ссылки на листы Google: https://docs.google.com/spreadsheets/d/1P0CcBWFNYqf2iSCXNdY5J_exdZfCVjltqDJvScRVQvo/edit?usp=sharing
Я получаю следующую ошибку:
«TypeError: Cannot read property» range 'of undefined (строка 14, файл «Код»).
Написанный мной код приведен ниже:
var empWs = "Employee 1 Datasheet";
var componentsWs = "List of all components";
var firstLevelColumn = 5;
var secondLevelColumn = 6;
var thirdLevelColumn = 7;
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(empWs);
var wsListOfAllComponents = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(componentsWs);
var ListOfAllComponents = wsListOfAllComponents.getRange(3, 1, wsListOfAllComponents.getLastRow() - 2, 3).getValues();
function onEdit(e){
var activeCell = e.range();
var val = activeCell.getValue();
var activeCellRow = activeCell.getRow();
var activeCellColumn = activeCell.getColumn();
var wsName = activeCell.getSheet().getName();
if(wsName === empWs && activeCellColumn === firstLevelColumn && activeCellRow > 2){
applyFirstLevelValidation(activeCellRow, val);
} else if(wsName === empWs && activeCellColumn === secondLevelColumn && activeCellRow > 2){
applySecondLevelValidation(activCellRow, val);
}
}//End of onEdit
function applyFirstLevelValidation(activeCellRow, val){
if( val===""){
ws.getRange(activeCellRow,secondLevelColumn).clearContent();
ws.getRange(activeCellRow,secondLevelColumn).clearDataValidations();
} else {
ws.getRange(activeCellRow,secondLevelColumn).clearContent();
var filteredOptions = ListOfAllComponents.filter(function(item){return item[0] === val});
var ListToApply = filteredOptions.map(function(item){return item[1]});
var cell = ws.getRange(activeCellRow,secondLevelColumn);
ApplyValidationToCell(ListToApply,cell);
}
}//End of applyFirstLevelValidation
function applySecondLevelValidation(activCellRow, val){
if( val===""){
ws.getRange(activeCellRow,thirdLevelColumn).clearContent();
ws.getRange(activeCellRow,thirdLevelColumn).clearDataValidations();
} else {
ws.getRange(activeCellRow,thirdLevelColumn).clearContent();
firstLevelColumnValue = ws.getRange(activeCellRow, firstLevelColumn).getValue();
var filteredOptions = ListOfAllComponents.filter(function(item){return item[0] === firstLevelColumnValue && item[1] === val});
var ListToApply = filteredOptions.map(function(item){return item[2]});
var cell = ws.getRange(activeCellRow,thirdLevelColumn);
ApplyValidationToCell(ListToApply,cell);
}
}
function ApplyValidationToCell(list,cell){
var rule = SpreadsheetApp.newDataValidation().requireValueInList(list).setAllowInvalid(false).build();
cell.setDataValidation(rule);
}