google-apps-script - 脚本:如何从指定单元格中检索条件格式规则并有选择地将它们重新应用于范围?
问题描述
在 Google 表格中,将剪切值粘贴到工作表中时,可能会破坏条件格式应用于该工作表中的单元格范围。我的工作表经常被同事编辑,它破坏了条件格式。我正在尝试创建一个脚本,该脚本在编辑时从工作表的每一列复制条件格式规则,然后将这些规则重新应用于粘贴到每一列中的任何单元格。
我是脚本新手,其中大部分内容是由一位乐于助人的用户在我之前提出的问题中编译的。
function onEdit(e) {
var range = e.range;
var column = range.getColumn();
var sheet = range.getSheet();
range.clearFormat();
//clears formatting just on data that is pasted into the sheet
//Get all Sheet rules and iterate through them
var rules = sheet.getConditionalFormatRules();
var newRules = [];
newRules = newRules.concat(rules);
for(var r = 0; r < rules.length; r++) {
var rule = rules[r];
//Get condition for each rule
var booleanCondition = rule.getBooleanCondition();
//Get the ranges to which each rule applies and iterate through
var ranges = rule.getRanges();
for (var i = 0; i < ranges.length; i++) {
var ruleColumn = ranges[i].getColumn();
//If condition isn't null and edited column is the same as the one in the range, add rule
if((ruleColumn == column) && (booleanCondition != null)) {
var newRule = SpreadsheetApp.newConditionalFormatRule()
.withCriteria(booleanCondition.getCriteriaType(), booleanCondition.getCriteriaValues())
.setBackground(booleanCondition.getBackground())
.setRanges([range])
.build();
newRules.push(newRule);
}
}
}
sheet.setConditionalFormatRules(newRules);
}
这将采用工作表中存在的条件格式规则并将它们重新应用到任何已编辑的范围,选择性地将规则仅应用到它们从中复制的列。唯一的问题是它会复制每列中的每条规则,包括同一规则的迭代。每次编辑工作表时,应用于已编辑单元格的规则数量呈指数增长,我害怕我的计算机即将爆炸。
有没有办法只从工作表的第一行中提取条件格式规则并将它们(按列)应用于编辑的范围?这将阻止我的规则永久扩散的问题,我将非常感谢。
解决方案
检索条件格式规则的唯一方法是使用 getConditionalFormatRules 函数 [1] 从工作表中检索所有规则。您可以获取每个规则范围的行并添加条件以过滤仅应用于第一行的条件。
function onEdit(e) {
var range = e.range;
var column = range.getColumn();
var sheet = range.getSheet();
range.clearFormat();
//clears formatting just on data that is pasted into the sheet
//Get all Sheet rules and iterate through them
var rules = sheet.getConditionalFormatRules();
var newRules = [];
newRules = newRules.concat(rules);
for(var r = 0; r < rules.length; r++) {
var rule = rules[r];
//Get condition for each rule
var booleanCondition = rule.getBooleanCondition();
//Get the ranges to which each rule applies and iterate through
var ranges = rule.getRanges();
for (var i = 0; i < ranges.length; i++) {
var ruleColumn = ranges[i].getColumn();
var ruleRow = ranges[i].getRow();
//If condition isn't null and edited column is the same as the one in the range, add rule
if((ruleColumn == column) && (ruleRow == 1) && (booleanCondition != null)) {
var newRule = SpreadsheetApp.newConditionalFormatRule()
.withCriteria(booleanCondition.getCriteriaType(), booleanCondition.getCriteriaValues())
.setBackground(booleanCondition.getBackground())
.setRanges([range])
.build();
newRules.push(newRule);
}
}
}
sheet.setConditionalFormatRules(newRules);
}
如果规则范围从第一行开始(即:'A1'、'A1:A4'、'D1:D10' 等),这将复制规则。
[1] https://developers.google.com/apps-script/reference/spreadsheet/sheet#getconditionalformatrules
推荐阅读
- typo3 - 更正输出包含分配类别的作业列表的问题
- kubernetes - 如何通过 ssh 隧道使用 kubectl 通过我的 kubernetes API 访问我的内部 ELB?
- java - 为不同的架构生成 APK - FFmpegMediaMetadataRetriever
- c# - 在 ASP.Net C# 中将大数据导出到 excel
- azure - Azure VM - 使用 Nginx 进行 DNS 配置
- ruby-on-rails - ActiveStorage 与 ActiveJob 和 Apartment gem 反序列化错误
- sql - 如何完全重置表
- ios - 如何安全地删除 indexPath 处的行
- makefile - make 不构建 vxl
- php - MySQL:按日期范围分组