使用Apps脚本创建使用命名范围的数据验证

时间:2018-12-03 20:07:54

标签: validation google-apps-script google-sheets named-ranges

代码如下:

  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不接受字符串。

有人知道如何让应用脚本使用数据验证规则中的实际命名范围吗?

2 个答案:

答案 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>

参考