我的代码需要一些帮助。我是新手。 我有一个很棒的脚本。但我想使其在多个选项卡中起作用,这些选项卡将与“布局1”重复。
我只想在那些“布局x”标签中使用此脚本。我也有其他标签。 我在youtbe视频的帮助下制作了这个脚本。根据我的喜好和需求进行编辑。 但是无法弄清楚如何使其在其他“布局”标签中起作用。
var mainwsname = 'Layout 1';
// tabs i want to edit below. Need help ?
//var mainwsname = ['Layout 1', 'Layout 2', 'Layout 3', 'Layout 4', 'Layout 5', 'Layout 6', 'Layout 7', 'Layout 8', 'Layout 9', 'Layout 10', 'Layout 11', 'Layout 12'];
var optionsname = 'Options';
var firstLevelColumn = 8;
var secondLevelColumn = 1;
var thirdLevelColumn = 2;
var fourthLevelColumn = 3;
var ws= SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainwsname);
var wsOptions= SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionsname);
var options = wsOptions.getRange(2,1,wsOptions.getLastRow()-1,4).getValues(); //4 is getal aantal kolommen in options
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>2)
{
applyFirstLevelValidation(val ,r);
} else if(wsname === mainwsname && c===secondLevelColumn && r>2)
{
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, thirdLevelColumn).clearContent();
ws.getRange(r, secondLevelColumn).clearDataValidations();
ws.getRange(r, thirdLevelColumn).clearDataValidations();
var filteredOptions = options.filter(function(o){return o[0]=== val});
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();
ws.getRange(r, fourthLevelColumn).clearContent();
ws.getRange(r, fourthLevelColumn).clearDataValidations();
}
else{
ws.getRange(r, thirdLevelColumn).clearContent();
ws.getRange(r, fourthLevelColumn).clearContent();
var firstLevelColValue= ws.getRange(r, firstLevelColumn).getValue();
var filteredOptions = options.filter(function(o){return o[0]=== firstLevelColValue && o[1]=== val});
var thirdColumnValue= filteredOptions.map(function(o){return o[2]});
var fourthColumnValue= filteredOptions.map(function(o){return o[3]});
ws.getRange(r,thirdLevelColumn).setValue(thirdColumnValue);
ws.getRange(r,fourthLevelColumn).setValue(fourthColumnValue);
}
}
function applyValidationToCell(list,cell)
{
var rule = SpreadsheetApp.newDataValidation()
.requireValueInList(list).setAllowInvalid(false)
.build();
cell.setDataValidation(rule);
}
答案 0 :(得分:1)
onEdit()
的工作表名称运行'Layout x
,例如Layout 1
,Layout 2
。如果我的理解是正确的,那么该修改如何?请认为这只是几个可能的答案之一。
function onEdit(e)
{
var activeCell = e.range;
function onEdit(e)
{
var activeCell = e.range;
if (!/Layout \d+/.test(activeCell.getSheet().getSheetName())) return; // Added
Layout
和x
之间没有空格,请将Layout \d+
修改为Layout ?\d+
。如果我误解了您的问题,而这不是您想要的方向,我深表歉意。
答案 1 :(得分:0)
感谢您的帮助,但是我无法使其工作。
我写了一些野蛮的脚本使它现在可以工作。
我写道:
if (sheet.getName() == "Layout 1"){
var mainwsname = 'Layout 1';}
if (sheet.getName() == "Layout 2"){
var mainwsname = 'Layout 2';}
到
if (sheet.getName() == "Layout 10"){
var mainwsname = 'Layout 10';}
似乎它使我的工作表中的响应时间变慢,但它可以工作。
答案 2 :(得分:0)
现在,使用else函数(如果函数+仅声明一次var mainwsname)使它稍微好一点。
(将来发布给需要类似事物的人)
var sheet = SpreadsheetApp.getActiveSheet();
var mainwsname = ' ';
if (sheet.getName() == "Layout 1"){
mainwsname = 'Layout 1';}
else if (sheet.getName() == "Layout 2"){
mainwsname = 'Layout 2';}
else if (sheet.getName() == "Layout 3"){
mainwsname = 'Layout 3';}
else if (sheet.getName() == "Layout 4"){
mainwsname = 'Layout 4';}
else if (sheet.getName() == "Layout 5"){
mainwsname = 'Layout 5';}
else if (sheet.getName() == "Layout 6"){
mainwsname = 'Layout 6';}
else if (sheet.getName() == "Layout 7"){
mainwsname = 'Layout 7';}
else if (sheet.getName() == "Layout 8"){
mainwsname = 'Layout 8';}
else if (sheet.getName() == "Layout 9"){
mainwsname = 'Layout 9';}
else if (sheet.getName() == "Layout 10"){
mainwsname = 'Layout 10';}