我目前正在设置一个依赖项下拉列表,并且现在可以正常使用了。相关的下拉列表位于单元格L9:L65中,该下拉列表的数据通过以下公式在A68:Z68到A121:Z121中提供
=ARRAYFORMULA(IFERROR(IF('390'!J9:J65="Livery", TRANSPOSE(FILTER(Operators!$C$2:C, Operators!$C$2:C<>"")), IF('390'!J9:J65="Operator", TRANSPOSE(FILTER(Operators!$B$2:B, Operators!$B$2:B<>"")), ))))
在L9单元格中,我将以下数据验证设置为范围内的列表
A68:Z68
哪个效果很好。但是,当我将其他单元格复制并粘贴到L列中时,所有单元格都与A68:Z68相关,而不是按升序运行,这意味着我只需要手动修改L10:L65中的数据验证以确保其获取了正确的数据差点让我发疯。考虑到我的某些工作表将包含200行以上的数据,因此手动进行此操作非常繁琐且耗时,因此我希望有人可以向我展示一种无需手动干预即可快速获取与正确行相对应的每个单元格的方法吗?
答案 0 :(得分:0)
假设您有一个包含“规则”列(在我的情况下为B)和要对照(A)检查的列的工作表。
这是一个单独的工作表,其中包含“苹果”和“橙色”的下拉值。
然后您可以使用以下代码为B列中的每个单元动态构建验证规则:
function buildDataValidations(){
var ss = SpreadsheetApp.getActive();
var mainSheet = ss.getSheetByName("main_sheet");
//Range with values to check against
var rangeWithValues = mainSheet.getRange("A2:A");
//String array of values
var values = rangeWithValues.getValues();
var dropdownSheet = ss.getSheetByName("dropdown_data");
var rules = [];
var dropdownRange;
//Loop over values
for(var i=0; i < values.length; i++) {
var rule = SpreadsheetApp.newDataValidation();
//select proper values range for the dropdown
switch (values[i][0].trim().toLowerCase()) {
case "apple":
dropdownRange = dropdownSheet.getRange("A2:A");
break;
case "orange":
dropdownRange = dropdownSheet.getRange("B2:B");
break;
default:
break;
}
//Build validation rule, null if value cell is empty
rule = (values[i][0]) ? rule.requireValueInRange(dropdownRange).setAllowInvalid(false).build() : null;
//push the rule for the current row to the rules array
rules.push([rule]);
}
//offset the values range on column to the right to get the target range
var rangeWithRules = rangeWithValues.offset(0, 1);
//apply rules to the target range
rangeWithRules.setDataValidations(rules);
}
如果您打算更改值,则可以将其挂接到onEdit()触发器上,并修改新添加的单元格的规则
答案 1 :(得分:0)
通过标准方式(例如,无需使用脚本),就可以手动完成整个范围的逐行设置(逐单元)。