Вы запрашиваете противоположность проверки данных из списка. По сути, вы хотите, чтобы проверка данных завершилась неудачей, а не успешно, если значение находится в списке. Это невозможно с проверкой данных, но сценарий может это сделать.
Рассмотрим следующий скрипт. Этот скрипт отслеживает все изменения и выводит окно сообщения, когда значение ячейки дублирует любое другое значение ячейки в том же столбце.
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 является скорейшее завершение работы, чтобы избежать ненужных вычислений. Самый быстрый выход из функции - пустой оператор возврата.