Você está pedindo o oposto da validação de dados em uma lista. Na verdade, você deseja que a validação dos dados falhe, em vez de ter êxito, se o valor estiver na lista. Isso não é possível com a validação de dados, mas um script pode fazer isso.
Considere o seguinte script. Este script monitora todas as edições e exibe uma caixa de mensagem quando um valor de célula duplica qualquer outro valor de célula na mesma coluna.
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]
+ '"'
) ;
}
}
Haverá vários refinamentos práticos necessários. Por exemplo, você pode optar por monitorar apenas determinadas colunas e pode executar ações adicionais, como apagar o valor da célula. Você pode precisar de tratamento especial para valores em branco (ausentes). Mas isso fornece a técnica básica que permitirá validar.
Atualizar:
Para elaborar a resposta original, pensei em adicionar algumas das validações que eu pessoalmente uso mencionadas na resposta.
// Aqui está uma função que eu uso para garantir que apenas uma célula esteja sendo editada.
function isRangeSingleCell(range) {
if(range.getRow() === range.getLastRow() && range.getColumn() === range.getLastColumn()) { return true; }
}
Para usá-lo, pule a validação se mais de uma célula for editada
if(!isRangeSingleCell(range_active)) { return; }
Você também pode pular a validação se a linha não for a primeira:
if(range_active.getRowIndex() != 1) { return; }
Nota: Não me lembro de nada se a contagem de linhas começar em 0 ou 1, portanto, este código pode ter um erro
A chave para as validações do onEdit é sair o mais cedo possível para economizar em cálculos desnecessários. A saída mais rápida de uma função é uma declaração de retorno vazia.