Google 应用程序 Script/Google Sheet 错误? Copying/Re-Setup 引用命名范围的数据验证不适用于重复的 Sheets
Google Apps Script/Google Sheet Bug? Copying/Re-Setup Data Validation refering to named range does not work on duplicated Sheets
情况:
通过直接引用 (A1Notation) 对引用范围的单元格进行数据验证,对引用命名范围的其他单元格进行数据验证。
两者都适用。
复制 sheet 时,两者仍然有效。但是,当手动将数据验证重置为相同的范围或通过我的脚本时,数据验证通过命名范围引用的单元格的数据验证将不起作用,并且无法通过命名范围引用再次设置它手动或通过脚本复制 (.getDataValidation / .setDataValidation)。
查看示例 - 运行 脚本函数 cp_dataValidation() 在 Sheet1 和 Sheet1 的副本上作为活动 sheet。然后单击单元格中的数据验证下拉菜单。
最终,我的目标是通过脚本在复制的 sheet 上执行从一个范围到另一个范围的数据验证副本(指的是命名范围)。
function cp_dataValidation() {
var sheet = SpreadsheetApp.getActiveSheet()
//cell with data validation referring to a named range
var named_range_tmpl = sheet.getRange("B2");
//cell with data validation referring to a range via A1Notation
var range_tmpl = sheet.getRange("C2");
//target cells to copy dataValidation to
var nr_target = sheet.getRange("D2");
var r_target = sheet.getRange("E2");
nr_target.setDataValidation(named_range_tmpl.getDataValidation());
r_target.setDataValidation(range_tmpl.getDataValidation());
Logger.log(JSON.stringify(named_range_tmpl.getDataValidation(), null, 2));
Logger.log(JSON.stringify(range_tmpl.getDataValidation(), null, 2));
}
- 您想要复制包含命名范围作为值的数据验证。
如果我的理解是正确的,这个解决方法怎么样? nr_target.setDataValidation(named_range_tmpl.getDataValidation())
似乎不能用于其他 sheet 的命名范围。因此,作为解决方法,使用 copyTo()
?
的方法怎么样?
修改后的脚本:
var sheet = SpreadsheetApp.getActiveSheet();
var source = sheet.getRange("B2:C2");
var target = sheet.getRange("D2:E2");
source.copyTo(target, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION);
target.clearContent(); // or target.clear({contentsOnly: true}); // Added
注:
- 请测试两个 sheet 的脚本。
- 如果要同时复制值和数据验证,请使用
source.copyTo(target)
而不是 source.copyTo(target, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION)
。
参考:
情况: 通过直接引用 (A1Notation) 对引用范围的单元格进行数据验证,对引用命名范围的其他单元格进行数据验证。
两者都适用。
复制 sheet 时,两者仍然有效。但是,当手动将数据验证重置为相同的范围或通过我的脚本时,数据验证通过命名范围引用的单元格的数据验证将不起作用,并且无法通过命名范围引用再次设置它手动或通过脚本复制 (.getDataValidation / .setDataValidation)。
查看示例 - 运行 脚本函数 cp_dataValidation() 在 Sheet1 和 Sheet1 的副本上作为活动 sheet。然后单击单元格中的数据验证下拉菜单。
最终,我的目标是通过脚本在复制的 sheet 上执行从一个范围到另一个范围的数据验证副本(指的是命名范围)。
function cp_dataValidation() {
var sheet = SpreadsheetApp.getActiveSheet()
//cell with data validation referring to a named range
var named_range_tmpl = sheet.getRange("B2");
//cell with data validation referring to a range via A1Notation
var range_tmpl = sheet.getRange("C2");
//target cells to copy dataValidation to
var nr_target = sheet.getRange("D2");
var r_target = sheet.getRange("E2");
nr_target.setDataValidation(named_range_tmpl.getDataValidation());
r_target.setDataValidation(range_tmpl.getDataValidation());
Logger.log(JSON.stringify(named_range_tmpl.getDataValidation(), null, 2));
Logger.log(JSON.stringify(range_tmpl.getDataValidation(), null, 2));
}
- 您想要复制包含命名范围作为值的数据验证。
如果我的理解是正确的,这个解决方法怎么样? nr_target.setDataValidation(named_range_tmpl.getDataValidation())
似乎不能用于其他 sheet 的命名范围。因此,作为解决方法,使用 copyTo()
?
修改后的脚本:
var sheet = SpreadsheetApp.getActiveSheet();
var source = sheet.getRange("B2:C2");
var target = sheet.getRange("D2:E2");
source.copyTo(target, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION);
target.clearContent(); // or target.clear({contentsOnly: true}); // Added
注:
- 请测试两个 sheet 的脚本。
- 如果要同时复制值和数据验证,请使用
source.copyTo(target)
而不是source.copyTo(target, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION)
。