Pytasz o przeciwieństwo sprawdzania poprawności danych z listy. W efekcie chcesz, aby sprawdzanie poprawności danych zakończyło się niepowodzeniem, a nie powodzeniem, jeśli wartość jest na liście. Nie jest to możliwe w przypadku sprawdzania poprawności danych, ale skrypt może to zrobić.
Rozważ następujący skrypt. Ten skrypt monitoruje wszystkie zmiany i wyświetla okno komunikatu, gdy wartość komórki powiela dowolną inną wartość komórki w tej samej kolumnie.
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]
+ '"'
) ;
}
}
Potrzebne będą różne udoskonalenia praktyczne. Na przykład możesz zdecydować się na monitorowanie tylko niektórych kolumn i możesz podjąć dodatkowe działania, takie jak wykasowanie wartości komórki. Może być potrzebna specjalna obsługa pustych (brakujących) wartości. Ale to daje podstawową technikę, która pozwoli ci potwierdzić.
Aktualizacja:
Aby rozwinąć pierwotną odpowiedź, pomyślałem, że dodam kilka poprawek, których osobiście używam, które zostały wymienione w odpowiedzi.
// Oto funkcja, której używam, aby zapewnić, że edytowana jest tylko jedna komórka.
function isRangeSingleCell(range) {
if(range.getRow() === range.getLastRow() && range.getColumn() === range.getLastColumn()) { return true; }
}
Aby go użyć, po prostu pomiń sprawdzanie poprawności, jeśli edytowanych jest więcej niż jedna komórka
if(!isRangeSingleCell(range_active)) { return; }
Możesz także pominąć sprawdzanie poprawności, jeśli wiersz nie jest pierwszym wierszem:
if(range_active.getRowIndex() != 1) { return; }
Uwaga: nie pamiętam z góry głowy, jeśli liczenie wierszy zaczyna się od 0 lub 1, więc ten kod może zawierać błąd
Kluczem do sprawdzania poprawności onEdit jest jak najwcześniejsze wyjście, aby zaoszczędzić na niepotrzebnych obliczeniach. Najszybszym wyjściem z funkcji jest pusta instrukcja return.