Google工作表动态下拉列表

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

我能够在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)))

google-sheets dropdown dynamic-list
1个回答
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);
}
© www.soinside.com 2019 - 2024. All rights reserved.