条件数据验证google sheet

时间:2017-04-19 21:39:38

标签: google-apps-script google-sheets

我有3列,所有列都有下拉列表(数据验证)。

第2栏和第3章仅在Col 1设置为"是"

时显示
Col 1 | Col 2 | Col 3

Yes
No

有没有办法使用if语句加载下拉列表或谷歌脚本

我尝试过使用此article/video

仅当命名范围被链接时才有效,否则它不起作用。 在这种情况下,Col 2和Col 3是未连接的,只有常见的是"是"在Col 1。

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 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行而下一行{{1}得到3列。然而,这只会对所有内容应用完全相同的规则。如果要为所有3列提供不同的数据集,则必须调整其他功能:

3

目前它只设置了1条规则。您需要的是为每个范围创建规则。您可以向其发送更多变量,也可以从该范围中提取每个列,并为每个列设置不同的规则。

最后这里是我如何做的一个示例(基本上与示例相同,只是有点复杂,因为它实际上是在生产中使用的)

function depDrop_(range, sourceRange){
  var rule = SpreadsheetApp.newDataValidation().requireValueInRange(sourceRange, true).build();
  range.setDataValidation(rule);
}

这是数据验证页面的屏幕截图(我在其中列出了下拉列表中的内容列表)。这比你需要的更有条件,但它是一个不同的观点:)

enter image description here

我也使用函数构建命名范围:

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;
}