Memaksa keunikan di kolom Google Spreadsheets

37

Saya telah membuat Google spreadsheet (bertindak sebagai basis data) yang memiliki banyak kolom, nama menjadi salah satunya, dan saya ingin memastikan bidang nama selalu unik dan tidak ada baris yang dapat dibuat jika bidang nama sama dengan yang lain baris.

Pada dasarnya saya ingin membuat kunci utama untuk basis data. Adakah yang tahu cara melakukan ini di Google Spreadsheets?

Jika ini membantu, saya membuat formulir untuk pergi dengan Google Spreadsheet (database) yang akan memasukkan data ke lembar dan akan senang untuk memastikan pengguna tidak memasukkan nama yang sama dengan orang lain dalam daftar.

Rubén
sumber
4
OK, ini perlu dikatakan: Sama seperti Excel, Google Spreadsheets bukan mesin basis data. Anda mungkin ingin mempertimbangkan semacam backend database nyata yang bisa melakukan ini dengan benar. Kami memiliki 20+ tahun pengalaman yang sangat buruk dengan orang-orang yang menggunakan Excel sebagai database, dan saya benci melihat semua orang harus mempelajari pelajaran-pelajaran itu di BELUM LAGI. Spreadsheet! = Database. Pelajarilah, hidupilah, cintai.
Michael Kohne
2
Excel, file teks, dan garis dalam pasir dapat menjadi database, jika digunakan dengan benar. Yang mengatakan, fitur multiplayer besar-besaran dari Google Sheets berarti itu akan menjadi kandidat yang luar biasa untuk menambahkan beberapa fitur database di dalamnya.
William Entriken

Jawaban:

54
=COUNTIF($A:$A,"="&A1)  < 2

Jika Anda menempatkan ini sebagai Formula Khusus untuk aturan Validasi Data untuk Kolom A, Kolom A akan menolak semua duplikat.

Testare
sumber
Ini adalah cara yang sangat sederhana untuk menyorot duplikat tanpa masuk ke skrip apa pun. Anda baru saja menyelamatkan pagi saya .. terima kasih!
Matius
3
Bisakah Anda jelaskan apa artinya rumus itu? Apa artinya A1? Haruskah saya mengubahnya A2jika data saya mulai di baris kedua?
Tomáš Zato - Pasang kembali Monica
6

Saya tidak punya solusi jika Anda bersikeras menggunakan formulir, tetapi sebaliknya saya punya solusi yang sangat sederhana: Katakanlah kolom uniknya adalah A. Kemudian Anda membuat aturan validasi data berikut pada A2 (catatan pertama setelah header) : =COUNTIF($A$1:$A$999,A2)<=1. Kemudian, Anda menyalin sel dan memilih seluruh kolom, klik kanan, perluas submenu tempel khusus , dan klik tempelkan validasi data saja . Itu dia!

ShulemJ
sumber
2

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.

MetaEd
sumber