当输入街道名称时,我只想自动填充包含链接到特定街道的所有细分的点细分。 当街道名称输入到C栏时,D栏应该有一个只包含该街道的点数的下拉列表。 虽然我意识到这可以通过在“数据”选项卡中创建过滤器来实现,但我正在尝试创建一个不允许这样做的表单,因此需要编写脚本。
这是Google表格:
https://docs.google.com/spreadsheets/d/1QbTqPegE_GLj9V6x5uCNNXAoi0v12Pmaelhc7uaMknE/edit?usp=sharing
我已经编写了这段代码,但是我无法通过Street过滤。
function setDataValid_(range, sourceRange) {
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(sourceRange,
true).build();
range.setDataValidation(rule);
}
function onEdit() {
var aSheet = SpreadsheetApp.getActiveSheet();
var aCell = aSheet.getActiveCell();
var aColumn = aCell.getColumn();
if (aColumn == 3 && aSheet.getName() == 'Sheet1') {
var range = aSheet.getRange(aCell.getRow(), aColumn + 1);
var sourceRange = aSheet.getRange('Sheet1!B2:B5131');
setDataValid_(range, sourceRange)
}
}
非常感谢任何帮助。
答案 0 :(得分:0)
您已离婚,但您应该使用requireValueInList
代替requireValueInRange
。您正在传递sourceRange
,它等于点数所有。
要完成过滤,您需要查看所有街道值。如果街道值与选择匹配,则将相邻的点段保存到单独的列表中。保存所有这些点段后,将其传递给requireValueInList
。为此,您需要利用getValues()
将范围值作为array和loop通过它获取。
我做了一些其他修改:
onEdit
中,您应该使用an event object getPointSegments
删除了setDataValid_
函数,因为它使代码的可读性降低,在我看来,不值得成为自己的函数
function onEdit(event) {
var eventSheet = event.range.getSheet();
var eventCell = event.range;
var eventColumn = eventCell.getColumn();
var eventValue = eventCell.getValue();
if (eventColumn == 3 && eventSheet.getName() == "Sheet1" && eventValue != "") {
var pointRange = eventSheet.getRange(eventCell.getRow(), eventColumn + 1);
var pointSegments = getPointSegments_(eventSheet, eventValue);
var rule = SpreadsheetApp.newDataValidation().requireValueInList(pointSegments, true).build();
pointRange.setDataValidation(rule);
}
}
function getPointSegments_(sheet, selectedStreet) {
var streetsAndPoints = sheet.getRange("A2:B").getValues();
var pointSegments = [];
for (var i=0; i<streetsAndPoints.length; i++) {
var street = streetsAndPoints[i][0];
var pointSegment = streetsAndPoints[i][1];
if (street === selectedStreet)
pointSegments.push(pointSegment);
}
return pointSegments;
}
最后,请确保您在街道字段中的数据验证看起来像这样(我实际上建议对无效数据“拒绝输入”)。