Google E-Tablolar sütununda benzersizliği zorlama


37

Sayısız sütun içeren, bunlardan birinin adı olan bir Google e-tablosu (veritabanı olarak çalışan) oluşturdum ve ad alanının her zaman benzersiz olduğundan ve ad alanı başka bir satırsa satır oluşturulamayacağından emin olmak istedim. kürek çekmek.

Temel olarak bir veritabanı için birincil anahtar oluşturmak istiyorum. Bunu Google Spreadsheets'te nasıl yapabileceğini bilen var mı?

Eğer yardımcı olursa, sayfaya veri girecek ve bir kullanıcının zaten bir başkasıyla aynı adı girmemesini sağlamak isteyen Google E-Tablo (veritabanı) ile birlikte kullanılacak bir form oluşturdum.


4
Tamam, bunun söylenmesi gerekiyor: Tıpkı Excel gibi, Google Spreadsheets de bir veritabanı motoru değil. Bunu doğru bir şekilde yapabilecek bir çeşit gerçek veritabanı arka ucu düşünebilirsiniz. Excel'i veritabanı olarak kullanan kişilerle 20 yıldan fazla süredir yaşadığımız çok kötü bir deneyime sahibiz ve YET AGAIN'in her yerinde bu dersleri herkesin öğrenmesi gerektiğini görmekten nefret ediyorum. Elektronik Tablo! = Veritabanı. Öğren, yaşa, sev.
Michael Kohne


2
Excel, metin dosyaları ve kumdaki satırlar, doğru kullanılırsa bir veritabanı olabilir. Bununla birlikte, Google Sheets’in devasa çok oyunculu özelliği, içine birkaç veritabanı özelliği eklemenin harika bir aday olacağı anlamına geliyor.
William Entriken

Yanıtlar:


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

Bunu, Sütun A için Veri Doğrulama kuralı için Özel Formül olarak koyarsanız, Sütun A tüm kopyaları reddeder.


Bu, herhangi bir komut dosyasına dahil olmadan çoğaltmaları vurgulamak için zekice basit bir yoldur. Sadece sabahımı kurtardın .. teşekkürler!
Matthew

3
Lütfen formülün ne anlama geldiğini açıklayabilir misiniz? Ne anlama geliyor A1? A2Verilerim ikinci satırdan başlarsa bunu değiştirmeli miyim ?
Tomáš Zato

6

Bir form kullanmakta ısrar ederseniz bir çözümüm yok, ama aksi halde çok basit bir çözüme sahibim: Diyelim ki benzersiz sütun A: diyelim. : =COUNTIF($A$1:$A$999,A2)<=1. Ardından, hücreyi kopyalayıp sütunun tamamını seçersiniz, sağ tıklayın, özel alt yapıştırmayı genişletin ve Yalnızca veri doğrulamasını yapıştır'a tıklayın . Bu kadar!


2

Bir listeden veri doğrulamanın tersini istiyorsunuz. Sonuçta, değer listede varsa, başarılı olmak yerine veri doğrulamanın başarısız olmasını istiyorsunuz. Veri doğrulama ile bu mümkün değildir, ancak bir komut dosyası bunu yapabilir.

Aşağıdaki betiği düşünün. Bu komut tüm düzenlemeleri izler ve bir hücre değeri aynı sütundaki başka bir hücre değerini çoğalttığında bir ileti kutusu açar.

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]
        + '"'
      ) ;
  }
}

Gerekli çeşitli pratik iyileştirmeler olacak. Örneğin, yalnızca belirli sütunları izlemeyi seçebilir ve hücre değerini boşaltmak gibi ek işlemler yapmayı seçebilirsiniz. Boş (eksik) değerler için özel işlem yapmanız gerekebilir. Ancak bu size doğrulamanızı sağlayacak temel tekniği verir.

Güncelleştirme:

Orijinal cevap üzerinde yoğunlaşmak için, şahsen cevapta belirtilen doğrulamaların birkaçını ekleyeceğimi düşündüm.

// İşte sadece bir hücrenin düzenlendiğinden emin olmak için kullandığım bir fonksiyon.

function isRangeSingleCell(range) {
  if(range.getRow() === range.getLastRow() && range.getColumn() === range.getLastColumn()) { return true; }
}

Birden fazla hücre düzenlenmişse, kullanmak için onaylamayı atlamanız yeterli

if(!isRangeSingleCell(range_active)) { return; }

Satır ilk satır değilse, doğrulamayı da atlayabilirsiniz:

if(range_active.getRowIndex() != 1) { return; }

Not: Satır sayma 0 veya 1 ile başlarsa başımın üstünden hatırlayamıyorum, bu yüzden bu kod bir hata olabilir

OnEdit onaylarının anahtarı, gereksiz hesaplamalardan tasarruf etmek için mümkün olduğunca erken çıkmanızdır. Bir fonksiyondan en hızlı çıkış boş bir return ifadesidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.