Запустите скрипт Google Sheets на нескольких определенных вкладках - PullRequest
0 голосов
/ 18 марта 2020

У меня есть рабочий скрипт, который создает зависимые раскрывающиеся списки на одной вкладке с именем «Один». Теперь мне нужно, чтобы он работал для другой аналогичной вкладки с именем «middle» и третьей вкладки с именем «mix». Структура этих вкладок похожа друг на друга. Как я могу управлять этим с помощью следующего скрипта?

var mainWsName = "One";                             
var optionsWsName = "STOK";                             
var firstLevelColumn = 5;                               
var secondLevelColumn = 6;                              
var thirdLevelColumn = 7;                               

var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainWsName);                              
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionsWsName);                                

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 > 4){                               
applyFirstLevelValidation(val,r);                               
} else if(wsName === mainWsName && c === secondLevelColumn && r > 4){                               
applySecondLevelValidation(val,r);                              
}                               
} //end onEdit                              

function applyFirstLevelValidation(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 = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] === 
val });  // <--- Modified                               
var listToApply = filteredOptions.map(function(o){ return o[1] });                              
var cell = ws.getRange(r, secondLevelColumn);                               
applyValidationToCell(listToApply,cell);                                
}                               
}                               

function applySecondLevelValidation(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 = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] === 
firstLevelColValue && o[1] === val });  // <--- Modified                                
var listToApply = filteredOptions.map(function(o){ return o[2] });                              
var cell = ws.getRange(r, thirdLevelColumn);                                
applyValidationToCell(listToApply,cell);                                
}                               
}                               

function applyValidationToCell(list,cell){                              
var rule = SpreadsheetApp                               
.newDataValidation()                                
.requireValueInList(list)                               
.setAllowInvalid(false)                             
.build();                               

cell.setDataValidation(rule)                                
}   

1 Ответ

0 голосов
/ 18 марта 2020

Ваша строка

if(wsName === mainWsName && c === firstLevelColumn && r > 4){   

содержит оператор if, который запускает функцию applyFirstLevelValidation(val,r) только при условии, что имя редактируемого листа равно mainWsName, при этом

var mainWsName = "One";

Теперь, если вы хотите запустить функцию для более чем одного листа:

  1. Вам необходимо создать дополнительные переменные для всех интересующих названий листов и сравнить имя отредактированного листа с все эти переменные с оператором ||.

  2. Необходимо передать отредактированное имя листа wsName в функцию applyFirstLevelValidation, чтобы убедиться, что код применяется к правильному листу.

Образец:


var mainWsName1 = "One";   
var mainWsName2 = "Two";                          
var optionsWsName = "STOK";                             
var firstLevelColumn = 5;                               
var secondLevelColumn = 6;                              
var thirdLevelColumn = 7; 

var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionsWsName);                                

function onEdit(e){                             
  var activeCell = e.range;                               
  var val = activeCell.getValue();                                
  var r = activeCell.getRow();                                
  var c = activeCell.getColumn();                             
  var wsName = activeCell.getSheet().getName();
  // compare the edited sheet name against multiple allowed sheet anmes with ||                               
  if(wsName == mainWsName1 || wsName == mainWsName2 && r > 4){
    if(c == firstLevelColumn){                               
      applyFirstLevelValidation(val,r, wsName);                               
    } else if(c == secondLevelColumn){                               
      applySecondLevelValidation(val,r, wsName);                              
    }  
  }                             
} 

function applyFirstLevelValidation(val,r,wsName){
  //  obtain the sheet name dynamically from the onEdit() function  
  var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(wsName);                            
  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 = wsOptions.getDataRange().getValues().filter(function(o){ return o[0] == 
      val });  // <--- Modified                               
    var listToApply = filteredOptions.map(function(o){ return o[1] });                              
    var cell = ws.getRange(r, secondLevelColumn);                               
    applyValidationToCell(listToApply,cell);                                
  }                               
}                               

function applySecondLevelValidation(val,r, wsName){   

  //change in the same way as function applyFirstLevelValidation
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...