我有一個從資料庫中過濾并根據初始輸入創建相關下拉串列的腳本。我想知道無論如何要設定一個默認值以顯示在這些下拉串列中嗎?理想情況下,是否會自動設定為下拉串列中的第一個值?
我想我應該能夠修改該applyValidationToCell功能,但我不確定如何修改?
任何幫助,將不勝感激
var mainWSname = "Sheet1"
var optonsWSname = "Sheet2"
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainWSname);
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optonsWSname);
var options = wsOptions.getRange(2, 15, wsOptions.getLastRow()-1, 3).getValues();
var firstLevel = 3
var secondLevel = 4
var thirdLevel = 5
function onEdit(e){
var activeCell = e.range;
var r = activeCell.getRow()
var c = activeCell.getColumn()
var val = activeCell.getValue();
var wsName = activeCell.getSheet().getName()
if(wsName === mainWSname && c === firstLevel && r > 76){
applyFirstLevelValidation(val, r)
} else if(wsName === mainWSname && c === secondLevel && r >76){
applySecondLevelValidation(val, r)
}
} /// end onEdit
function applyFirstLevelValidation(val, r){
if(val === ""){
ws.getRange(r,secondLevel).clearContent();
ws.getRange(r,secondLevel).clearDataValidations();
ws.getRange(r,thirdLevel).clearContent();
ws.getRange(r,thirdLevel).clearDataValidations();
} else {
ws.getRange(r,secondLevel).clearContent();
ws.getRange(r,secondLevel).clearDataValidations();
ws.getRange(r,thirdLevel).clearContent();
ws.getRange(r,thirdLevel).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,secondLevel)
applyValidationToCell(listToApply, cell)
}
} //end applyFirstLevelValidation
function applySecondLevelValidation(val, r){
if(val === ""){
ws.getRange(r,thirdLevel).clearContent();
ws.getRange(r,thirdLevel).clearDataValidations();
} else {
ws.getRange(r,thirdLevel).clearContent()
var firstLevelColValue = ws.getRange(r, firstLevel).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,thirdLevel)
applyValidationToCell(listToApply, cell)
}
} //end
function applyValidationToCell(list, cell){
var rule = SpreadsheetApp
.newDataValidation()
.requireValueInList(list)
.setAllowInvalid(false)
.build();
cell.setDataValidation(rule)
}
uj5u.com熱心網友回復:
在您的腳本中,以下修改如何?在此修改中,修改了功能applyValidationToCell。
從:
cell.setDataValidation(rule)
到:
cell.setDataValidation(rule).setValue(list[0]);
順便說一句,當上述修改反映在您的腳本中時,第二次資料驗證顯示初始值。但是,在這種情況下,不會顯示第三次資料驗證。因為第二次資料驗證沒有被編輯。那么,當您想將第 1 個值放入“C”列時將第 2 次和第 3 次資料驗證與初始值一起放置時,下面的修改如何?在這種情況下,請修改您的applyValidationToCell和功能applyFirstLevelValidation如下。
applyValidationToCell:
function applyValidationToCell(list, cell) {
var rule = SpreadsheetApp.newDataValidation().requireValueInList(list).setAllowInvalid(false).build();
cell.setDataValidation(rule).setValue(list[0]); // Modified
}
applyFirstLevelValidation:
function applyFirstLevelValidation(val, r) {
if (val === "") {
ws.getRange(r, secondLevel).clearContent();
ws.getRange(r, secondLevel).clearDataValidations();
ws.getRange(r, thirdLevel).clearContent();
ws.getRange(r, thirdLevel).clearDataValidations();
} else {
ws.getRange(r, secondLevel).clearContent();
ws.getRange(r, secondLevel).clearDataValidations();
ws.getRange(r, thirdLevel).clearContent();
ws.getRange(r, thirdLevel).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, secondLevel)
applyValidationToCell(listToApply, cell)
applySecondLevelValidation(listToApply[0], r); // Added
}
}
筆記:
- 如果上述修改不是您期望的結果,您能否提供示例電子表格以復制該問題?借此,我想確認一下。
uj5u.com熱心網友回復:
您可以將資料驗證創建為串列,然后將它們放在您希望的任何范圍內:
function myfunk() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet0');
let r = SpreadsheetApp.newDataValidation().requireValueInList(['1','2','3','4','5']).build();
sh.getRange(1,1,5,1).setDataValidation(r);
}
資料驗證 RequireValueInList
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/358805.html
