使用Google Apps脚本更新数据验证规则时如何保留原始范围

时间:2018-07-06 01:00:48

标签: google-apps-script google-sheets

我正在尝试编写一个Google Apps脚本来更新现有的数据验证规则,以切换“在单元格中显示下拉列表”选项。我主要使用它,它确实更改了“在单元格中显示下拉列表”选项,但是它没有保留原始条件范围,该范围在另一张纸上。似乎正在更改范围以使用验证规则所来自的工作表,而不是其他工作表。原始数据验证需要一个Sheet2!A2:A范围内的值,但是当我运行以下脚本时,它将变为需要一个Base!A2:A范围内的值。

function turnOffDropDown()  {
    var baseSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Base");
    var templateRange = baseSheet.getRange("B2");
    var rule = templateRange.getDataValidation();
    var criteria = rule.getCriteriaType();
    var args = rule.getCriteriaValues();
    args[1] = false;
    var newRule = rule.copy().withCriteria(criteria, args).build();
    templateRange.setDataValidation(newRule);
}

我做错了什么,它没有保留原始范围,是否有办法在Sheet2上指定我想要的范围,还是有其他方式来更新“在单元格中显示下拉列表”选项? / p>

1 个答案:

答案 0 :(得分:0)

这似乎是一个错误,应该报告here。我已经尝试了您的方法并明确定义了范围,但是在保持指定单元格的同时,它始终将标准 sheet 替换为正在应用验证的表单。 (例如,验证已应用于Worksheet!C1,因此CriteriaValues!A1:10变为Worksheet!A1:10。)

作为一种解决方法,鉴于您可能不会更改条件类型,因此可以尝试使用requireValueInRange()来创建新的验证。我已经修改了您的代码,以创建“切换下拉菜单”选项。这确实会保持正确的范围。

function toggleDropDown()  {
  var baseSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Base");
  var templateRange = baseSheet.getRange("B1");
  var rule = templateRange.getDataValidation();
  var args = rule.getCriteriaValues();
  rule = SpreadsheetApp.newDataValidation().requireValueInRange(args[0], !args[1]).build();
  templateRange.setDataValidation(rule);
}