Erzwingen der Eindeutigkeit in einer Google Spreadsheets-Spalte


37

Ich habe eine Google-Tabelle (die als Datenbank fungiert) mit zahlreichen Spalten erstellt, von denen der Name eine ist. Ich wollte sicherstellen, dass das Namensfeld immer eindeutig ist und keine Zeile erstellt werden kann, wenn das Namensfeld mit einem anderen identisch ist Reihe.

Im Wesentlichen möchte ich einen Primärschlüssel für eine Datenbank erstellen. Weiß jemand, wie man das in Google Spreadsheets macht?

Wenn es hilft, habe ich ein Formular für die Google-Tabelle (Datenbank) erstellt, in das die Daten in die Tabelle eingegeben werden, und ich würde gerne sicherstellen, dass ein Benutzer nicht denselben Namen wie jemand in der Liste eingibt.


4
OK, das muss gesagt werden: Genau wie Excel sind auch Google Spreadsheets keine Datenbank-Engine. Möglicherweise möchten Sie eine Art echtes Datenbank-Backend in Betracht ziehen, das dies korrekt ausführen kann. Wir haben über 20 Jahre sehr schlechte Erfahrungen mit Leuten, die Excel als Datenbank verwenden, und ich würde es hassen zu sehen, dass alle diese Lektionen SCHON WIEDER lernen müssen. Tabellenkalkulation! = Datenbank. Lerne es, lebe es, liebe es.
Michael Kohne


2
Excel, Textdateien und Linien in Sand können bei richtiger Verwendung eine Datenbank sein. Angesichts der umfangreichen Multiplayer-Funktionen von Google Sheets wäre es ein großartiger Kandidat, ein paar weitere Datenbankfunktionen hinzuzufügen.
William Entriken

Antworten:


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

Wenn Sie dies als benutzerdefinierte Formel für die Datenüberprüfungsregel für Spalte A eingeben, weist Spalte A alle Duplikate zurück.


Dies ist eine genial einfache Methode, um Duplikate hervorzuheben, ohne in Skripte einzugreifen. Du hast gerade meinen Morgen gerettet .. danke!
Matthew

3
Könnten Sie bitte erklären, was die Formel bedeutet? Was bedeutet A1stehen? Sollte ich es ändern, A2wenn meine Daten in der zweiten Zeile beginnen?
Tomáš Zato

6

Ich habe keine Lösung, wenn Sie auf der Verwendung eines Formulars bestehen, aber ansonsten habe ich eine sehr einfache Lösung: Angenommen, die eindeutige Spalte ist A. Dann erstellen Sie die folgende Datenüberprüfungsregel für A2 (den ersten Datensatz nach der Überschrift). : =COUNTIF($A$1:$A$999,A2)<=1. Anschließend kopieren Sie die Zelle und wählen die gesamte Spalte aus. Klicken Sie mit der rechten Maustaste, erweitern Sie das Untermenü zum Einfügen spezieller Daten und klicken Sie auf Nur Datenüberprüfung einfügen . Das ist es!


2

Sie fordern das Gegenteil von Datenvalidierung aus einer Liste. Tatsächlich soll die Datenüberprüfung fehlschlagen, anstatt erfolgreich zu sein, wenn der Wert in der Liste enthalten ist. Dies ist bei der Datenvalidierung nicht möglich, aber ein Skript kann dies tun.

Betrachten Sie das folgende Skript. Dieses Skript überwacht alle Änderungen und zeigt ein Meldungsfeld an, wenn ein Zellenwert einen anderen Zellenwert in derselben Spalte dupliziert.

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

Es werden verschiedene praktische Verfeinerungen benötigt. Beispielsweise können Sie festlegen, dass nur bestimmte Spalten überwacht werden sollen, und Sie können festlegen, dass zusätzliche Aktionen ausgeführt werden sollen, z. B. das Ausblenden des Zellenwerts. Möglicherweise benötigen Sie eine spezielle Behandlung für leere (fehlende) Werte. Dies gibt Ihnen jedoch die grundlegende Technik, mit der Sie validieren können.

Aktualisieren:

Um die ursprüngliche Antwort zu erläutern, dachte ich, ich würde einige der von mir persönlich verwendeten Validierungen hinzufügen, die in der Antwort erwähnt wurden.

// Hier ist eine Funktion, mit der ich sicherstellen kann, dass nur eine Zelle bearbeitet wird.

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

Um es zu verwenden, überspringen Sie einfach die Validierung, wenn mehr als eine Zelle bearbeitet wird

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

Sie können die Validierung auch überspringen, wenn die Zeile nicht die erste Zeile ist:

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

Hinweis: Ich kann mich nicht genau erinnern, ob die Zeilenzählung bei 0 oder 1 beginnt, sodass dieser Code möglicherweise einen Fehler aufweist

Der Schlüssel zu onEdit-Überprüfungen besteht darin, so früh wie möglich zu beenden, um unnötige Berechnungen zu vermeiden. Der schnellste Abbruch einer Funktion ist eine leere return-Anweisung.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.