Три выпадающих списка в зависимости друг от друга - PullRequest
1 голос
/ 05 марта 2020

Мне нужно получить три зависимых выпадающих списка, которые зависят друг от друга. Вот редактируемый лист с примером. Ячейки в желтом столбце содержат раскрывающийся список, основанный на обычной проверке данных (лист параметров). Ячейки в зеленом столбце дают соответствующий раскрывающийся список, который основан на сценарии. А в синем столбце мне нужно получить соответствующий список из списка параметров с именами, соответствующими данным в среднем зеленом столбце.

Буду признателен за любую помощь.

var mainWsName = "master";
var optionsWsName = "options";
var firstLevelColumn = 12;
var secondLevelColumn = 13;
var thirdLevelColumn = 14;

var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainWsName);
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionsWsName);


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 > 4){
    applyFirstLevelValidation(val,r);
  } else if(wsName === mainWsName && c === secondLevelColumn && r > 4){
    applySecondLevelValidation(val,r);
  } 


} //end onEdit

function applyFirstLevelValidation(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);
    applyValidationToCell(listToApply,cell);
   }

}  



function applySecondLevelValidation(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);
    applyValidationToCell(listToApply,cell);
   }

}  

function applyValidationToCell(list,cell){

  var rule = SpreadsheetApp
  .newDataValidation()
  .requireValueInlist(list)
  .setAllowInvalid(false)
  .build();

  cell.setDataValidation(rule)
}

0

1 Ответ

1 голос
/ 06 марта 2020
  • Вы хотите показать выпадающий список для столбца «N» в столбце «M».

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Точки модификации:

  • options не объявлено для функции applyFirstLevelValidation и applySecondLevelValidation.
  • r.thirdLevelColumn из ws.getRange(r.thirdLevelColumn) возникает ошибка. Потому что r - это число.
  • .requireValueInlist(list) - это .requireValueInList(list). Это орфографическая ошибка.

Модифицированный скрипт:

Когда ваш скрипт модифицирован, пожалуйста, измените его следующим образом.

От:

var filteredOptions = options.filter(function(o){ return o[0] === val });

До:

var filteredOptions = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] === val });

и

От:

var filteredOptions =options.filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });

До:

var filteredOptions = wsOptions.getDataRange().getValues().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);
applyValidationToCell(listToApply,cell);

Кому:

var listToApply = filteredOptions.map(function(o){ return o[2] });
var cell = ws.getRange(r, thirdLevelColumn);  // <--- Modified
applyValidationToCell(listToApply,cell);

и

От:

var rule = SpreadsheetApp
.newDataValidation()
.requireValueInlist(list)
.setAllowInvalid(false)
.build();

Кому:

var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)  // <--- Modified
.setAllowInvalid(false)
.build();

Всего модифицированный скрипт:

var mainWsName = "master";
var optionsWsName = "options";
var firstLevelColumn = 12;
var secondLevelColumn = 13;
var thirdLevelColumn = 14;

var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainWsName);
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionsWsName);

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 > 4){
    applyFirstLevelValidation(val,r);
  } else if(wsName === mainWsName && c === secondLevelColumn && r > 4){
    applySecondLevelValidation(val,r);
  } 
} //end onEdit

function applyFirstLevelValidation(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 = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] === val });  // <--- Modified
    var listToApply = filteredOptions.map(function(o){ return o[1] });
    var cell = ws.getRange(r, secondLevelColumn);
    applyValidationToCell(listToApply,cell);
   }
}  

function applySecondLevelValidation(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 = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });  // <--- Modified
    var listToApply = filteredOptions.map(function(o){ return o[2] });
    var cell = ws.getRange(r, thirdLevelColumn);  // <--- Modified
    applyValidationToCell(listToApply,cell);
   }
}  

function applyValidationToCell(list,cell){
  var rule = SpreadsheetApp
  .newDataValidation()
  .requireValueInList(list)  // <--- Modified
  .setAllowInvalid(false)
  .build();

  cell.setDataValidation(rule)
}

Ссылки:

Если я неправильно понял ваш вопрос, и это не то направление, которое вы хотите, я прошу прощения.

...