繁体   English   中英

条件数据验证Google表格

[英]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 CD列,则只需调整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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM