在Google Spreadsheets列中强制唯一性


37

我创建了一个Google电子表格(用作数据库),其中包含许多列,名称是其中之一,并且我想确保名称字段始终是唯一的,并且如果名称字段与另一字段相同,则不能创建任何行行。

本质上,我想为数据库创建一个主键。有人知道如何在Google Spreadsheets中执行此操作吗?

如果有帮助,我创建了一个与Google Spreadsheet(数据库)一起使用的表单,该表单会将数据输入到表单中,并且希望确保用户输入的名称与列表中其他人的名称不同。


4
好的,这需要说:与Excel一样,Google Spreadsheets也不是数据库引擎。您可能需要考虑某种可以正确执行此操作的实际数据库后端。我们在使用Excel作为数据库的人方面有20多年的非常糟糕的经验,我很讨厌看到每个人都必须再次学习这些课程。电子表格!=数据库。学习,生活,热爱它。
迈克尔·科恩


2
如果使用得当,Excel,文本文件和沙子中的线可以是数据库。也就是说,Google表格的大规模多人游戏功能意味着在其中添加更多数据库功能将是一个不错的选择。
William Entriken

Answers:


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

如果将其作为“自定义公式”输入到“ A列”的“数据验证”规则,则“ A列”将拒绝所有重复项。


这是一种精妙的简单方法,无需任何脚本即可突出显示重复项。您刚刚保存了我的早晨..谢谢!
马修

3
您能否解释一下该公式的含义?代表什么A1A2如果我的数据从第二行开始,我应该将其更改为吗?
托马什Zato

6

如果您坚持使用表单,那么我没有解决方案,但是否则,我有一个非常简单的解决方案:假设唯一列为A。然后在A2(标头后的第一条记录)上创建以下数据验证规则:=COUNTIF($A$1:$A$999,A2)<=1。然后,您复制该单元格并选择整个列,右键单击,展开“ 粘贴特殊”子菜单,然后单击“ 仅粘贴数据验证”。而已!


2

您在从列表中询问与数据验证相反的问题。实际上,如果值在列表中,则您希望数据验证失败而不是成功。使用数据验证是不可能的,但是脚本可以做到。

考虑以下脚本。此脚本监视所有编辑,并在单元格值重复同一列中的任何其他单元格值时弹出一个消息框。

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

将需要进行各种实际的改进。例如,您可以选择仅监视某些列,并且可以选择采取其他操作,例如清空单元格值。您可能需要对空白(缺失)值进行特殊处理。但这为您提供了使您可以验证的基本技术。

更新:

为了详细说明原始答案,我想我会添加一些我个人使用的,答案中提到的验证。

//这是我用来确保仅一个单元格被编辑的函数。

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

要使用它,只要编辑了多个单元格,就跳过验证

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

如果该行不是第一行,也可以跳过验证:

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

注意:如果行计数从0或1开始,我就不记得了,所以此代码可能存在错误

onEdit验证的关键是尽早退出以免不必要的计算。从函数最快退出是一个空的return语句。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.