簡體   English   中英

Google表格 - 數據驗證 - 從下拉列表中強制唯一性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM