Forçando a exclusividade em uma coluna de planilhas do Google

37

Criei uma planilha do Google (agindo como um banco de dados) que possui várias colunas, sendo o nome uma delas e queria garantir que o campo de nome seja sempre único e que nenhuma linha possa ser criada se o campo de nome for igual a outro linha.

Essencialmente, quero criar uma chave primária para um banco de dados. Alguém sabe como fazer isso nas planilhas do Google?

Se ajudar, criei um formulário para usar a planilha do Google (banco de dados) que inserirá os dados na planilha e gostaria de garantir que um usuário não insira o mesmo nome que outra pessoa na lista.

Rubén
fonte
4
OK, isso precisa ser dito: assim como o Excel, as planilhas do Google não são um mecanismo de banco de dados. Você pode considerar algum tipo de back-end real do banco de dados que possa fazer isso corretamente. Temos mais de 20 anos de experiência muito ruim com pessoas que usam o Excel como banco de dados, e eu odiaria ver todos terem que aprender essas lições por todo o lado, AINDA MAIS. Planilha! = Banco de dados. Aprenda, viva, ame.
Michael Kohne
2
Excel, arquivos de texto e linhas na areia podem ser um banco de dados, se usado corretamente. Dito isto, o recurso multijogador em massa do Planilhas Google significa que seria um candidato incrível adicionar mais alguns recursos de banco de dados.
William Entriken

Respostas:

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

Se você inserir isso como uma fórmula personalizada para a regra de validação de dados da coluna A, a coluna A rejeitará todas as duplicatas.

Testare
fonte
Essa é uma maneira brilhantemente simples de destacar duplicatas sem entrar em nenhum script. Você acabou de salvar minha manhã .. obrigado!
Matthew
3
Você poderia, por favor, explicar o que a fórmula significa? O que A1significa? Devo alterá-lo para A2se meus dados começarem na segunda linha?
Tomáš Zato - Restabelecer Monica
6

Não tenho uma solução se você insistir em usar um formulário, mas caso contrário, tenho uma solução muito simples: Digamos que a coluna exclusiva seja A. Em seguida, você cria a seguinte regra de validação de dados em A2 (o 1º registro após o cabeçalho) : =COUNTIF($A$1:$A$999,A2)<=1. Em seguida, copie a célula e selecione a coluna inteira, clique com o botão direito do mouse, expanda o submenu colar especial e clique em Colar apenas validação de dados . É isso aí!

ShulemJ
fonte
2

Você está pedindo o oposto da validação de dados em uma lista. Na verdade, você deseja que a validação dos dados falhe, em vez de ter êxito, se o valor estiver na lista. Isso não é possível com a validação de dados, mas um script pode fazer isso.

Considere o seguinte script. Este script monitora todas as edições e exibe uma caixa de mensagem quando um valor de célula duplica qualquer outro valor de célula na mesma coluna.

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

Haverá vários refinamentos práticos necessários. Por exemplo, você pode optar por monitorar apenas determinadas colunas e pode executar ações adicionais, como apagar o valor da célula. Você pode precisar de tratamento especial para valores em branco (ausentes). Mas isso fornece a técnica básica que permitirá validar.

Atualizar:

Para elaborar a resposta original, pensei em adicionar algumas das validações que eu pessoalmente uso mencionadas na resposta.

// Aqui está uma função que eu uso para garantir que apenas uma célula esteja sendo editada.

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

Para usá-lo, pule a validação se mais de uma célula for editada

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

Você também pode pular a validação se a linha não for a primeira:

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

Nota: Não me lembro de nada se a contagem de linhas começar em 0 ou 1, portanto, este código pode ter um erro

A chave para as validações do onEdit é sair o mais cedo possível para economizar em cálculos desnecessários. A saída mais rápida de uma função é uma declaração de retorno vazia.

MetaEd
fonte