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

Validation 使用应用程序脚本进行动态下拉列表验证(第三级),validation,google-apps-script,google-sheets,dropdown,dynamic-data-list,Validation,Google Apps Script,Google Sheets,Dropdown,Dynamic Data List,我编写了一个脚本来应用三个级别的验证。第一级验证在“主”表的A列中,第二级和第三级验证在应用程序脚本中 我可以在“主”表中选择第一级验证,并对列表进行过滤,以仅在B列的下拉列表中显示相关答案。在B列中选择我的答案后,C列中会出现下拉箭头,但没有可选择的字段。我可以手动输入列表中的值,该值将被接受,而列表中未包含的任何内容将被拒绝。我已将我的问题缩小到: var filteredOptions = options.filter(function(o){ return o[0] === firstL

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

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

var filteredOptions = options.filter(function(o){ return o[0] === firstLevelColValue && o[1] === val });
当我放置
Logger.log(filteredOptions)时
函数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(函数(o){returno[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);
}

您的时间列似乎有问题。可能是因为它将字符串与日期或其他内容进行比较。如果您共享电子表格的副本,我们将获得更多信息

在任何情况下,为了避免这种情况,您都可以将B列(在“主”和“选项”中)中的数据格式化为纯文本(为此,请转到电子表格中的格式>数字>纯文本)。然后,您可以将行程时间以纯文本形式写入“选项”中


我希望这能对您有所帮助。

您能提供一份电子表格副本吗?当然没有敏感数据?屏幕截图很好,但电子表格会非常有用。将“主”电子表格更改为纯文本可以解决所有问题。非常感谢!很高兴这对您有所帮助!另外,请记住,您可以将问题标记为s通过接受为您的问题提供解决方案的答案来解决;)