Проверка выпадающего списка Dyanamic (третий уровень) с использованием скрипта приложения - PullRequest
0 голосов
/ 10 октября 2019

У меня есть сценарий, написанный для применения трех уровней проверки. Первый уровень проверки находится в столбце 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]]

Снимок экрана листа "Опции"

Screenshot of

Снимок экрана "master" со всеми возможными опциями для столбца A и B и без опций для выбора в столбце C

Screenshot of

Любая помощь, выясняющая, почему 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);
}

1 Ответ

0 голосов
/ 11 октября 2019

Похоже, у вас проблема со столбцом времени. Вероятно, потому что это сравнивает строку с датой или что у вас. У нас будет больше информации, если вы предоставите копию электронной таблицы.

В любом случае, чтобы избежать этого, вы можете отформатировать данные в обоих столбцах B (как в «master», так и в «options») какобычный текст (для этого перейдите к Формат> Число> Простой текст в вашей электронной таблице). Затем вы можете написать время поездки в «вариантах» в виде простого текста.

Надеюсь, это вам поможет.

...