谷歌表动态下拉依赖列表

时间:2018-08-12 13:58:08

标签: google-sheets dropdown dynamic-list

我能够在Google表格中创建动态下拉列表,例如:如果用户在A列中选择了某项(汽车品牌:Toyota); B栏自动填充该品牌的模型(模型:Prius,Highlander等)。

我遇到了两个问题:

  1. 我需要这些下拉列表来处理连续的行。我已经复制并粘贴并调整了公式,但是当我将其粘贴到连续的行时,动态质量不再起作用。

  2. 如果列A中的值为Toyota,并且列B中填充了Prius。例如,当我将A列更改为Mercedes时,B列保留“ Prius”,并出现错误“无效输入-输入必须在指定范围内),但是,如果我单击B列,我会得到相应的下拉菜单我需要在单击A列时清除该字段,然后使用动态下拉列表重新填充。

这是我使用的公式: =TRANSPOSE(INDIRECT("D" & MATCH('Content Tracker - GENERAL RESOURCES'!D2, C1:C, 0) & ":K" & MATCH('Content Tracker - GENERAL RESOURCES'!D2, C1:C, 0)))

1 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法,可能是唯一的方法,需要在脚本编辑器中进行一些编码。

我进行了3级验证,解决了这个问题:

我在此代码之前定义了变量。

function onEdit(event) {
  var activeCell = event.range;
  var val = activeCell.getValue();
  var row = activeCell.getRow();
  var col = activeCell.getColumn();
  var wsName = activeCell.getSheet().getName()
  if (wsName === mainWsName && col === headerProv && row > 1) {
    validationProv(val, row);
  } else if(wsName === mainWsName && col === headerCanton && row > 1) {
    validationCanton(val, row);
  } 
} //end onEdit

function validationProv(val, row) {
  if(val === "") {
    ws.getRange(row, headerCanton).clearContent();
    ws.getRange(row, headerCanton).clearDataValidations();
    ws.getRange(row, headerDistrito).clearContent();
    ws.getRange(row, headerDistrito).clearDataValidations();
  } else {
    ws.getRange(row, headerCanton).clearContent();
     ws.getRange(row, headerCanton).clearDataValidations();
    ws.getRange(row, headerDistrito).clearContent();
    ws.getRange(row, headerDistrito).clearDataValidations();
    var filtroProv = options.filter(function(o){ return o[2] === val });
    var filtroCant = filtroProv.map(function(o){ return o[3] });
    var cell = ws.getRange(row, headerCanton);
    applyValidationToCell(filtroCant,cell);
  }
} //end validationProv

function validationCanton(val, row) {
  if(val === "") {
    ws.getRange(row, headerDistrito).clearContent();
    ws.getRange(row, headerDistrito).clearDataValidations();
  } else {
    ws.getRange(row, headerDistrito).clearContent();
    var headerProvVal = ws.getRange(row,headerProv).getValue();
    var filtroProv = options.filter(function(o){ return o[2] === headerProvVal && o[3] === val });
    var filtroCant = filtroProv.map(function(o){ return o[4] });
    var cell = ws.getRange(row, headerDistrito);
    applyValidationToCell(filtroCant,cell);
  }
} //end validationCanton


function applyValidationToCell(list,cell) {
  var rule = SpreadsheetApp.newDataValidation().requireValueInList(list).setAllowInvalid(false).build();
  cell.setDataValidation(rule);
}