Несколько зависимых выпадающих динамических c с повторяющимися выпадающими столбцами в Google Sheets - PullRequest
0 голосов
/ 17 января 2020

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

Я хотел бы помочь изменить сценарий для выполнения двух действий:

  1. Независимо от того, какое действие выбрано из выпадающего меню в столбце I я хотел бы, чтобы те же параметры выпадающего меню были доступны (повторяться) для столбцов JL. Как видите, я нашел способ сделать это, но мне он кажется неуклюжим и не идеальным, и оставляет слишком много места для ошибок. Пользователи не должны выбирать действие дважды, но я включил условное форматирование, чтобы пометить это, если они это сделают. Однако:
  2. В идеале, но не менее важно, если элементы раскрывающегося меню все еще могут повторяться для столбцов JL, но после выбора действия в предыдущих ячейках этот параметр удаляется из каждого из следующих повторяющихся раскрывающихся меню в дополнительных столбцах. , вплоть до столбца L. Это поможет избежать случайного повторения действия.

Примечание: справочный вопрос " Как вы выполняете динамические c / зависимые выпадающие списки в Google Sheets?"

Спасибо!

1 Ответ

0 голосов
/ 21 января 2020

Когда одна из раскрывающихся ячеек отредактирована, вы можете использовать триггер onEdit [1], чтобы перебрать 4 столбца (IL) и обновить раскрывающиеся списки в каждой ячейке, удаляя параметр, выбранный в отредактированной ячейке. Вам также необходимо добавить старое выбранное значение (ранее удаленное из других опций) в другие выпадающие списки. Для этого вы можете использовать функции getDataValidation [2] и getCriteriaValues [3], связанные с объектом Range, чтобы извлечь массив текущих выпадающих значений в этом диапазоне и удалить параметр, соответствующий выбранному параметру.

Используйте функцию newDataValidation() [4], чтобы создать новое правило, используя обновленный массив раскрывающихся значений, и функцию setDataValidation [5], чтобы задать правило в диапазоне.

function onEdit(event) {
  var range = event.range;
  var sheetName = range.getSheet().getSheetName();
  var col = range.getColumn();
  var newValue = event.value;
  var oldValue = event.oldValue;

  //If the edited range is in sheet '3W' and beetween columns I-L
  if(sheetName == '3W') {
    if(col>=9 && col<=12) {

      for(var i=9; i<13; i++) {
        //Don't change anything for edited cell
        if(col == i) { continue; }
        else {
          //Get range to update and current dropdown values for that range
          var rangeToUpdate = range.getSheet().getRange(range.getRow(), i, 1, 1);
          var dropdownValues = rangeToUpdate.getDataValidation().getCriteriaValues()[0];

          //Find new edited value and delete it from options array
          var index = dropdownValues.indexOf(newValue);
          if (index > -1) {
            dropdownValues.splice(index, 1);
          }

          //If previous selected value is not beetween the options, add it
          if(oldValue && dropdownValues.indexOf(oldValue) == -1) {
            Logger.log(oldValue)
            dropdownValues.push(oldValue);
          }

          //Set new dropdown values to range 
          var updatedRule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownValues, true).setAllowInvalid(false);
          rangeToUpdate.setDataValidation(updatedRule);
        }
      }    
    }
  }
}

Запустите только первый раз, чтобы установить все раскрывающиеся списки в столбцах IL, которые получают его из диапазона E1: E10:

function setDropdownsInitially() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  //Range with the dropdown values 
  var sheet = ss.getSheetByName("indicators");
  var dropdownValues = sheet.getRange("E1:E10").getValues();

  //Data validation rule
  var rule = SpreadsheetApp.newDataValidation().requireValueInList(dropdownValues, true).setAllowInvalid(false);

  //Range where the dropdowns will be created
  var targetSheet = ss.getSheetByName("3W");
  var cells = targetSheet.getRange("I2:L"); 

  //Set data validation rule
  cells.setDataValidation(rule);
}

[1] https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

[2] https://developers.google.com/apps-script/reference/spreadsheet/range#getdatavalidation

[3] https://developers.google.com/apps-script/reference/spreadsheet/data-validation-builder.html#getcriteriavalues

[4] https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#newdatavalidation

[5] https://developers.google.com/apps-script/reference/spreadsheet/range#setdatavalidationrule

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