Anda meminta kebalikan dari validasi data dari daftar. Akibatnya, Anda ingin validasi data gagal, bukannya berhasil, jika nilainya ada dalam daftar. Ini tidak mungkin dengan validasi data, tetapi skrip dapat melakukannya.
Pertimbangkan skrip berikut. Skrip ini memantau semua pengeditan, dan memunculkan kotak pesan ketika nilai sel menduplikasi nilai sel lainnya di kolom yang sama.
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]
+ '"'
) ;
}
}
Akan ada berbagai penyempurnaan praktis yang dibutuhkan. Misalnya, Anda dapat memilih untuk memantau hanya kolom tertentu, dan Anda dapat memilih untuk mengambil tindakan tambahan, seperti mengosongkan nilai sel. Anda mungkin perlu penanganan khusus untuk nilai kosong (hilang). Tapi ini memberi Anda teknik dasar yang akan memungkinkan Anda memvalidasi.
Memperbarui:
Untuk menguraikan jawaban asli saya pikir saya akan menambahkan beberapa validasi yang saya gunakan secara pribadi yang disebutkan dalam jawaban.
// Ini fungsi yang saya gunakan untuk memastikan bahwa hanya satu sel yang sedang diedit.
function isRangeSingleCell(range) {
if(range.getRow() === range.getLastRow() && range.getColumn() === range.getLastColumn()) { return true; }
}
Untuk menggunakannya lewati saja validasi jika lebih dari satu sel diedit
if(!isRangeSingleCell(range_active)) { return; }
Anda juga dapat melewati validasi jika barisnya bukan baris pertama:
if(range_active.getRowIndex() != 1) { return; }
Catatan: Saya tidak dapat mengingat dari atas kepala saya jika penghitungan baris dimulai pada 0 atau 1 sehingga kode ini mungkin memiliki bug
Kunci validasi onEdit adalah keluar sedini mungkin untuk menyelamatkan dari perhitungan yang tidak perlu. Keluar tercepat dari suatu fungsi adalah pernyataan pengembalian kosong.