我创建了一个Google电子表格(用作数据库),其中包含许多列,名称是其中之一,并且我想确保名称字段始终是唯一的,并且如果名称字段与另一字段相同,则不能创建任何行行。
本质上,我想为数据库创建一个主键。有人知道如何在Google Spreadsheets中执行此操作吗?
如果有帮助,我创建了一个与Google Spreadsheet(数据库)一起使用的表单,该表单会将数据输入到表单中,并且希望确保用户输入的名称与列表中其他人的名称不同。
我创建了一个Google电子表格(用作数据库),其中包含许多列,名称是其中之一,并且我想确保名称字段始终是唯一的,并且如果名称字段与另一字段相同,则不能创建任何行行。
本质上,我想为数据库创建一个主键。有人知道如何在Google Spreadsheets中执行此操作吗?
如果有帮助,我创建了一个与Google Spreadsheet(数据库)一起使用的表单,该表单会将数据输入到表单中,并且希望确保用户输入的名称与列表中其他人的名称不同。
Answers:
您在从列表中询问与数据验证相反的问题。实际上,如果值在列表中,则您希望数据验证失败而不是成功。使用数据验证是不可能的,但是脚本可以做到。
考虑以下脚本。此脚本监视所有编辑,并在单元格值重复同一列中的任何其他单元格值时弹出一个消息框。
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语句。