【问题标题】:Use Apps Script to create data validation that uses a named range使用 Apps 脚本创建使用命名范围的数据验证
【发布时间】:2026-02-03 00:35:01
【问题描述】:

代码如下:

  var sheet = spreadsheet.getSheetByName("Timesheet");
  sheet.getRange('B27').setDataValidation(SpreadsheetApp.newDataValidation()
  .setAllowInvalid(false)
  .requireValueInRange(spreadsheet.getRange('TaskItems'), true)
  .build());

上面的代码成功地在单元格 B27 中创建了一个与命名范围“TaskItems”匹配的数据验证下拉菜单。但是,apps 脚本创建的数据验证规则使用的是“TaskItems”的实际地址,即 C2:1300,而不是“TaskItems”本身。因此,如果我将命名范围“TaskItems”的地址更新为 D2:1300,那么我的数据验证规则将不再有效,因为它们仍在使用 C2:1300。

我可以在每个单元格上手动将数据验证规则设置为命名范围“TaskItems”,即使“TaskItems”发生变化,一切都很好。但是,我无法让应用程序脚本使用规则中的实际命名范围,而不是创建规则时命名范围的地址。

我尝试用这样的字符串切换范围对象:

var sheet = spreadsheet.getSheetByName("Timesheet");
  sheet.getRange('B27').setDataValidation(SpreadsheetApp.newDataValidation()
  .setAllowInvalid(false)
  .requireValueInRange('TaskItems', true)
  .build());

但我收到一条错误消息,指出 requireValueInRange 不接受字符串。

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

【问题讨论】:

  • 你可能想把这个.requireValueInRange(spreadsheet.getRange('TaskItems'), true)改成这个.requireValueInRange(spreadsheet.getRangeByName('TaskItems'), true)
  • 我有时会让我的命名范围比需要的大一点,这样我就可以通过编程方式添加它们而无需更改范围大小。
  • 堆栈片段应仅用于可执行的 HTML/CSS/JavaScript
  • @Cooper,这是一个我没有考虑过的好主意。我今天早上尝试了它,但不幸的是它产生了相同的结果——它不是在规则中使用实际的命名范围,而是应用地址。我明白你的意思是让命名范围更大,以便可以通过编程方式扩展它们。我有时通过使用应用程序脚本在范围内插入行来实现这一点,以便它自动扩展引用。然而,在这里我希望使用命名范围。
  • 您可以尝试在每次更改“TaskItems”地址时清除旧验证并设置一个新验证

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


【解决方案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

}

【讨论】:

    【解决方案2】:

    数据验证以及条件格式等其他 Google 表格功能不适用于命名范围。

    您正在尝试解决问题 X,在这种情况下处理数据验证的 范围引用中的值,而您认为解决方案 Y,在这种情况下使用 命名范围会起作用,但是当你遇到麻烦时不要问X,而是问Y。

    如果您仅使用 命名范围 来处理范围引用中的值,那么与其更新 命名范围 引用,不如考虑更新数据验证规则。

    参考

    【讨论】:

    • 我知道这是旧的,但我想确保未来的读者知道数据验证确实适用于命名范围。如果您手动设置它们,那么它将保留命名范围。但如果你使用 GAS,它会解析到地址。