Forcer l'unicité dans une colonne Google Spreadsheets

37

J'ai créé une feuille de calcul Google (jouant le rôle de base de données) comportant de nombreuses colonnes, dont le nom, et je voulais m'assurer que le champ du nom est toujours unique et qu'aucune ligne ne peut être créée si le champ du nom est identique à un autre. rangée.

Je souhaite essentiellement créer une clé primaire pour une base de données. Est-ce que quelqu'un sait comment faire cela dans Google Spreadsheets?

Si cela peut vous aider, j'ai créé un formulaire destiné à la feuille de calcul Google (base de données). Celui-ci introduira les données dans la feuille et aimerait éviter qu'un utilisateur ne saisisse déjà le même nom qu'un autre utilisateur de la liste.

Rubén
la source
4
OK, il faut le dire: tout comme Excel, Google Spreadsheets n'est pas un moteur de base de données. Vous voudrez peut-être envisager une sorte de véritable backend de base de données qui pourrait le faire correctement. Nous avons plus de 20 ans de très mauvaises expériences avec des personnes utilisant Excel comme base de données, et je détesterais voir tout le monde apprendre ces leçons un peu partout, ENCORE ENCORE. Tableur! = Base de données. Apprenez-le, vivez-le, aimez-le.
Michael Kohne
2
Excel, les fichiers texte et les lignes en sable peuvent constituer une base de données, s’ils sont utilisés correctement. Cela dit, la fonctionnalité multijoueur massive de Google Sheets signifie que ce serait un candidat génial pour ajouter quelques fonctionnalités de base de données supplémentaires.
William Entriken

Réponses:

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

Si vous définissez cette option en tant que formule personnalisée pour la règle de validation des données de la colonne A, celle-ci rejettera tous les doublons.

Testare
la source
C'est un moyen extrêmement simple de mettre en évidence les doublons sans entrer dans un script. Tu viens de sauver ma matinée .. merci!
Matthew
3
Pourriez-vous s'il vous plaît expliquer ce que signifie la formule? Que signifie A1? Devrais-je le changer A2si mes données commencent à la deuxième ligne?
Tomáš Zato - Réintégrer Monica
6

Je n'ai pas de solution si vous insistez pour utiliser un formulaire, mais sinon, j'ai une solution très simple: disons que la colonne unique est A. Ensuite, vous créez la règle de validation de données suivante sur A2 (le premier enregistrement après l'en-tête) : =COUNTIF($A$1:$A$999,A2)<=1. Ensuite, vous copiez la cellule et sélectionnez la colonne entière, cliquez avec le bouton droit de la souris, développez le sous-menu spécial de collage et cliquez sur Valider les données du collage uniquement . C'est ça!

ShulemJ
la source
2

Vous demandez le contraire de la validation des données dans une liste. En réalité, vous voulez que la validation des données échoue au lieu d’être réussie si la valeur est dans la liste. Ce n'est pas possible avec la validation des données, mais un script peut le faire.

Considérez le script suivant. Ce script surveille toutes les modifications et ouvre une boîte de message lorsqu'une valeur de cellule duplique une autre valeur de cellule dans la même colonne.

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

Divers perfectionnements pratiques seront nécessaires. Par exemple, vous pouvez choisir de surveiller uniquement certaines colonnes et de prendre des mesures supplémentaires, telles que la suppression de la valeur de la cellule. Vous aurez peut-être besoin d'un traitement spécial pour les valeurs vides (manquantes). Mais cela vous donne la technique de base qui vous permettra de valider.

Mise à jour:

Pour élaborer sur la réponse initiale, j'ai pensé ajouter quelques-unes des validations que j'utilise personnellement et qui ont été mentionnées dans la réponse.

// Voici une fonction que j'utilise pour m'assurer qu'une seule cellule est en cours d'édition.

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

Pour l'utiliser, ignorez simplement la validation si plusieurs cellules sont modifiées.

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

Vous pouvez également ignorer la validation si la ligne n'est pas la première ligne:

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

Remarque: je ne me souviens pas spontanément si le comptage des lignes commence à 0 ou 1, ce code peut donc avoir un bogue.

La clé des validations onEdit est de quitter le plus tôt possible pour éviter les calculs inutiles. La sortie la plus rapide d'une fonction est une instruction return vide.

MetaEd
la source