多下拉验证

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);

}

更新:

  1. 删除了 var mainwsname = "APRIL 21"; 并将 var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainwsname); 更改为 var ws = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 因为 getActiveSheet(); 引用了您正在处理的当前 sheet 所以所有 sheets.

    上的函数 运行s
  2. 删除了您的 if-else 语句中的 wsName === mainwsname,因为我们将不再需要此条件来 运行 脚本。