下拉列表以及其他下拉列表中的条件

时间:2018-10-05 19:55:13

标签: validation google-apps-script google-sheets

如何从多个列表中创建一个下拉列表,并从另一个下拉列表中创建条件?

使用上面的图像,假设我在第一个下拉列表中(这是一个简单的示例),选择“家具” ...我希望第二个下拉列表仅显示家具。与第三个下拉列表相同,只希望在此处显示第二个选择的颜色。

尝试在这两个公式之一的“数据验证”中放置“自定义公式”条件,但是不起作用...

=FILTER(Object,Type = E2) 

=QUERY(A:C,"SELECT B WHERE A='"&E2&"' ", 0)

在这里还读过其他一些话题,说公式是不可能的,我也找不到适合它的应用脚本。如何放置条件规则,并仅使我想要的值出现在下拉菜单中,而不是全部显示?我认为这与“ withCriteria(criteria,args)”有关,但是我不知道如何应用它。

关于列表...它可能由2k行组成(每行3列)。第一列将仅具有(也许)6或7个不同的值。第二个大约70或80,第三个完全不同。该顺序将是随机的,因为可以添加新值,并且我可以添加新的Furniture或Animal ...

这是我现在拥有的代码

function onEdit(e) {
  var range = e.range;
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  if ( range.getRow() > 1) {
    if ( range.getColumn() == 5) {
      var cell_Range = ss.getRange( range.getRow(), range.getColumn() + 1);
      var cell = cell_Range.getCell( 1, 1);
      var rangeV = SpreadsheetApp.getActive().getRange('B2:B13');
      var rule = SpreadsheetApp.newDataValidation().requireValueInRange(rangeV).build();
      cell.setDataValidation(rule);
    }
    else if ( range.getColumn() == 6 ) { 
      var cell_Range = ss.getRange( range.getRow(), range.getColumn() + 1);
      var cell = cell_Range.getCell( 1, 1);
      var rangeV = SpreadsheetApp.getActive().getRange('C2:C13');
      var rule = SpreadsheetApp.newDataValidation().requireValueInRange(rangeV).build();
      cell.setDataValidation(rule);

    }
  }
}

示例表https://docs.google.com/spreadsheets/d/1aLpYd8fC0jpwvQOPVTj_yvY7DVKeFFnPvpJSF27if6w/edit?usp=sharing

预先感谢

1 个答案:

答案 0 :(得分:1)

解决方案:

  • 使用Datavalidation requireValueInList

流量:

  • 以数组的形式获取所有选项A1:C
  • 如果其中存在E(Col5)中的编辑值,则过滤A(Col1)
  • 检索相应的Col2(B)作为选项,并基于它进行数据验证
  • 将已编辑的范围偏移1列并设置DataValidation

示例脚本:

function onEdit(e) {
  const SETTINGS = {
    //Edited Column : Column to Check(First col in optionsDataRange is considered 1)
    5: 1,
    6: 2,
  };
  var editedRange = e.range,
    editedSheet = editedRange.getSheet(),
    val = e.value,
    col = editedRange.columnStart,
    row = editedRange.rowStart;

  /*Exit clause(s)*/
  if (
    Object.keys(SETTINGS).indexOf(col.toString()) === -1 || //If edited col is not in settings
    editedSheet.getName() !== 'Sheet1' ||
    row > 5
  )
    return;

  var optionsDataRange = editedSheet
    .getRange(1, 1, editedSheet.getLastRow(), 3)
    .getValues();

  /*Only get options where val is present in optionsDataRange*/
  var options = optionsDataRange
    .map(function(e) {
      return e[SETTINGS[col] - 1] == val ? e[SETTINGS[col]] : null;
    })
    .filter(function(e, i, a) {
      return e !== null && a.indexOf(e) === i;
    });

  var dv = SpreadsheetApp.newDataValidation()
    .requireValueInList(options)
    .build();
  editedRange.offset(0, 1).setDataValidation(dv);
}

参考文献: