[英]Google Sheets - Data Validation - Forcing Uniqueness from a drop down list
我在google工作表中有列,用戶需要從下拉列表中選擇項目列表,但列中的每個值都必須是唯一的。
我找到了幾種方法,但沒有一種方法可以做到這一點。
首先,我嘗試使用此解決方案 - https://infoinspired.com/google-docs/spreadsheet/distinct-values-in-drop-down-list-in-google-sheets/ - 它使用查詢功能制作一個動態更改數據驗證指向的列。 它的工作原理但問題是,只要輸入一個值,它就會變為無效並拋出一個看起來不專業的錯誤。
我還嘗試了一個onEdit函數,不斷用選項列表更新單元格驗證:
function onEdit(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet 1");
var original = sheet.getRange(7,8,20,1).getValues(); /list of cells for data validation to be added
var option = new Array();
dvSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Drop Downs");
option = dvSheet.getRange('G1:G250').getValues();
option.push(["dummy"])
var i
var dv = SpreadsheetApp.newDataValidation();
for(i=0;i<20;i++){
option[250][0] = original[i][0];
dv.setAllowInvalid(false);
// dv.setHelpText("Some help text here");
dv.requireValueInList(option, true);
sheet.getRange(i+7,8).setDataValidation(dv.build());
}
}
'Drop Downs'!G1:G250是從解決方案1生成的列表。代碼獲取此列表並將單元格的內容添加到該列表,然后將列表設置為數據驗證。
這又有效,但更新驗證列表有一個延遲,這意味着如果用戶足夠快,他們可以添加多個相同的值。
我想到的另一個選擇是將每個單元格指向由解決方案1組成的唯一列,並將該單元格的內容添加到最后。 但我並不熱衷於為每個單獨的單元格制作列,因為會有很多(超過代碼中隱含的20個)。
更棒的是,如果谷歌允許你在數據驗證中組合范圍,那么我可以將解決方案1中的列與當前單元格結合起來。 但據我所知,它沒有。
誰能想到別的什么? 我的感覺是,我要么過於復雜,而且有一個簡單的解決方案 - 或者我太挑剔了。
對於其他在未來遇到這種情況的人:
根據TheMaster的建議,我編寫了一個onEdit函數,該函數從完整單元格中刪除驗證並向空單元格添加驗證:
function onEdit(){
var spreadsheet = SpreadsheetApp.getActive();
var i
var j
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet 1");
var original = sheet.getRange(7,8,20,1).getValues();
var emptyarray = new Array();
var fullarray = new Array();
for (i=0;i<20;i++){
if (original[i][0] === ""){
emptyarray.push(i);
}
else {
fullarray.push(i);
}
}
for each(i in fullarray){
j=Number(i)+7
sheet.getRange('H'+j).clearDataValidations()
}
for each(i in emptyarray){
j=Number(i)+7
sheet.getRange('\'Sheet 1\'!H'+j).setDataValidation(SpreadsheetApp.newDataValidation()
.setAllowInvalid(true)
.requireValueInRange(spreadsheet.getRange('\'Drop Downs\'!$G:$G'), true)
.build());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.