Forzare l'unicità in una colonna Fogli di lavoro Google


37

Ho creato un foglio di calcolo di Google (che funge da database) con numerose colonne, il nome è uno di questi e volevo assicurarmi che il campo del nome fosse sempre univoco e che nessuna riga potesse essere creata se il campo del nome è uguale a un altro riga.

In sostanza, voglio creare una chiave primaria per un database. Qualcuno sa come farlo in Fogli di lavoro Google?

Se aiuta, ho creato un modulo per andare con il foglio di calcolo di Google (database) che inserirà i dati nel foglio e mi piacerebbe assicurarsi che un utente non inserisca già lo stesso nome di qualcun altro nell'elenco.


4
Va bene, bisogna dirlo: proprio come Excel, i fogli di calcolo di Google non sono un motore di database. È possibile prendere in considerazione una sorta di back-end del database reale in grado di farlo correttamente. Abbiamo oltre 20 anni di pessima esperienza con persone che usano Excel come database e non sopporterei che tutti debbano imparare quelle lezioni ANCORA. Foglio di calcolo! = Database. Imparalo, vivi, amalo.
Michael Kohne,


2
Excel, file di testo e righe nella sabbia possono essere un database, se utilizzati correttamente. Detto questo, la massiccia funzionalità multiplayer di Fogli Google significa che sarebbe un ottimo candidato aggiungere alcune funzionalità di database in più.
William Entriken,

Risposte:


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

Se lo inserisci come una formula personalizzata per la regola di convalida dei dati per la colonna A, la colonna A rifiuterà tutti i duplicati.


Questo è un modo brillantemente semplice per evidenziare i duplicati senza entrare negli script. Mi hai appena salvato la mattina .. grazie!
Matteo,

3
Potresti spiegare cosa significa la formula? Cosa significa A1? Devo cambiarlo in A2se i miei dati iniziano dalla seconda riga?
Tomáš Zato - Ripristina Monica

6

Non ho una soluzione se insisti nell'usare un modulo, ma per il resto ho una soluzione molto semplice: supponiamo che la colonna univoca sia A. Quindi crei la seguente regola di convalida dei dati su A2 (il primo record dopo l'intestazione) : =COUNTIF($A$1:$A$999,A2)<=1. Quindi, copi la cella e selezioni l'intera colonna, fai clic con il pulsante destro del mouse, espandi il sottomenu Incolla speciale e fai clic su Incolla solo convalida dati . Questo è tutto!


2

Stai chiedendo il contrario della convalida dei dati da un elenco. In effetti, si desidera che la convalida dei dati abbia esito negativo, anziché riuscita, se il valore è nell'elenco. Questo non è possibile con la convalida dei dati, ma uno script può farlo.

Considera il seguente script. Questo script monitora tutte le modifiche e apre una finestra di messaggio quando un valore di cella duplica qualsiasi altro valore di cella nella stessa colonna.

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

Ci saranno vari perfezionamenti pratici necessari. Ad esempio, è possibile scegliere di monitorare solo determinate colonne e scegliere di intraprendere ulteriori azioni, ad esempio sopprimendo il valore della cella. Potrebbe essere necessario un trattamento speciale per i valori vuoti (mancanti). Ma questo ti dà la tecnica di base che ti permetterà di convalidare.

Aggiornare:

Per elaborare la risposta originale, ho pensato di aggiungere alcune delle convalide che uso personalmente che sono state menzionate nella risposta.

// Ecco una funzione che utilizzo per assicurare che venga modificata solo una cella.

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

Per usarlo basta saltare la convalida se viene modificata più di una cella

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

Puoi anche saltare la convalida se la riga non è la prima riga:

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

Nota: non riesco a ricordare la parte superiore della mia testa se il conteggio delle righe inizia da 0 o 1, quindi questo codice potrebbe avere un bug

La chiave per le convalide onEdit è uscire il prima possibile per salvare da calcoli non necessari. L'uscita più rapida da una funzione è un'istruzione return vuota.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.