Forzar la unicidad en una columna de hojas de cálculo de Google

37

He creado una hoja de cálculo de Google (que actúa como una base de datos) que tiene numerosas columnas, siendo el nombre una de ellas, y quería asegurarme de que el campo de nombre sea siempre único y que no se pueda crear una fila si el campo de nombre es el mismo que otro fila.

Esencialmente quiero crear una clave primaria para una base de datos. ¿Alguien sabe cómo hacer esto en las hojas de cálculo de Google?

Si ayuda, creé un formulario para ir con la hoja de cálculo de Google (base de datos) que ingresará los datos en la hoja y me encantaría asegurarme de que un usuario no ingrese el mismo nombre que otra persona en la lista.

Rubén
fuente
44
Bien, esto debe decirse: al igual que Excel, las hojas de cálculo de Google no son un motor de base de datos. Es posible que desee considerar algún tipo de backend de base de datos real que pueda hacer esto correctamente. Tenemos más de 20 años de muy mala experiencia con personas que usan Excel como base de datos, y odiaría ver que todos tengan que aprender esas lecciones por TODAVÍA. Hoja de cálculo! = Base de datos. Aprendelo, vivelo, amalo.
Michael Kohne
2
Excel, archivos de texto y líneas en arena pueden ser una base de datos, si se usan correctamente. Dicho esto, la función multijugador masivo de Hojas de cálculo de Google significa que sería un excelente candidato para agregar algunas características más de la base de datos.
William Entriken

Respuestas:

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

Si coloca esto como una fórmula personalizada para la regla de validación de datos para la columna A, la columna A rechazará todos los duplicados.

Testare
fuente
Esta es una manera increíblemente simple de resaltar duplicados sin entrar en ningún script. Acabas de salvar mi mañana ... gracias!
Matthew
3
¿Podría explicar qué significa la fórmula? ¿Qué significa A1? ¿Debo cambiarlo A2si mis datos comienzan en la segunda fila?
Tomáš Zato - Restablece a Monica
6

No tengo una solución si insiste en usar un formulario, pero de lo contrario tengo una solución muy simple: Digamos que la columna única es A. Luego crea la siguiente regla de validación de datos en A2 (el primer registro después del encabezado) : =COUNTIF($A$1:$A$999,A2)<=1. Luego, copie la celda y seleccione la columna completa, haga clic con el botón derecho, expanda el submenú especial Pegar y haga clic en Pegar validación de datos solamente . ¡Eso es!

ShulemJ
fuente
2

Está solicitando lo contrario de la validación de datos de una lista. En efecto, desea que la validación de datos falle, en lugar de tener éxito, si el valor está en la lista. Esto no es posible con la validación de datos, pero un script puede hacerlo.

Considere la siguiente secuencia de comandos. Este script monitorea todas las ediciones y muestra un cuadro de mensaje cuando un valor de celda duplica cualquier otro valor de celda en la misma columna.

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

Habrá varios refinamientos prácticos necesarios. Por ejemplo, puede optar por monitorear solo ciertas columnas, y puede optar por tomar medidas adicionales, como eliminar el valor de la celda. Es posible que necesite un manejo especial para los valores en blanco (faltantes). Pero esto le brinda la técnica básica que le permitirá validar.

Actualizar:

Para elaborar la respuesta original, pensé que agregaría algunas de las validaciones que uso personalmente que se mencionaron en la respuesta.

// Aquí hay una función que uso para asegurar que solo se edite una celda.

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

Para usarlo, simplemente omita la validación si se edita más de una celda

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

También puede omitir la validación si la fila no es la primera fila:

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

Nota: No puedo recordar la parte superior de mi cabeza si el conteo de filas comienza en 0 o 1, por lo que este código puede tener un error

La clave para las validaciones de onEdit es salir lo antes posible para ahorrar de cómputos innecesarios. La salida más rápida de una función es una declaración de devolución vacía.

MetaEd
fuente