Googleスプレッドシートの列で一意性を強制する


37

多数の列があり、名前がそれらの1つであるGoogleスプレッドシート(​​データベースとして機能)を作成しました。行。

基本的に、データベースの主キーを作成します。誰もがGoogleスプレッドシートでこれを行う方法を知っていますか?

役立つ場合は、Googleスプレッドシート(​​データベース)に対応するフォームを作成します。このフォームは、シートにデータを入力し、ユーザーがリスト内の他のユーザーと同じ名前を入力しないようにします。


4
OK、これは言う必要があります。Excelと同様に、Googleスプレッドシートはデータベースエンジンではありません。これを正しく行うことができる何らかの実データベースバックエンドを検討することをお勧めします。Excelをデータベースとして使用している人との20年以上の非常に悪い経験がありますが、まだすべての人がこれらのレッスンを学ばなければならないのは嫌です。スプレッドシート!=データベース。それを学び、生き、愛しなさい。
マイケルコーネ


2
適切に使用すれば、Excel、テキストファイル、砂の中の線をデータベースにすることができます。そうは言っても、Googleスプレッドシートの大規模なマルチプレイヤー機能は、さらにいくつかのデータベース機能を追加する素晴らしい候補になることを意味します。
ウィリアムエントライケン

回答:


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

これを列Aのデータ検証ルールのカスタム式として入力すると、列Aはすべての重複を拒否します。


これは、スクリプトを作成することなく重複を強調表示する非常に簡単な方法です。あなたはちょうど私の朝を救った..ありがとう!
マシュー

3
数式の意味を説明してください。何のA1略ですか?A2データが2行目から始まる場合に変更する必要がありますか?
トマーシュザト-復帰

6

フォームの使用を主張している場合は解決策がありませんが、そうでない場合は非常に簡単な解決策があります:一意の列がAであるとしましょう:=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]
        + '"'
      ) ;
  }
}

さまざまな実用的な改良が必要になります。たとえば、特定の列のみを監視することを選択したり、セル値を空白にするなどの追加アクションを実行することを選択したりできます。空白(欠損)値の特別な処理が必要になる場合があります。ただし、これにより、検証できる基本的な手法が得られます。

更新:

元の回答を詳しく説明するには、回答で言及された個人的に使用する検証のいくつかを追加すると思いました。

//これは、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ステートメントです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.