[英]Conditional Data Validation google sheets
我有3列,所有这些列都有下拉菜单(数据验证)。
第2列和第3列仅在第1列设置为“是”时显示
Col 1 | Col 2 | Col 3
Yes
No
有没有一种使用if语句加载下拉列表或Google脚本的方法
我已尝试使用此文章/视频
它仅在链接命名范围时才有效,否则,它不起作用。 在这种情况下,第2列和第3列是未连接的,唯一的共同点是第1列中的“是”。
从示例中,我可以看到它只是代码的复制粘贴。 它的设计方式专门用于这种方式,因此您需要针对自己的目的调整代码。
您可能需要重写代码,以便更准确地满足您的需求。
在示例中, onEdit()
获取您正在编辑的列。 只是附带说明,这也可以轻松完成。 代替
function onEdit (){
var aCell = SpreadsheetApp.getActiveSheet().getActiveCell();
可能只是(在这里阅读)
function onEdit (event){
var aCell = event.range;
然后,我们看下一条对两个选项都相同的重要行
var range = SpreadsheetApp.getActiveSheet().getRange(aCell.getRow(), aColumn + 1);
这只是获取下一个列范围,这就是将应用规则的位置。 现在,如果您希望将规则应用于B
C
和D
列,则只需调整getRange()
如下所示:
var range = SpreadsheetApp.getActiveSheet().getRange(aCell.getRow(), aColumn + 1, 1, 3);
这会将规则应用于所有3列。 在.getRange(aCell.getRow(), aColumn + 1);
aCell.getRow()
用于当前行, aColumn + 1
获取编辑后的下一列, 1
表示仅获取1行,接下来的3
表示获取3列。 但是,这只会将完全相同的规则应用于所有内容。 如果要为所有3列使用不同的数据集,则必须调整其他功能:
function depDrop_(range, sourceRange){
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(sourceRange, true).build();
range.setDataValidation(rule);
}
目前,它仅设置1条规则。 您将需要为每个范围创建一个规则。 您可以向其发送更多变量,也可以从该范围提取每一列,并为每个列设置不同的规则。
最后,这是我的操作方式示例(与示例基本相同,只是稍微复杂一点,因为它实际上是在生产中使用的)
function validateDynamic(event) {
var spSheet = SpreadsheetApp.getActiveSpreadsheet();
var shData = spSheet.getActiveSheet();
var colTYPE = 2; // column index for the Type entry
var colMANUF = 6; // column index for the Manufacturer entry
var colMODEL = 7; // column index for the Model entry
var range;
var newVal;
if (event) {
range = event.range;
newVal = event.value;
}
else {
range = SpreadsheetApp.getActiveRange();
newVal = range.getValue();
}
var row = range.getRow();
var col = range.getColumn();
var validRange;
var targetRange;
var ruleName;
switch(col) {
case colTYPE:
// shData.getRange(row, colMANUF, 1, 2).clearDataValidations().clearContent()
targetRange = shData.getRange(row, colMANUF);
ruleName = genRangeName('Type',newVal);
if (newVal === 'N/A') {
shData.getRange(row, colTYPE + 1, 1, shData.getMaxColumns() - 2).clearContent();
shData.getRange(row, colMANUF, 1, 2).setValues([['N/A','N/A']]);
setRule(genRangeName('Type',newVal),shData.getRange(row, colMODEL));
}
break;
case colMANUF:
var typeName = shData.getRange(row, colTYPE).getValue();
// shData.getRange(row, colMODEL, 1, 1).clearDataValidations().clearContent();
targetRange = shData.getRange(row, colMODEL);
ruleName = genRangeName(typeName,newVal);
break;
default:
throw('Dynamic Validation should not have run');
}
setRule(ruleName, targetRange);
return 0;
}
这是数据验证页面的屏幕截图(我在其中保留了下拉列表中的列表)。 这是比您需要的条件更多的条件,但这是不同的观点:)
我也使用函数构建命名范围:
function genRangeName(str1, str2) {
var name;
if (str1 == '' || str1 == null || str1 == undefined) {
name = str2;
}
else if (str2 == '' || str2 == null || str2 == undefined) {
name = str1;
}
else
name = str1 + '_' + str2;
name = name.replace(/ /g,'');
name = name.replace(/\//g,'');
return name.toLowerCase();
}
这是实际上设置规则的函数:
function setRule(ruleName, targetRange) {
var validRange = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(ruleName);
var rule = SpreadsheetApp.newDataValidation();
rule.setAllowInvalid(false);
rule.requireValueInRange(validRange);
rule.build();
targetRange.setDataValidation(rule);
return 0;
}
注意:
以上是一般说明。 我已经通过他的电子表格上的聊天功能向提问者介绍了这一过程。 这是完成任务的代码。 对于任何其他发现此问题的人,请记住这是非常静态的。 仅当您将数据验证应用于名称完全相同的B,C和D列时,此方法才有效。
function onEdit(event) {
var row = event.range.getRow(); //we get the current row of the range so we do not have to worry about it later
var col = event.range.getColumn(); //we get the current column of the range so we do not have to worry about it later
// In this section we simply check if the edited column was column A. If not we do not care for the rest of the code and stop the script with a return
if (col !== 1) {
return 1;
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
var rule
var targetRange
var sp = SpreadsheetApp.getActiveSheet()
if (sp.getIndex() !== 1) {
return 1
}
if (event.value == 'Bend') {
targetRange = sp.getRange(row, 2)
setRule(targetRange, 'bend_dyes')
targetRange = sp.getRange(row, 3)
setRule(targetRange, 'type_of_bend')
targetRange = sp.getRange(row, 4)
setRule(targetRange, 'bend_size')
}
else {
targetRange = sp.getRange(row, 2, 1, 3) //we want to clear all data validation if it was set to something else
targetRange.clearDataValidations()
}
}
function setRule(targetRange, ruleName){
var ruleRange = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(ruleName)
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(ruleRange, true)
targetRange.setDataValidation(rule)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.