Альтернатива «Невозможно прочесть свойство 'range' of undefined» в функции onEdit для таблиц Google - PullRequest
0 голосов
/ 26 мая 2020

Я работаю над созданием системы в таблицах 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);

}
...