Принудительная уникальность в столбце электронных таблиц Google


37

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

По сути, я хочу создать первичный ключ для базы данных. Кто-нибудь знает, как это сделать в Google Spreadsheets?

Если это поможет, я создал форму для использования с таблицей Google (база данных), которая будет вводить данные в таблицу и хотел бы убедиться, что пользователь не вводит то же имя, что и кто-либо еще в списке.


4
Хорошо, это нужно сказать: так же, как Excel, Google Spreadsheets не является ядром базы данных. Возможно, вы захотите рассмотреть какой-нибудь реальный сервер базы данных, который мог бы сделать это правильно. У нас более 20 лет очень плохого опыта работы с людьми, использующими Excel в качестве базы данных, и я не хотел бы видеть, что все должны усвоить эти уроки повсюду. Электронная таблица! = База данных. Изучи это, живи этим, люби это.
Майкл Кохн


2
Excel, текстовые файлы и строки в песке могут быть базой данных, если используются правильно. Тем не менее, функция массовой многопользовательской игры в Google Sheets означает, что было бы замечательным кандидатом добавить еще несколько функций базы данных.
Уильям Энтрикен,

Ответы:


54
=COUNTIF($A:$A,"="&A1)  < 2

Если вы введете это в качестве пользовательской формулы для правила проверки данных для столбца A, столбец A отклонит все дубликаты.


Это очень простой способ выделить дубликаты, не вдаваясь в сценарии. Вы только что спасли мое утро .. спасибо!
Матфея

3
Не могли бы вы объяснить, что означает формула? Что означает A1? Должен ли я изменить его, A2если мои данные начинаются со второго ряда?
Томаш Зато - Восстановить Монику

6

У меня нет решения, если вы настаиваете на использовании формы, но в остальном у меня есть очень простое решение: допустим, уникальный столбец - A. Затем вы создаете следующее правило проверки данных на A2 (1-я запись после заголовка). : =COUNTIF($A$1:$A$999,A2)<=1. Затем вы копируете ячейку и выбираете весь столбец, щелкаете правой кнопкой мыши, расширяете специальное подменю вставки и нажимаете только Вставить проверку данных . Это оно!


2

Вы запрашиваете противоположность проверки данных из списка. По сути, вы хотите, чтобы проверка данных завершилась неудачей, а не успешно, если значение находится в списке. Это невозможно с проверкой данных, но сценарий может это сделать.

Рассмотрим следующий скрипт. Этот скрипт отслеживает все изменения и выводит окно сообщения, когда значение ячейки дублирует любое другое значение ячейки в том же столбце.

function onEdit( event )
{
  // Store the edited sheet.
  var sheet_active = event .source .getActiveSheet() ;

  // Store the edited range.
  var range_active = event .source .getActiveRange() ;

  // Store the row, column, and value of the edited cell.
  var row_edited = range_active .getRow() ;
  var column_edited = range_active .getColumn() ;
  var value_edited = range_active .getValue() ;

  // Store a range consisting of the column containing the edited cell.
  var range_column_edited = sheet_active .getRange(
    1 , column_edited ,
    sheet_active .getMaxRows() , 1
  ) ;

  // Store an array consisting of the values in the column.
  var values_column_edited = range_column_edited .getValues() ;

  // Compare each value to the edited cell.
  for( var r = 0 ; r < values_column_edited .length ; r++ )
  {
    if( r+1 == row_edited ) continue ;
    if( values_column_edited[r] == value_edited )
      Browser .msgBox(
        'value_edited="'
        + value_edited
        + '" values_column_edited['
        + r
        + ']="'
        + values_column_edited[r]
        + '"'
      ) ;
  }
}

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

Обновить:

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

// Вот функция, которую я использую, чтобы убедиться, что редактируется только одна ячейка.

function isRangeSingleCell(range) {
  if(range.getRow() === range.getLastRow() && range.getColumn() === range.getLastColumn()) { return true; }
}

Чтобы использовать его, просто пропустите проверку, если отредактировано более одной ячейки

if(!isRangeSingleCell(range_active)) { return; }

Вы также можете пропустить проверку, если строка не является первой строкой:

if(range_active.getRowIndex() != 1) { return; }

Примечание: я не могу вспомнить с головы до головы, если подсчет строк начинается с 0 или 1, поэтому в этом коде может быть ошибка

Ключом к валидации onEdit является скорейшее завершение работы, чтобы избежать ненужных вычислений. Самый быстрый выход из функции - пустой оператор возврата.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.