Раскрывающийся список с условиями в другом раскрывающемся списке - PullRequest
0 голосов
/ 05 октября 2018

Как я могу сделать выпадающий список из нескольких списков с условием из другого выпадающего списка?

Используя мое изображение выше, скажем, я в первом выпадающем списке (этотпростой) выберите «Мебель» ... Я бы хотел, чтобы во втором раскрывающемся списке отображалась только мебель.То же самое и с третьим выпадающим списком. Хотелось бы, чтобы там отображался только цвет моего второго выбора.

Не пытался ли разместить критерий «Пользовательская формула» в «Проверке данных» один из этихдве формулы, но не работает ...

=FILTER(Object,Type = E2) 

или

=QUERY(A:C,"SELECT B WHERE A='"&E2&"' ", 0)

Читал в какой-то другой теме здесь, что это было невозможно с формулами, и я не мог найти скрипт приложениядля этого.Как я могу разместить условные правила и сделать так, чтобы в раскрывающемся меню вместо них отображались только те значения, которые я хочу?Я думаю, что это как-то связано с «withCriteria (критерии, аргументы)», однако я не понимаю, как его применять.

По поводу списка ... он будет составлен, возможно, с 2k строк (каждая строка3 колонки).Первый столбец будет иметь (возможно) 6 или 7 разных значений.Второй около 70 или 80 и третий все разные.Порядок будет случайным, потому что могут быть добавлены новые значения, и я могу добавить новую Мебель или Животное ...

Это код, который у меня сейчас есть

function onEdit(e) {
  var range = e.range;
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  if ( range.getRow() > 1) {
    if ( range.getColumn() == 5) {
      var cell_Range = ss.getRange( range.getRow(), range.getColumn() + 1);
      var cell = cell_Range.getCell( 1, 1);
      var rangeV = SpreadsheetApp.getActive().getRange('B2:B13');
      var rule = SpreadsheetApp.newDataValidation().requireValueInRange(rangeV).build();
      cell.setDataValidation(rule);
    }
    else if ( range.getColumn() == 6 ) { 
      var cell_Range = ss.getRange( range.getRow(), range.getColumn() + 1);
      var cell = cell_Range.getCell( 1, 1);
      var rangeV = SpreadsheetApp.getActive().getRange('C2:C13');
      var rule = SpreadsheetApp.newDataValidation().requireValueInRange(rangeV).build();
      cell.setDataValidation(rule);

    }
  }
}

Пример листа на https://docs.google.com/spreadsheets/d/1aLpYd8fC0jpwvQOPVTj_yvY7DVKeFFnPvpJSF27if6w/edit?usp=sharing

Заранее спасибо

1 Ответ

0 голосов
/ 06 октября 2018

Решение:

  • Использовать подтверждение данных requireValueInList

Поток:

  • Получить все параметры A1:C в виде массива
  • Фильтр A (Col1), если в нем присутствует отредактированное значение в E (Col5)
  • Извлечение соответствующего Col2 (B) в качестве параметров и проверка данных построения на его основе
  • Смещение отредактированного диапазонана 1 столбец и установите DataValidation

Пример сценария:

function onEdit(e) {
  const SETTINGS = {
    //Edited Column : Column to Check(First col in optionsDataRange is considered 1)
    5: 1,
    6: 2,
  };
  var editedRange = e.range,
    editedSheet = editedRange.getSheet(),
    val = e.value,
    col = editedRange.columnStart,
    row = editedRange.rowStart;

  /*Exit clause(s)*/
  if (
    Object.keys(SETTINGS).indexOf(col.toString()) === -1 || //If edited col is not in settings
    editedSheet.getName() !== 'Sheet1' ||
    row > 5
  )
    return;

  var optionsDataRange = editedSheet
    .getRange(1, 1, editedSheet.getLastRow(), 3)
    .getValues();

  /*Only get options where val is present in optionsDataRange*/
  var options = optionsDataRange
    .map(function(e) {
      return e[SETTINGS[col] - 1] == val ? e[SETTINGS[col]] : null;
    })
    .filter(function(e, i, a) {
      return e !== null && a.indexOf(e) === i;
    });

  var dv = SpreadsheetApp.newDataValidation()
    .requireValueInList(options)
    .build();
  editedRange.offset(0, 1).setDataValidation(dv);
}

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...