Sie fordern das Gegenteil von Datenvalidierung aus einer Liste. Tatsächlich soll die Datenüberprüfung fehlschlagen, anstatt erfolgreich zu sein, wenn der Wert in der Liste enthalten ist. Dies ist bei der Datenvalidierung nicht möglich, aber ein Skript kann dies tun.
Betrachten Sie das folgende Skript. Dieses Skript überwacht alle Änderungen und zeigt ein Meldungsfeld an, wenn ein Zellenwert einen anderen Zellenwert in derselben Spalte dupliziert.
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]
+ '"'
) ;
}
}
Es werden verschiedene praktische Verfeinerungen benötigt. Beispielsweise können Sie festlegen, dass nur bestimmte Spalten überwacht werden sollen, und Sie können festlegen, dass zusätzliche Aktionen ausgeführt werden sollen, z. B. das Ausblenden des Zellenwerts. Möglicherweise benötigen Sie eine spezielle Behandlung für leere (fehlende) Werte. Dies gibt Ihnen jedoch die grundlegende Technik, mit der Sie validieren können.
Aktualisieren:
Um die ursprüngliche Antwort zu erläutern, dachte ich, ich würde einige der von mir persönlich verwendeten Validierungen hinzufügen, die in der Antwort erwähnt wurden.
// Hier ist eine Funktion, mit der ich sicherstellen kann, dass nur eine Zelle bearbeitet wird.
function isRangeSingleCell(range) {
if(range.getRow() === range.getLastRow() && range.getColumn() === range.getLastColumn()) { return true; }
}
Um es zu verwenden, überspringen Sie einfach die Validierung, wenn mehr als eine Zelle bearbeitet wird
if(!isRangeSingleCell(range_active)) { return; }
Sie können die Validierung auch überspringen, wenn die Zeile nicht die erste Zeile ist:
if(range_active.getRowIndex() != 1) { return; }
Hinweis: Ich kann mich nicht genau erinnern, ob die Zeilenzählung bei 0 oder 1 beginnt, sodass dieser Code möglicherweise einen Fehler aufweist
Der Schlüssel zu onEdit-Überprüfungen besteht darin, so früh wie möglich zu beenden, um unnötige Berechnungen zu vermeiden. Der schnellste Abbruch einer Funktion ist eine leere return-Anweisung.