Está solicitando lo contrario de la validación de datos de una lista. En efecto, desea que la validación de datos falle, en lugar de tener éxito, si el valor está en la lista. Esto no es posible con la validación de datos, pero un script puede hacerlo.
Considere la siguiente secuencia de comandos. Este script monitorea todas las ediciones y muestra un cuadro de mensaje cuando un valor de celda duplica cualquier otro valor de celda en la misma columna.
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]
+ '"'
) ;
}
}
Habrá varios refinamientos prácticos necesarios. Por ejemplo, puede optar por monitorear solo ciertas columnas, y puede optar por tomar medidas adicionales, como eliminar el valor de la celda. Es posible que necesite un manejo especial para los valores en blanco (faltantes). Pero esto le brinda la técnica básica que le permitirá validar.
Actualizar:
Para elaborar la respuesta original, pensé que agregaría algunas de las validaciones que uso personalmente que se mencionaron en la respuesta.
// Aquí hay una función que uso para asegurar que solo se edite una celda.
function isRangeSingleCell(range) {
if(range.getRow() === range.getLastRow() && range.getColumn() === range.getLastColumn()) { return true; }
}
Para usarlo, simplemente omita la validación si se edita más de una celda
if(!isRangeSingleCell(range_active)) { return; }
También puede omitir la validación si la fila no es la primera fila:
if(range_active.getRowIndex() != 1) { return; }
Nota: No puedo recordar la parte superior de mi cabeza si el conteo de filas comienza en 0 o 1, por lo que este código puede tener un error
La clave para las validaciones de onEdit es salir lo antes posible para ahorrar de cómputos innecesarios. La salida más rápida de una función es una declaración de devolución vacía.