【问题标题】:Google Sheets - Data Validation - Forcing Uniqueness from a drop down listGoogle 表格 - 数据验证 - 从下拉列表中强制唯一性
【发布时间】:2019-05-03 09:54:55
【问题描述】:

我在谷歌表格中有一个列,用户需要从下拉列表中选择项目列表,但列中的每个值都必须是唯一的。

我已经找到了几种方法,但都没有那么好。

首先,我尝试使用此解决方案 - 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 中的列与当前单元格合并。但据我所知没有。

谁能想到别的?我的感觉是我要么把它复杂化了,有一个简单的解决方案——要么我太挑剔了。

【问题讨论】:

  • that as soon as you enter a value it becomes invalid and throws an error which doesn't look professional. 为什么不使用 onEdit() 删除以前的数据验证?
  • 谢谢!这是一个很好的解决方案。

标签: google-apps-script google-sheets


【解决方案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());
      }
}

【讨论】:

    猜你喜欢
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多