別のセルのドロップダウンリストの選択に基づいてドロップダウンリストを作成します。
たとえば、ユーザーが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つのオプションもすべて使用できることです-警告コメントは存在しますが。
これらの問題は、式またはスクリプトで解決できますか?
複数のセルに複数の検証ルールが必要な場合は、それらに複数の範囲を設定して、ルールが互いに独立して追跡されるようにする必要があります。
しかし、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);
}
}
}