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

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

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

评论

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

我回答了一个类似的问题:Google Spreadsheets:多个具有相同下拉列表的单元格,但没有重复的选择

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

#1 楼

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


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

评论


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

–马修
16年8月10日在10:20

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

–TomášZato-恢复莫妮卡
18年5月17日在18:53

@TomášZato-ReinstateMonica:数据验证公式中的引用以与填充操作相同的方式应用。示例:将此验证应用于列A时,A1得到= COUNTIF(A:A,“ =”&A1)<2,A2得到= COUNTIF(A:A,“ =”&A2)<2,依此类推。 `。如果列为E,则应写= COUNTIF(E:E,“ =”&E1)<2。如果数据从第二行开始,则应= COUNTIF(E $ 2:E,“ =”&E1)< 2。

–托克兰
20年1月7日在21:01



#2 楼

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

#3 楼

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

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

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语句。

#4 楼

我设法通过使用以下验证公式来完成此操作(对于B列给出的示例,其中第一行为标题):

选择该列的第一个单元格以外的所有内容(单击B,然后按Ctrl +单击B2
启用数据验证(在右键单击菜单的末尾)
输入YourTab!B2:B作为单元格范围
使用“自定义公式为”,然后使用=COUNTUNIQUE(B2:B)=COUNT(B2:B)

这样,每个重复的条目都会立即在错误的条目之前标记所有条目。