多数の列があり、名前がそれらの1つであるGoogleスプレッドシート(データベースとして機能)を作成しました。行。
基本的に、データベースの主キーを作成します。誰もがGoogleスプレッドシートでこれを行う方法を知っていますか?
役立つ場合は、Googleスプレッドシート(データベース)に対応するフォームを作成します。このフォームは、シートにデータを入力し、ユーザーがリスト内の他のユーザーと同じ名前を入力しないようにします。
多数の列があり、名前がそれらの1つであるGoogleスプレッドシート(データベースとして機能)を作成しました。行。
基本的に、データベースの主キーを作成します。誰もがGoogleスプレッドシートでこれを行う方法を知っていますか?
役立つ場合は、Googleスプレッドシート(データベース)に対応するフォームを作成します。このフォームは、シートにデータを入力し、ユーザーがリスト内の他のユーザーと同じ名前を入力しないようにします。
回答:
=COUNTIF($A:$A,"="&A1) < 2
これを列Aのデータ検証ルールのカスタム式として入力すると、列Aはすべての重複を拒否します。
A1
略ですか?A2
データが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]
+ '"'
) ;
}
}
さまざまな実用的な改良が必要になります。たとえば、特定の列のみを監視することを選択したり、セル値を空白にするなどの追加アクションを実行することを選択したりできます。空白(欠損)値の特別な処理が必要になる場合があります。ただし、これにより、検証できる基本的な手法が得られます。
更新:
元の回答を詳しく説明するには、回答で言及された個人的に使用する検証のいくつかを追加すると思いました。
//これは、1つのセルのみが編集されるようにするために使用する関数です。
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ステートメントです。