[英]Run Google Sheets script on several certain tabs
我有一個工作腳本,它在一個名為“One”的選項卡上創建依賴下拉列表。 現在我需要它為另一個名為“中間”的類似選項卡和名為“混合”的第三個選項卡工作。 這些選項卡的結構彼此相似。 如何使用以下腳本管理它?
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)
}
你的線路
if(wsName === mainWsName && c === firstLevelColumn && r > 4){
包含一個if
語句,該語句僅在編輯的工作表名稱等於mainWsName
的條件下運行applyFirstLevelValidation(val,r)
,由此
var mainWsName = "One";
現在,如果您想為不止一張紙運行該函數:
您需要為所有感興趣的工作表名稱創建額外的變量,並將編輯過的工作表名稱與所有這些變量進行比較,並使用||
操作員。
您需要將編輯過的工作表名稱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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.