Google Sheets - несколько зависимых раскрывающихся списков - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь создать зависимый список, как описано и ответил (со сценарием) здесь.

Я бы хотел добиться этого, если выбрал определенное значение (например, «Первый»)) из ячейки в столбце 1, то раскрывающиеся параметры следующей ячейки в той же строке должны предлагать диапазон значений из столбца на другом листе с тем же заголовком, что и значение в первой левой ячейке (т.е. первый лист называется «Селектор» - в котором есть выпадающие списки, на втором листе «KAT» у меня есть варианты для этих выпадающих списков).Это должно быть возможно для каждой строки в зависимости от значения каждой первой ячейки строки.

Я попытался использовать и адаптировать предложенный скрипт и просмотрел файлы примеров в статье, но мне, видимо, не хватает некоторыхбазовое понимание сценария, чтобы можно было адаптировать и правильно его реализовать.

Может ли кто-нибудь помочь мне с правильной работой этого динамического выпадающего меню?

Просто чтобы прояснить мое последнее намерение: я хотел бычтобы этот скрипт работал первым, чтобы иметь возможность использовать его для нескольких файлов.Моя конечная цель, однако, состоит в том, чтобы создать самозаполняющиеся раскрывающиеся списки и селекторы, чтобы я мог просто заполнить данные на листе «Селектор» и затем иметь возможность выбрать эти же значения позже в ячейках ниже (в зависимости отимя (значение) первой ячейки в строке = первая ячейка столбца, содержащего диапазон проверки).Я надеюсь, что мне удастся добиться этого, используя сводную таблицу или любую другую формулу на листе «KAT», которая объединит мои данные с листа «Селектор» и вернет их обратно в виде раскрывающихся опций ...).

Спасибо за вашу помощь.

См. Лист с примерами здесь

Код, который я использовал (как указано выше):

function onEdit() 
    {
      var ss = SpreadsheetApp.getActiveSpreadsheet(),
          sheet = ss.getActiveSheet(),
          name = sheet.getName();
      if (name != 'Selector') return;
      var range = sheet.getActiveRange(),
          col = range.getColumn();
      if (col != 1) return;
      var val = range.getValue(),
          dv = ss.getSheetByName('KAT'),
          data = dv.getDataRange().getValues(),
          catCol = data[0].indexOf(val),
          list = [];
      Logger.log(catCol)
      for (var i = 1, len = 100; i < len; i++) // Problem is here, you have too many items in list! Cannot have more 500 items for validation
          list.push(data[i][catCol]);
      var listRange = dv.getRange(2,catCol +1,dv.getLastRow() - 1, 1)
      Logger.log(list)
      var cell = sheet.getRange(range.getRow(), col-1)
      var rule = SpreadsheetApp.newDataValidation()
      .requireValueInRange(listRange)   // Use requireValueIn Range instead to fix the problem
      .build();
      cell.setDataValidation(rule);
      Logger.log(cell.getRow())
    }

1 Ответ

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

Этот вопрос касается динамических выпадающих списков.На предыдущий вопрос и ответ в StackOverflow ( Google Sheets - Зависимые раскрывающиеся списки ) были ссылки, а код из этого ответа был неудачно переназначен.

Код в вопросе былне работает по одной причине: строка 20

var cell = sheet.getRange(range.getRow(), col-1)

В ссылочном коде раскрывающийся список начинается в столбце F (столбец = 6).Зависимые выпадающие списки располагались слева, поэтому определение зависимого столбца было «col-1».В сценарии спрашивающего раскрывающийся список начинается в столбце А (столбец = 1), а зависимые раскрывающиеся списки располагаются слева направо.Однако эта строка кода не была изменена, чтобы учесть различное расположение.Вместо "col-1" это должно быть "col + 1".

Прочие вопросы

  • В дополнение к этому строки 16 и 17 выполняют цикл для создания массиваэто может быть использовано для зависимого раскрывающегося списка.Однако цикл является избыточным, поскольку раскрывающийся список фактически определяется путем создания и назначения диапазона на листе «KAT».
  • Ячейка A2 KAT включает формулу:

    =sort(unique(Selector!$A$2:$A),1,true)

    Это может показаться полезным, поскольку оно автоматически добавляет любое новое раскрывающееся значение, введенное в «Селекторе»"к списку значений в КАТ.В действительности это непродуктивно, потому что зависимая выпадающая компоновка кода работает вертикально, а не горизонтально.Поэтому дополнительная строка, добавленная в KAT, сама по себе не способствует построению зависимого раскрывающегося списка.

Следующий код работает для построения зависимого раскрывающегося списка.Я намеренно оставил в коде несколько записей «Logger», чтобы помочь спрашивающему понять, как работает код.

function onEdit() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    var name = sheet.getName();

    if (name != 'Selector') return;
    var range = sheet.getActiveRange();
    var col = range.getColumn();
    var dropdownrow = range.getRow(); // added for debugging and informationm

    if (col != 1) return;

    var val = range.getValue();
    Logger.log("the cursor is in 'Selector' in cell = " + range.getA1Notation()); //DEBUG
    Logger.log("That's row " + dropdownrow + ", and column " + col + ". The value selected = " + val); // DEBUG



    var dv = ss.getSheetByName('KAT');
    var data = dv.getDataRange().getValues();
    var catCol = data[0].indexOf(val);
    var list = [];
    var KAT_data = dv.getDataRange();
    var KAT_data_len = KAT_data.getLastRow(); // added to give 'for' loop a sensible range

    Logger.log("The data range on KAT is " + KAT_data.getA1Notation() + ", and the last row of data = " + KAT_data_len); //DEBUG
    Logger.log("KAT data = '" + data + "'"); // DEBUG
    Logger.log("Found the dropdown cell value of '" + val + "' in KAT as item #" + catCol); //DEBUG

    for (var i = 1, len = KAT_data_len; i < len; i++) { // Irrelevant because the data validation range is obtained by defining a range on KAT

        // Problem is here, the unique command in A2 creates a blank row
        // Logger.log("i="+i+", data = "+data[i][catCol]); // DEBUG
        list.push(data[i][catCol]);

    }

    var listRange = dv.getRange(2, catCol + 1, dv.getLastRow() - 1, 1);
    Logger.log("FWIW, this is the list after the loop= " + list); // DEBUG
    Logger.log("The contents for the new data validation range (taken from KAT) is " + listRange.getA1Notation()); // DEBUG
    Logger.log("The new validation range gets added to col = " + (col + 1)); // DEBUG

    //var cell = sheet.getRange(range.getRow(), col-1); // governs the next validation range. Example validation worked right to left, but this sheet works left to right. So must ADD 1, not subtract 1.
    var cell = sheet.getRange(range.getRow(), col + 1);
    Logger.log("The cell to be assigned the new validation range will be " + cell.getA1Notation()); // DEBUG
    var rule = SpreadsheetApp.newDataValidation().requireValueInRange(listRange).build(); // Build validation rule
    cell.setDataValidation(rule); // assign validation range to new cell

}

Стоит ли этот код?

Код, как написано и на него ссылается, ограничен созданием только одного уровня зависимых выпадающих списков.В этом смысле оно имеет очень ограниченную ценность.Обоснован другой подход к созданию зависимых выпадающих списков.

" Как вы выполняете динамические / зависимые выпадающие списки в Google Sheets? " в StackOverflow был местом встречи для обсуждения и обновления методов длядинамически зависимые выпадающие списки с 2014 года. Последнее обновление было в феврале 2018 года по Макс Махров .Описанный здесь код может быть полезен для спрашивающего.

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