【发布时间】: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