我有3列,所有列都有下拉列表(数据验证)。
第2栏和第3章仅在Col 1设置为"是"
时显示Col 1 | Col 2 | Col 3
Yes
No
有没有办法使用if语句加载下拉列表或谷歌脚本
我尝试过使用此article/video
仅当命名范围被链接时才有效,否则它不起作用。 在这种情况下,Col 2和Col 3是未连接的,只有常见的是"是"在Col 1。
答案 0 :(得分:2)
从样本中我可以看到它只是代码的复制粘贴。它的设计方式是专门以这种方式工作,所以你需要为你的目的调整代码。
您可能希望重写代码以更准确地满足您的需求。
在示例中,onEdit()
获取您正在编辑的列。就像旁注一样,这也可以更轻松地完成。而不是
function onEdit (){
var aCell = SpreadsheetApp.getActiveSheet().getActiveCell();
它可以简单地(阅读here)
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行而下一行{{1}得到3列。然而,这只会对所有内容应用完全相同的规则。如果要为所有3列提供不同的数据集,则必须调整其他功能:
3
目前它只设置了1条规则。您需要的是为每个范围创建规则。您可以向其发送更多变量,也可以从该范围中提取每个列,并为每个列设置不同的规则。
最后这里是我如何做的一个示例(基本上与示例相同,只是有点复杂,因为它实际上是在生产中使用的)
function depDrop_(range, sourceRange){
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(sourceRange, true).build();
range.setDataValidation(rule);
}
这是数据验证页面的屏幕截图(我在其中列出了下拉列表中的内容列表)。这比你需要的更有条件,但它是一个不同的观点:)
我也使用函数构建命名范围:
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();
}
注意:强>
以上是一般性解释。我通过他的电子表格聊天,通过这个问题走过了提问者。以下是如何完成任务的代码。对于其他发现此问题的人,请记住这是非常静态的。只有将数据验证应用于具有完全相同名称的B,C和D列时,它才有效。
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;
}