多下拉验证
Multiple drop down validation
我正在尝试使以下代码可用于 Google sheet 中的所有工作sheet,但找不到方法:(我想要多重工作 sheet 五月、六月、七月等等..)
var mainwsname = "APRIL 21";
var optionwsname = "DataBase1";
var firstlevelcoloumn = 4;
var secondlevelcoloumn = 5;
var thirdlevelcoloumn = 6;
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainwsname);
var wsDatabase = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionwsname);
var options = wsDatabase.getRange(2,1,wsDatabase.getLastRow()-1,3).getValues();
function onEdit(activecell){
var activecell = ws.getActiveCell();
var val = activecell.getValue();
var r = activecell.getRow();
var c = activecell.getColumn();
var wsName = activecell.getSheet().getName();
if (wsName === mainwsname && c===firstlevelcoloumn && r>20){
applyfirstlevelvalidation(val,r);
}
else if(wsName === mainwsname && c===secondlevelcoloumn && r>20) {
applysecondlevelvalidation(val,r);
}
}// close onedit function
function applyfirstlevelvalidation(val,r){
if(val === ""){
ws.getRange(r,secondlevelcoloumn).clearContent();
ws.getRange(r,secondlevelcoloumn).clearDataValidations();
} else{
ws.getRange(r,secondlevelcoloumn).clearContent();
var filteredoptions = options.filter(function(o){return o[0]===val});
var listtoapply = filteredoptions.map(function(o){return o[1]});
var cell = ws.getRange(r,secondlevelcoloumn);
applyvalidationtocell(listtoapply,cell);
}
}
function applysecondlevelvalidation(val,r){
if(val === ""){
ws.getRange(r,thirdlevelcoloumn).clearContent();
ws.getRange(r,thirdlevelcoloumn).clearDataValidations();
} else{
ws.getRange(r,thirdlevelcoloumn).clearContent();
var firstlevelcolvalue = ws.getRange(r,firstlevelcoloumn).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,thirdlevelcoloumn);
applyvalidationtocell(listtoapply,cell);
}
}
function applysecondlevelvalidation(val,r){
if(val == ""){
ws.getRange(r,thirdlevelcoloumn).clearContent();
ws.getRange(r,thirdlevelcoloumn).clearDataValidations();
} else {
ws.getRange(r,thirdlevelcoloumn).clearContent();
var firstLevelColValue = ws.getRange(r,firstlevelcoloumn).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,thirdlevelcoloumn);
applyvalidationtocell(listToApply,cell);
}
}
function applyvalidationtocell(list,cell) {
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule);
}
我已将当前 sheet 名称声明为 APRIL 21 作为主要工作sheet 变量。请帮我申报多个工作sheets(如MAY、JUNE等)。我可能会包括以后的一个月。
试试这个:
var optionwsname = "DataBase1";
var firstlevelcoloumn = 4;
var secondlevelcoloumn = 5;
var thirdlevelcoloumn = 6;
var ws = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var wsDatabase = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionwsname);
var options = wsDatabase.getRange(2,1,wsDatabase.getLastRow()-1,3).getValues();
function onEdit(activecell){
var activecell = ws.getActiveCell();
var val = activecell.getValue();
var r = activecell.getRow();
var c = activecell.getColumn();
var wsName = activecell.getSheet().getName();
if ( c===firstlevelcoloumn && r>20){
applyfirstlevelvalidation(val,r);
}
else if( c===secondlevelcoloumn && r>20) {
applysecondlevelvalidation(val,r);
}
}// close onedit function
function applyfirstlevelvalidation(val,r){
if(val === ""){
ws.getRange(r,secondlevelcoloumn).clearContent();
ws.getRange(r,secondlevelcoloumn).clearDataValidations();
} else{
ws.getRange(r,secondlevelcoloumn).clearContent();
var filteredoptions = options.filter(function(o){return o[0]===val});
var listtoapply = filteredoptions.map(function(o){return o[1]});
var cell = ws.getRange(r,secondlevelcoloumn);
applyvalidationtocell(listtoapply,cell);
}
}
function applysecondlevelvalidation(val,r){
if(val === ""){
ws.getRange(r,thirdlevelcoloumn).clearContent();
ws.getRange(r,thirdlevelcoloumn).clearDataValidations();
} else{
ws.getRange(r,thirdlevelcoloumn).clearContent();
var firstlevelcolvalue = ws.getRange(r,firstlevelcoloumn).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,thirdlevelcoloumn);
applyvalidationtocell(listtoapply,cell);
}
}
function applysecondlevelvalidation(val,r){
if(val == ""){
ws.getRange(r,thirdlevelcoloumn).clearContent();
ws.getRange(r,thirdlevelcoloumn).clearDataValidations();
} else {
ws.getRange(r,thirdlevelcoloumn).clearContent();
var firstLevelColValue = ws.getRange(r,firstlevelcoloumn).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,thirdlevelcoloumn);
applyvalidationtocell(listToApply,cell);
}
}
function applyvalidationtocell(list,cell) {
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule);
}
更新:
删除了 var mainwsname = "APRIL 21";
并将 var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainwsname);
更改为 var ws = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
因为 getActiveSheet();
引用了您正在处理的当前 sheet 所以所有 sheets.
上的函数 运行s
删除了您的 if-else 语句中的 wsName === mainwsname
,因为我们将不再需要此条件来 运行 脚本。
我正在尝试使以下代码可用于 Google sheet 中的所有工作sheet,但找不到方法:(我想要多重工作 sheet 五月、六月、七月等等..)
var mainwsname = "APRIL 21";
var optionwsname = "DataBase1";
var firstlevelcoloumn = 4;
var secondlevelcoloumn = 5;
var thirdlevelcoloumn = 6;
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainwsname);
var wsDatabase = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionwsname);
var options = wsDatabase.getRange(2,1,wsDatabase.getLastRow()-1,3).getValues();
function onEdit(activecell){
var activecell = ws.getActiveCell();
var val = activecell.getValue();
var r = activecell.getRow();
var c = activecell.getColumn();
var wsName = activecell.getSheet().getName();
if (wsName === mainwsname && c===firstlevelcoloumn && r>20){
applyfirstlevelvalidation(val,r);
}
else if(wsName === mainwsname && c===secondlevelcoloumn && r>20) {
applysecondlevelvalidation(val,r);
}
}// close onedit function
function applyfirstlevelvalidation(val,r){
if(val === ""){
ws.getRange(r,secondlevelcoloumn).clearContent();
ws.getRange(r,secondlevelcoloumn).clearDataValidations();
} else{
ws.getRange(r,secondlevelcoloumn).clearContent();
var filteredoptions = options.filter(function(o){return o[0]===val});
var listtoapply = filteredoptions.map(function(o){return o[1]});
var cell = ws.getRange(r,secondlevelcoloumn);
applyvalidationtocell(listtoapply,cell);
}
}
function applysecondlevelvalidation(val,r){
if(val === ""){
ws.getRange(r,thirdlevelcoloumn).clearContent();
ws.getRange(r,thirdlevelcoloumn).clearDataValidations();
} else{
ws.getRange(r,thirdlevelcoloumn).clearContent();
var firstlevelcolvalue = ws.getRange(r,firstlevelcoloumn).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,thirdlevelcoloumn);
applyvalidationtocell(listtoapply,cell);
}
}
function applysecondlevelvalidation(val,r){
if(val == ""){
ws.getRange(r,thirdlevelcoloumn).clearContent();
ws.getRange(r,thirdlevelcoloumn).clearDataValidations();
} else {
ws.getRange(r,thirdlevelcoloumn).clearContent();
var firstLevelColValue = ws.getRange(r,firstlevelcoloumn).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,thirdlevelcoloumn);
applyvalidationtocell(listToApply,cell);
}
}
function applyvalidationtocell(list,cell) {
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule);
}
我已将当前 sheet 名称声明为 APRIL 21 作为主要工作sheet 变量。请帮我申报多个工作sheets(如MAY、JUNE等)。我可能会包括以后的一个月。
试试这个:
var optionwsname = "DataBase1";
var firstlevelcoloumn = 4;
var secondlevelcoloumn = 5;
var thirdlevelcoloumn = 6;
var ws = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var wsDatabase = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionwsname);
var options = wsDatabase.getRange(2,1,wsDatabase.getLastRow()-1,3).getValues();
function onEdit(activecell){
var activecell = ws.getActiveCell();
var val = activecell.getValue();
var r = activecell.getRow();
var c = activecell.getColumn();
var wsName = activecell.getSheet().getName();
if ( c===firstlevelcoloumn && r>20){
applyfirstlevelvalidation(val,r);
}
else if( c===secondlevelcoloumn && r>20) {
applysecondlevelvalidation(val,r);
}
}// close onedit function
function applyfirstlevelvalidation(val,r){
if(val === ""){
ws.getRange(r,secondlevelcoloumn).clearContent();
ws.getRange(r,secondlevelcoloumn).clearDataValidations();
} else{
ws.getRange(r,secondlevelcoloumn).clearContent();
var filteredoptions = options.filter(function(o){return o[0]===val});
var listtoapply = filteredoptions.map(function(o){return o[1]});
var cell = ws.getRange(r,secondlevelcoloumn);
applyvalidationtocell(listtoapply,cell);
}
}
function applysecondlevelvalidation(val,r){
if(val === ""){
ws.getRange(r,thirdlevelcoloumn).clearContent();
ws.getRange(r,thirdlevelcoloumn).clearDataValidations();
} else{
ws.getRange(r,thirdlevelcoloumn).clearContent();
var firstlevelcolvalue = ws.getRange(r,firstlevelcoloumn).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,thirdlevelcoloumn);
applyvalidationtocell(listtoapply,cell);
}
}
function applysecondlevelvalidation(val,r){
if(val == ""){
ws.getRange(r,thirdlevelcoloumn).clearContent();
ws.getRange(r,thirdlevelcoloumn).clearDataValidations();
} else {
ws.getRange(r,thirdlevelcoloumn).clearContent();
var firstLevelColValue = ws.getRange(r,firstlevelcoloumn).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,thirdlevelcoloumn);
applyvalidationtocell(listToApply,cell);
}
}
function applyvalidationtocell(list,cell) {
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule);
}
更新:
删除了
上的函数 运行svar mainwsname = "APRIL 21";
并将 varws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainwsname);
更改为var ws = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
因为getActiveSheet();
引用了您正在处理的当前 sheet 所以所有 sheets.删除了您的 if-else 语句中的
wsName === mainwsname
,因为我们将不再需要此条件来 运行 脚本。