Wymuszanie wyjątkowości w kolumnie Arkusze kalkulacyjne Google

37

Utworzyłem arkusz kalkulacyjny Google (działający jako baza danych), który ma wiele kolumn, z których nazwa jest jedną z nich, i chciałam się upewnić, że pole nazwy jest zawsze unikalne i nie można utworzyć wiersza, jeśli pole nazwy jest takie samo jak inne rząd.

Zasadniczo chcę utworzyć klucz podstawowy dla bazy danych. Czy ktoś wie, jak to zrobić w Arkuszach Google?

Jeśli to pomoże, utworzyłem formularz, który można użyć z Arkuszem kalkulacyjnym Google (bazą danych), który wprowadzi dane do arkusza i chciałbym upewnić się, że użytkownik nie wprowadzi już tej samej nazwy, co ktoś inny na liście.

Ruben
źródło
4
OK, należy to powiedzieć: Podobnie jak Excel, Arkusze kalkulacyjne Google nie są silnikiem bazy danych. Możesz rozważyć jakiś prawdziwy backend bazy danych, który mógłby to zrobić poprawnie. Mamy ponad 20 lat bardzo złego doświadczenia z ludźmi używającymi Excela jako bazy danych i nie chciałbym widzieć, że wszyscy muszą uczyć się tych lekcji jeszcze raz. Arkusz kalkulacyjny! = Baza danych. Naucz się, żyj, kochaj.
Michael Kohne,
2
Excel, pliki tekstowe i linie w piasku mogą być bazą danych, jeśli są właściwie używane. To powiedziawszy, ogromna funkcja wieloosobowa Arkuszy Google oznacza, że ​​byłoby świetnym kandydatem, aby dodać do niej kilka dodatkowych funkcji bazy danych.
William Entriken

Odpowiedzi:

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

Jeśli wstawisz to jako formułę niestandardową dla reguły sprawdzania poprawności danych dla kolumny A, kolumna A odrzuci wszystkie duplikaty.

Testare
źródło
Jest to genialnie prosty sposób na podkreślenie duplikatów bez wchodzenia w skrypty. Właśnie uratowałeś mój poranek .. dzięki!
Matthew
3
Czy możesz wyjaśnić, co oznacza ta formuła? Co oznacza A1skrót? Czy powinienem to zmienić, A2jeśli moje dane zaczynają się od drugiego rzędu?
Tomáš Zato - Przywróć Monikę
6

Nie mam rozwiązania, jeśli nalegasz na użycie formularza, ale poza tym mam bardzo proste rozwiązanie: powiedzmy, że unikalna kolumna to A. Następnie tworzysz następującą regułę sprawdzania poprawności danych na A2 (pierwszy rekord po nagłówku) : =COUNTIF($A$1:$A$999,A2)<=1. Następnie skopiuj komórkę i zaznacz całą kolumnę, kliknij prawym przyciskiem myszy, rozwiń podmenu wklej specjalne i kliknij Tylko wklej sprawdzanie poprawności danych . To jest to!

ShulemJ
źródło
2

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.

MetaEd
źródło