三个下拉列表,彼此依赖

问题描述 投票:1回答:1

我需要获得三个相互依赖的下拉列表。这是带有示例的可编辑sheet。黄色列中的单元格包含一个基于常规数据验证(选项表)的下拉列表。绿色列中的单元格会提供一个基于脚本的相应下拉列表。在蓝色列中,我需要从“选项”工作表中获取一个对应的列表,其名称与中间绿色列中的数据相对应。

我将不胜感激。

var mainWsName = "master";
var optionsWsName = "options";
var firstLevelColumn = 12;
var secondLevelColumn = 13;
var thirdLevelColumn = 14;

var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainWsName);
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionsWsName);


function onEdit(e){
  var activeCell = e.range;
  var val = activeCell.getValue();
  var r = activeCell.getRow();
  var c = activeCell.getColumn();
  var wsName = activeCell.getSheet().getName();
  if(wsName === mainWsName && c === firstLevelColumn && r > 4){
    applyFirstLevelValidation(val,r);
  } else if(wsName === mainWsName && c === secondLevelColumn && r > 4){
    applySecondLevelValidation(val,r);
  } 


} //end onEdit

function applyFirstLevelValidation(val,r){

  if(val === ""){
    ws.getRange(r, secondLevelColumn).clearContent();
    ws.getRange(r, secondLevelColumn).clearDataValidations();
    ws.getRange(r, thirdLevelColumn).clearContent();
    ws.getRange(r, thirdLevelColumn).clearDataValidations();
  } else {
    ws.getRange(r, secondLevelColumn).clearContent();
    ws.getRange(r, secondLevelColumn).clearDataValidations();
    ws.getRange(r, thirdLevelColumn).clearContent();
    ws.getRange(r, thirdLevelColumn).clearDataValidations();
    var filteredOptions = options.filter(function(o){ return o[0] === val });
    var listToApply = filteredOptions.map(function(o){ return o[1] });
    var cell = ws.getRange(r, secondLevelColumn);
    applyValidationToCell(listToApply,cell);
   }

}  



function applySecondLevelValidation(val,r){

  if(val === ""){
    ws.getRange(r, thirdLevelColumn).clearContent();
    ws.getRange(r, thirdLevelColumn).clearDataValidations();
  } else {
    ws.getRange(r, thirdLevelColumn).clearContent();
    var firstLevelColValue = ws.getRange(r, firstLevelColumn).getValue();
    var filteredOptions =options.filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });
    var listToApply = filteredOptions.map(function(o){ return o[2] });
    var cell = ws.getRange(r.thirdLevelColumn);
    applyValidationToCell(listToApply,cell);
   }

}  

function applyValidationToCell(list,cell){

  var rule = SpreadsheetApp
  .newDataValidation()
  .requireValueInlist(list)
  .setAllowInvalid(false)
  .build();

  cell.setDataValidation(rule)
}

0

google-apps-script google-sheets drop-down-menu scripting dropdown
1个回答
0
投票
  • 您想通过“ M”列显示到“ N”列的下拉列表。

如果我的理解正确,那么这个答案如何?请认为这只是几个可能的答案之一。

修改点:

  • optionsapplyFirstLevelValidation的功能未声明[applySecondLevelValidation
  • r.thirdLevelColumn的[ws.getRange(r.thirdLevelColumn)]发生错误。因为r是数字。
  • .requireValueInlist(list).requireValueInList(list)。这是一个拼写错误。

修改的脚本:

修改脚本后,请进行如下修改。

发件人:

var filteredOptions = options.filter(function(o){ return o[0] === val });

收件人:

var filteredOptions = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] === val });

发件人:

var filteredOptions =options.filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });

收件人:

var filteredOptions = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });

发件人:

var listToApply = filteredOptions.map(function(o){ return o[2] });
var cell = ws.getRange(r.thirdLevelColumn);
applyValidationToCell(listToApply,cell);

收件人:

var listToApply = filteredOptions.map(function(o){ return o[2] });
var cell = ws.getRange(r, thirdLevelColumn);  // <--- Modified
applyValidationToCell(listToApply,cell);

发件人:

var rule = SpreadsheetApp
.newDataValidation()
.requireValueInlist(list)
.setAllowInvalid(false)
.build();

收件人:

var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)  // <--- Modified
.setAllowInvalid(false)
.build();

整个修改的脚本:

var mainWsName = "master";
var optionsWsName = "options";
var firstLevelColumn = 12;
var secondLevelColumn = 13;
var thirdLevelColumn = 14;

var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainWsName);
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionsWsName);

function onEdit(e){
  var activeCell = e.range;
  var val = activeCell.getValue();
  var r = activeCell.getRow();
  var c = activeCell.getColumn();
  var wsName = activeCell.getSheet().getName();
  if(wsName === mainWsName && c === firstLevelColumn && r > 4){
    applyFirstLevelValidation(val,r);
  } else if(wsName === mainWsName && c === secondLevelColumn && r > 4){
    applySecondLevelValidation(val,r);
  } 
} //end onEdit

function applyFirstLevelValidation(val,r){
  if(val === ""){
    ws.getRange(r, secondLevelColumn).clearContent();
    ws.getRange(r, secondLevelColumn).clearDataValidations();
    ws.getRange(r, thirdLevelColumn).clearContent();
    ws.getRange(r, thirdLevelColumn).clearDataValidations();
      } else {
    ws.getRange(r, secondLevelColumn).clearContent();
    ws.getRange(r, secondLevelColumn).clearDataValidations();
    ws.getRange(r, thirdLevelColumn).clearContent();
    ws.getRange(r, thirdLevelColumn).clearDataValidations();
    var filteredOptions = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] === val });  // <--- Modified
    var listToApply = filteredOptions.map(function(o){ return o[1] });
    var cell = ws.getRange(r, secondLevelColumn);
    applyValidationToCell(listToApply,cell);
   }
}  

function applySecondLevelValidation(val,r){
  if(val === ""){
    ws.getRange(r, thirdLevelColumn).clearContent();
    ws.getRange(r, thirdLevelColumn).clearDataValidations();
  } else {
    ws.getRange(r, thirdLevelColumn).clearContent();
    var firstLevelColValue = ws.getRange(r, firstLevelColumn).getValue();
    var filteredOptions = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });  // <--- Modified
    var listToApply = filteredOptions.map(function(o){ return o[2] });
    var cell = ws.getRange(r, thirdLevelColumn);  // <--- Modified
    applyValidationToCell(listToApply,cell);
   }
}  

function applyValidationToCell(list,cell){
  var rule = SpreadsheetApp
  .newDataValidation()
  .requireValueInList(list)  // <--- Modified
  .setAllowInvalid(false)
  .build();

  cell.setDataValidation(rule)
}

参考:

如果我误解了你的问题,而这不是你想要的方向,我深表歉意。

© www.soinside.com 2019 - 2024. All rights reserved.