【发布时间】:2020-09-25 10:08:59
【问题描述】:
我想将以下代码应用于同一个 Google 表格中的多个选项卡。在第一个 var 中定义不同的选项卡,或在同一个项目中应用多个 .gs 文件,每个文件都有不同的 var。
var naamWerkbladKasboek = "Kasboek";
var naamWerkbladOpties = "Opties";
var eersteKolomMetInput = 2;
var tweedeKolomMetInput = 3;
var derdeKolomMetInput = 4;
var werkblad = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(naamWerkbladKasboek);
var werkbladOpties = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(naamWerkbladOpties);
var Opties = werkbladOpties.getRange(2, 1, werkbladOpties.getLastRow()-1, 3).getValues();
function onEdit(e){
var activeCell = e.range;
var val = activeCell.getValue();
var row = activeCell.getRow();
var column = activeCell.getColumn();
var werkbladName = activeCell.getSheet().getName();
if(werkbladName === naamWerkbladKasboek && column === eersteKolomMetInput && row > 1){
applyFirstLevelValidation(val, row);
} else if(werkbladName === naamWerkbladKasboek && column === tweedeKolomMetInput && row > 1){
applySecondLevelValidation(val, row);
}
}
function applyFirstLevelValidation(val, row){
if(val === ""){
werkblad.getRange(row, tweedeKolomMetInput).clearContent();
werkblad.getRange(row, tweedeKolomMetInput).clearDataValidations();
werkblad.getRange(row, derdeKolomMetInput).clearContent();
werkblad.getRange(row, derdeKolomMetInput).clearDataValidations();
} else {
werkblad.getRange(row, tweedeKolomMetInput).clearContent();
werkblad.getRange(row, tweedeKolomMetInput).clearDataValidations();
werkblad.getRange(row, derdeKolomMetInput).clearContent();
werkblad.getRange(row, derdeKolomMetInput).clearDataValidations();
var gefilterdeOpties = Opties.filter(function(o){ return o[0] === val });
var listToApply = gefilterdeOpties.map(function(o){ return o[1] });
var cell = werkblad.getRange(row, tweedeKolomMetInput);
applyValidationToCell(listToApply,cell);
}
}
function applySecondLevelValidation(val, row){
if(val === ""){
werkblad.getRange(row, derdeKolomMetInput).clearContent();
werkblad.getRange(row, derdeKolomMetInput).clearDataValidations();
} else {
werkblad.getRange(row, derdeKolomMetInput).clearContent();
var waardeEersteKolomMetInput = werkblad.getRange(row, eersteKolomMetInput).getValue();
var gefilterdeOpties = Opties.filter(function(o){ return o[0] === waardeEersteKolomMetInput && o[1] === val });
var listToApply = gefilterdeOpties.map(function(o){ return o[2] });
var cell = werkblad.getRange(row, derdeKolomMetInput);
applyValidationToCell(listToApply,cell);
}
}
function applyValidationToCell(list,cell){
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule)
}
我尝试过使用 only 和 exclude 标签,如下所示:How to run a script on multiple sheets, Google Sheets,还尝试使用数组,如下所示:https://webapps.stackexchange.com/questions/115076/how-to-run-script-on-multiple-google-sheet-tabs,但都无济于事。有人可以指出我正确的方向吗?
作为一个例子,我可以展示我是如何尝试使用唯一标签的
//**EDIT**
var only = [
"Kasboek1",
"Kasboek2",
"Kasboek3"
];
var naamWerkbladOpties = "Opties";
var eersteKolomMetInput = 2;
var tweedeKolomMetInput = 3;
var derdeKolomMetInput = 4;
var werkblad = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(only);
var werkbladOpties = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(naamWerkbladOpties);
var Opties = werkbladOpties.getRange(2, 1, werkbladOpties.getLastRow()-1, 3).getValues();
function onEdit(e){
var activeCell = e.range;
var val = activeCell.getValue();
var row = activeCell.getRow();
var column = activeCell.getColumn();
var werkbladName = activeCell.getSheet().getName();
if(werkbladName === only && column === eersteKolomMetInput && row > 1){
applyFirstLevelValidation(val, row);
} else if(werkbladName === only && column === tweedeKolomMetInput && row > 1){
applySecondLevelValidation(val, row);
}
}
function applyFirstLevelValidation(val, row){
if(val === ""){
werkblad.getRange(row, tweedeKolomMetInput).clearContent();
werkblad.getRange(row, tweedeKolomMetInput).clearDataValidations();
werkblad.getRange(row, derdeKolomMetInput).clearContent();
werkblad.getRange(row, derdeKolomMetInput).clearDataValidations();
} else {
werkblad.getRange(row, tweedeKolomMetInput).clearContent();
werkblad.getRange(row, tweedeKolomMetInput).clearDataValidations();
werkblad.getRange(row, derdeKolomMetInput).clearContent();
werkblad.getRange(row, derdeKolomMetInput).clearDataValidations();
var gefilterdeOpties = Opties.filter(function(o){ return o[0] === val });
var listToApply = gefilterdeOpties.map(function(o){ return o[1] });
var cell = werkblad.getRange(row, tweedeKolomMetInput);
applyValidationToCell(listToApply,cell);
}
}
function applySecondLevelValidation(val, row){
if(val === ""){
werkblad.getRange(row, derdeKolomMetInput).clearContent();
werkblad.getRange(row, derdeKolomMetInput).clearDataValidations();
} else {
werkblad.getRange(row, derdeKolomMetInput).clearContent();
var waardeEersteKolomMetInput = werkblad.getRange(row, eersteKolomMetInput).getValue();
var gefilterdeOpties = Opties.filter(function(o){ return o[0] === waardeEersteKolomMetInput && o[1] === val });
var listToApply = gefilterdeOpties.map(function(o){ return o[2] });
var cell = werkblad.getRange(row, derdeKolomMetInput);
applyValidationToCell(listToApply,cell);
}
}
function applyValidationToCell(list,cell){
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule)
}
【问题讨论】:
-
@Marios 我认为这与 OP 的情况无关。
-
@user14339468
both to no avail.是什么意思?发生了什么,与您想要的有什么不同? -
谢谢马里奥,但这不起作用。我在 onEdit 下面也有函数,它们使用文档开头定义的变量。如果我将此变量放在不同的 onEdit 版本之下,则不会发生任何事情。此外,如果我将 var 更改为 "Kasboek1" && "Kasboek2" 它只适用于我输入的最后一个。
-
Edit 显示您尝试使用 only 和 exclude 标签的脚本,如下所示:如何在多个工作表上运行脚本,Google Sheets跨度>
-
考虑学习基本的数组或 JavaScript 课程。你不能像那样使用
only。有关详细信息,请参阅tag info page。
标签: javascript arrays google-apps-script