web-dev-qa-db-ja.com

別のセルのドロップダウンの結果に基づくドロップダウンリスト

別のセルのドロップダウンリストの選択に基づいてドロップダウンリストを作成します。

これが私のスプレッドシートです

たとえば、ユーザーがD20ドロップダウンメニューから選択しない場合、F20ドロップダウンは空白になりますが、ドロップダウンメニューにはChoiceAのみのオプションがあります。

ユーザーがD20ドロップメニューから選択した場合、F20は空白ですが、ドロップダウンメニューにChoiceA、ChoiceB、ChoiceCのオプションがあります。

私は下で遊んでみましたが、それはまったく正しくありません...

この式はセルSheet2!B:14にあります

=ARRAYFORMULA(IF(ISBLANK(Sheet1!D20),(Sheet2!A14),(Sheet2!A14:A16)))

そして私のSheet1!F20セルはSheet2!B14:B16の範囲のデータ検証リストを使用します

1行で必要に応じて機能しますが、行が追加されると、列Dの任意の場所で選択が行われ、F列のドロップメニューで3つすべての選択ができるようになると、3つすべての選択が永続的に使用可能になります同じ行の列Dの選択に関係なく、F列のセルを追加しました。

修正が必要なもう1つの問題は、列Dのオプションが削除された場合、3つのオプションもすべて使用できることです-警告コメントは存在しますが。

これらの問題は、式またはスクリプトで解決できますか?

4
MJM

複数のセルに複数の検証ルールが必要な場合は、それらに複数の範囲を設定して、ルールが互いに独立して追跡されるようにする必要があります。

しかし、2番目の問題は、Dの編集後にFに不法な選択肢が残っているため、数式だけでは解決できません。そこで、列Fで検証をよりよく追跡するスクリプトを作成しました。最初の検証ルール(最初の使用前)を設定しないことに注意してください。手動でできること。また、静的なD列のルールも設定しません。

それは次のことです:列Dのセルが編集されると(ヘッダー行は除外されます)、それに応じてセルの検証ルールを2ステップ右に調整します。また、そのセルにOptionBなどの値が含まれていて、Dが空白の場合に許可されなくなった場合、Fの値は削除されます。

スクリプトでは、e.rangeは編集されたセル、e.valueは新しい値です。

function onEdit(e) {
  if (e.range.getColumn() === 4 && e.range.getRow() > 1 ) {  // only Column D, not header 
    var optionA = SpreadsheetApp.newDataValidation()
      .requireValueInList(['OptionA'], true).build();
    var optionsABC = SpreadsheetApp.newDataValidation()
      .requireValueInList(['OptionA', 'OptionB', 'OptionC'], true).build();

    var affectedCell = e.range.offset(0,2,1,1);  // two steps to the right
    if (e.value === '') {
      if (affectedCell.getValue() !== 'OptionA') {
        affectedCell.setValue('');    // reset if current choice is no longer legal
      }
      affectedCell.setDataValidation(optionA); 
    }
    else {
      affectedCell.setDataValidation(optionsABC);      
    }
  }
}
1
user79865

ここに簡単な式の解決策があります:

シート1:

D20:データ検証>アイテムのリスト:I made a choice,I didn't make a choice

F20:データ検証>範囲からのリスト:Sheet2!D8:D11

Sheet2:

D8:=IF(Sheet1!D20 = B6; QUERY(B8:B11;;-1);IF(Sheet1!D20 = C6; QUERY(C8:C11;;-1);))

1
user0