代码如下:
var sheet = spreadsheet.getSheetByName("Timesheet");
sheet.getRange('B27').setDataValidation(SpreadsheetApp.newDataValidation()
.setAllowInvalid(false)
.requireValueInRange(spreadsheet.getRange('TaskItems'), true)
.build());
上面的代码成功地在单元格B27中创建了一个与命名范围“ TaskItems”匹配的数据验证下拉菜单。但是,应用程序脚本创建的数据验证规则将使用“ TaskItems”的实际地址C2:1300,而不是“ TaskItems”本身。因此,如果我将命名范围“ TaskItems”的地址更新为D2:1300,则我的数据验证规则将不再起作用,因为它们仍在使用C2:1300。
我可以在每个单元格上手动将数据验证规则设置为命名范围“ TaskItems”,即使“ TaskItems”发生更改,一切也可以正常工作。但是,我无法让Apps脚本在规则创建时使用规则中的实际命名范围,而不使用命名范围的地址。
我尝试用如下字符串替换范围对象:
var sheet = spreadsheet.getSheetByName("Timesheet");
sheet.getRange('B27').setDataValidation(SpreadsheetApp.newDataValidation()
.setAllowInvalid(false)
.requireValueInRange('TaskItems', true)
.build());
但是我收到一条错误消息,指出requireValueInRange不接受字符串。
有人知道如何让应用脚本使用数据验证规则中的实际命名范围吗?
答案 0 :(得分:1)
我遇到了完全相同的问题,很失望在这里找不到答案。奇怪的是,您无法通过脚本手动完成某些操作。
但是我只是想出一种解决方法。
手动将验证添加到引用您命名范围的某个单元格中。然后在脚本中,将验证从该单元格复制到所需的位置。复制的验证规则将使用命名范围的名称-符合要求。
这是我用来测试的脚本。
function setvalidation() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("TEST");
var vrule = sheet.getRange(1,1).getDataValidation();
// Previously, you would have set up the validation in cell A1
sheet.getRange(1,2).setDataValidation(vrule); // Copy the validation rule to cell A2
}
答案 1 :(得分:0)
数据验证以及其他Google表格功能(如条件格式)不适用于命名范围。
您正在尝试解决问题X,在这种情况下,要处理数据验证的范围参考中的值,并且您认为解决方案Y,在这种情况下,请使用命名范围会起作用,但是当您遇到麻烦时,您不会问X,而是问Y。
如果仅使用命名范围来处理范围引用中的值,则可以考虑更新数据验证规则,而不是更新命名范围引用。 / p>
参考