У меня есть сценарий, написанный для применения трех уровней проверки. Первый уровень проверки находится в столбце A на «главном» листе, а второй и третий - в сценарии приложения.
Я могу выбрать первый уровень проверки на «главном» листе исписок фильтруется, чтобы отображать только соответствующие ответы в раскрывающемся списке в столбце B. После выбора моего ответа в столбце B в столбце C появляется раскрывающаяся стрелка, но нет полей для выбора. Я могу вручную ввести значение, которое находится в моем списке, и оно принимается, и любая вещь, которой нет в списке, отклоняется. Я сузил свою проблему до:
var filteredOptions = options.filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });
Когда я помещаю Logger.log(filteredOptions);
в function applySecondLevelValadation(val, r){
, он возвращается с пустым массивом [].
Когда я помещаю
Logger.log(filteredOptions);` in `function applyFirstLevelValadation(val, r){
, возвращается с массивом:
[[Intermediate, 9:00 AM, Upper Dumont], [Intermediate, 12:00 PM, Outer Limts], [Intermediate, 3:30 PM, Satelite], [Intermediate, 9:00 AM, Box], [Intermediate, 12:00 PM, Hidden Valley], [Intermediate, 3:30 PM, Kermits]]
Снимок экрана листа "Опции"
Снимок экрана "master" со всеми возможными опциями для столбца A и B и без опций для выбора в столбце C
Любая помощь, выясняющая, почему var filteredOptions = options.filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });
возвращаетсябудет полезен пустой массив!
Используемый код:
var mainWsName = "master";
var optionsWsName = "options";
var firstLevelColumn = 1;
var secondLevelColumn = 2;
var thirdLevelColumn = 3;
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainWsName);
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionsWsName);
var options = wsOptions.getRange(2,1,wsOptions.getLastRow()-1,3).getValues();
function onEdit(e) {
var activeCell = e.range;
var val = activeCell.getValue();
var r = activeCell.getRow();
var c = activeCell.getColumn();
var wsName = activeCell.getSheet().getName();
if(wsName === mainWsName && c === firstLevelColumn && r > 1) {
applyFirstLevelValadation(val, r);
} else if(wsName === mainWsName && c === secondLevelColumn && r > 1) {
applySecondLevelValadation(val, r);
}
}
function applyFirstLevelValadation(val, r) {
if(val === "") {
ws.getRange(r, secondLevelColumn).clearContent();
ws.getRange(r, secondLevelColumn).clearDataValidations();
ws.getRange(r, thirdLevelColumn).clearContent();
ws.getRange(r, thirdLevelColumn).clearDataValidations();
} else {
ws.getRange(r, secondLevelColumn).clearContent();
ws.getRange(r, secondLevelColumn).clearDataValidations();
ws.getRange(r, thirdLevelColumn).clearContent();
ws.getRange(r, thirdLevelColumn).clearDataValidations();
var filteredOptions = options.filter(function(o){ return o[0] === val });
var listToApply = filteredOptions.map(function(o){ return o[1] });
var cell = ws.getRange(r, secondLevelColumn);
Logger.log(filteredOptions)
applyValidationToCell(listToApply,cell);
}
}
function applySecondLevelValadation(val, r) {
if(val === "") {
ws.getRange(r, thirdLevelColumn).clearContent();
ws.getRange(r, thirdLevelColumn).clearDataValidations();
} else {
ws.getRange(r, thirdLevelColumn).clearContent();
var firstLevelColValue = ws.getRange(r, firstLevelColumn).getValue();
var filteredOptions = options.filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });
var listToApply = filteredOptions.map(function(o){ return o[2] });
var cell = ws.getRange(r, thirdLevelColumn);
Logger.log(filteredOptions);
applyValidationToCell(listToApply,cell);
}
}
function applyValidationToCell(list, cell) {
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule);
}