Google Sheets - Проверка данных - Формирование уникальности из выпадающего списка - PullRequest
0 голосов
/ 03 мая 2019

У меня есть столбец на странице Google, где пользователь должен выбрать список элементов в раскрывающемся списке, но каждое значение в столбце должно быть уникальным.

Я нашел несколько способов сделать это, но ни один не настолько хорош.

Для начала я попытался использовать это решение - https://infoinspired.com/google-docs/spreadsheet/distinct-values-in-drop-down-list-in-google-sheets/ - которое использует функцию запроса, чтобы создать динамически изменяющийся столбец, на который указывает проверка данных. Это работает, но проблема в том, что как только вы вводите значение, оно становится недействительным и выдает ошибку, которая не выглядит профессионально.

Я также попробовал функцию onEdit, которая постоянно обновляет проверку ячейки со списком параметров:

function onEdit(){
 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet 1");
 var original = sheet.getRange(7,8,20,1).getValues(); /list of cells for data validation to be added
 var option = new Array();
 dvSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Drop Downs");
 option = dvSheet.getRange('G1:G250').getValues();
 option.push(["dummy"])
 var i
 var dv = SpreadsheetApp.newDataValidation();
 for(i=0;i<20;i++){
    option[250][0] = original[i][0];
    dv.setAllowInvalid(false);  
 // dv.setHelpText("Some help text here");
    dv.requireValueInList(option, true);
    sheet.getRange(i+7,8).setDataValidation(dv.build());
  }
}

'Drop Downs'! G1: G250 - это список, сгенерированный из решения 1. Код берет этот список и добавляет содержимое ячейки в этот список, а затем устанавливает список в качестве проверки данных.

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

Другой вариант, о котором я подумал, - указать каждую ячейку на уникальный столбец, составленный из решения 1, с добавлением содержимого этой ячейки в конец. Но я не заинтересован в создании столбцов для каждой отдельной ячейки, поскольку их будет много (больше, чем 20, подразумеваемых в коде).

Что было бы здорово, так это то, что если бы Google позволил вам комбинировать диапазоны при проверке данных, то я мог бы объединить столбец из решения 1 с текущей ячейкой. Но, насколько я могу судить, это не так.

Может кто-нибудь думать о чем-то еще? У меня такое ощущение, что я либо слишком усложнил это, и есть простое решение - либо я слишком привередлив.

1 Ответ

0 голосов
/ 03 мая 2019

Для всех, кто столкнется с этим в будущем:

По предложению TheMaster я написал функцию onEdit, которая удаляет проверку из полной ячейки и добавляет проверку в пустые ячейки:

function onEdit(){
    var spreadsheet = SpreadsheetApp.getActive();
  var i
  var j
   var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet 1");
  var original = sheet.getRange(7,8,20,1).getValues();
  var emptyarray = new Array();
  var fullarray = new Array();
  for (i=0;i<20;i++){
    if (original[i][0] === ""){
emptyarray.push(i);
  }
  else {
fullarray.push(i);
  }
}

      for each(i in fullarray){
        j=Number(i)+7
        sheet.getRange('H'+j).clearDataValidations()
      }
        for each(i in emptyarray){
          j=Number(i)+7
          sheet.getRange('\'Sheet 1\'!H'+j).setDataValidation(SpreadsheetApp.newDataValidation()
          .setAllowInvalid(true)
          .requireValueInRange(spreadsheet.getRange('\'Drop Downs\'!$G:$G'), true)
          .build());
      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...