Не работает зависимый раскрывающийся список на основе сценариев (листы) - PullRequest
0 голосов
/ 26 апреля 2020

Я настроил этот скрипт, чтобы он выдавал мне выпадающий список в ячейке Y4, в зависимости от значения, выбранного в ячейке S4. Данные, откуда поступают оба значения, основаны на другом листе с именем DW, начиная со строки 2, поскольку у него есть заголовки.

function onEdit(){
  var tabLists = "DW";
  var tabValidation = "EditItem";
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(tabLists);
  var activeCell = ss.getActiveCell();

  if(activeCell.getColumn() == 19 && activeCell.getRow() == 4 && ss.getSheetName() == tabValidation){

    activeCell.offset(0, 6).clearContent().clearDataValidations();

    var makes = datass.getRange("A2:C").getValues();

    var makeIndex = makes[0].indexOf(activeCell.getValue()); //This gives me row2 to check below, but I need the column data, instead. How to change this one then?

    if(makeIndex != 0){

      var validationRange = datass.getRange("C2:C");
        var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
        activeCell.offset(0, 6).setDataValidation(validationRule);

     }  

  }

}

Я получаю список из списка DW ("C2: C") на Y4, но он не «фильтруется», в соответствии с названием предмета, выбранным на S4.

Любой индикатор того, что мне не хватает?

Спасибо!

1 Ответ

0 голосов
/ 27 апреля 2020

Если я правильно понял вашу проблему - проблема в вашем утверждении if(makeIndex != 0)

Имейте в виду, что метод indexOf возвращает -1, а не 0, если запись не найден в массиве.

Итак, вам следует запросить if(makeIndex != -1), если вы хотите реализовать проверку данных только в том случае, если activeCell.getValue() содержится в "C2:C".

ОБНОВЛЕНИЕ

  • Вы хотите знать, какая строка в столбце B содержит значение в S4
  • Вы хотите использовать значение в столбце C этой строки, которое будет использоваться для проверки данных в Y4

В этом случае вам нужно

  • преобразовать записи в столбце B в массив с возможностью поиска - это можно сделать с помощью map ()
  • найти соответствующее значение в столбце C - это можно сделать, вручную построив нотацию A1 ячейки с найденным индексом

Пример:

    var makes = datass.getRange("A2:C").getValues();    
    var searchArray=makes.map(function(e){return e[1];});                            
    var makeIndex = searchArray.indexOf(activeCell.getValue());    
    if(makeIndex != -1){
      var validationRange = datass.getRange("C" + (2+makeIndex));
      var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
      activeCell.offset(0, 6).setDataValidation(validationRule);

    } 

Примечания:

  • Похоже, вы не используете colum n A, поэтому нет необходимости включать его в диапазон makes
    • Обозначения типа A2:C не очень эффективны, поскольку включают много пустых строк. Вместо этого лучше использовать в качестве поля последнюю строку с содержанием
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...