使用应用程序脚本的动态下拉列表验证(第三级)

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

我编写了一个脚本来应用三个级别的验证。验证的第一级位于“主”表的A列中,第二和第三级位于应用脚本中。

我能够在“主”页面中选择第一级验证,并且列表被过滤为仅在B列的下拉列表中显示相关答案。在B列中选择答案后,下拉箭头显示在C列,但没有可供选择的字段。我可以手动输入列表中的值,该值会被接受,列表中未包含的任何内容都会被拒绝。我已将问题范围缩小到:

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

当我将Logger.log(filteredOptions);放入function applySecondLevelValadation(val, r){时,它返回一个空数组[]。

放置时

Logger.log(filteredOptions);` in `function applyFirstLevelValadation(val, r){

,它返回数组:

[[Intermediate, 9:00 AM, Upper Dumont], [Intermediate, 12:00 PM, Outer Limts], [Intermediate, 3:30 PM, Satelite], [Intermediate, 9:00 AM, Box], [Intermediate, 12:00 PM, Hidden Valley], [Intermediate, 3:30 PM, Kermits]]

“选项”表的屏幕截图

““选项”表的屏幕截图”

“主”屏幕截图,其中A和B列具有所有可能的选项,而C列中没有可供选择的选项

<<

任何帮助弄清楚var filteredOptions = options.filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });为什么返回空数组的方法都很好!

正在使用的代码:

var mainWsName = "master"; var optionsWsName = "options"; var firstLevelColumn = 1; var secondLevelColumn = 2; var thirdLevelColumn = 3; var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainWsName); var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionsWsName); var options = wsOptions.getRange(2,1,wsOptions.getLastRow()-1,3).getValues(); 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 > 1) { applyFirstLevelValadation(val, r); } else if(wsName === mainWsName && c === secondLevelColumn && r > 1) { applySecondLevelValadation(val, r); } } function applyFirstLevelValadation(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); Logger.log(filteredOptions) applyValidationToCell(listToApply,cell); } } function applySecondLevelValadation(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); Logger.log(filteredOptions); applyValidationToCell(listToApply,cell); } } function applyValidationToCell(list, cell) { var rule = SpreadsheetApp .newDataValidation() .requireValueInList(list) .setAllowInvalid(false) .build(); cell.setDataValidation(rule); }

我编写了一个脚本来应用三个级别的验证。验证的第一级在“主”表的A列中,第二和第三级在应用程序脚本中。我可以选择...
validation google-apps-script google-sheets dropdown dynamic-data-list
1个回答
0
投票
似乎您在时间栏上遇到了问题。可能是因为它将字符串与日期或您所拥有的进行了比较。如果您共享电子表格的副本,我们将有更多信息。
© www.soinside.com 2019 - 2024. All rights reserved.