google-apps-script - ConditionalFormatRuleBuilder 中的更改范围
问题描述
目标:更改 ConditionalFormatRuleBuilder.copy() 内的范围(工作表名称,而不是 a1Notation)
错误:条件格式规则不能引用不同的工作表。
我正在尝试使用(不是这样)解释的复制方法。有了副本,我知道我有我需要的新条件格式的所有论据。我唯一需要更改的是工作表名称。添加范围工作正常,但更改/清除我似乎无法弄清楚的范围。我找到了一个帖子,但我希望它更通用。如果您知道要使用的条件,则此示例很好。
在文档中还有一个 .build() 是我需要实现的选项吗?
主功能:
function copyFormattingToTargets() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
//const input = SpreadsheetApp.getUi().prompt("Copy formatting from:").getResponseText();
const input = 'Data';
const targets = ['Log','Test'];
const templateSheet = ss.getSheetByName(input);
const inputRules = templateSheet.getConditionalFormatRules();
const rules = convertRules(inputRules,targets);
targets.forEach(target => {
const sheet = ss.getSheetByName(target);
target.clearConditionalFormatRules();
target.setConditionalFormatRules(rules);
})
}
转换函数:
function convertRules(rules,sheetnames){
const output = [];
const ss = SpreadsheetApp.getActiveSpreadsheet();
sheetnames.forEach(sh => {
rules.forEach(rule => {
const copy = rule.copy();
const newRanges = [];
const oldRanges = copy.getRanges();
oldRanges.forEach(range => {
const buildRange = ss.getSheetByName(sh).getRange(range.getA1Notation());
newRanges.push(buildRange);
});
copy.setRanges(newRanges);
output.push(copy);
});
});
return output;
}
解决方案
当您使用ConditionalFormatRuleBuilder.copy()时,它将返回一个ConditionalFormatRuleBuilder类型的数据。
您需要使用ConditionalFormatRuleBuilder.build()根据您修改的范围生成ConditionalFormatRule可用于使用Sheet.setConditionalFormatRules()设置工作表的条件格式规则
示例代码:(将条件格式规则从 Sheet1 复制到 Sheet2 并通过添加列偏移量 2 来更改其范围)
function myFunction() {
var sourceSh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var targetSh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
var rules = sourceSh.getConditionalFormatRules();
var newRules = [];
rules.forEach((rule, index) => {
Logger.log("****rule****");
var ruleBuilder = rule.copy();
var ranges = ruleBuilder.getRanges();
ranges.forEach(range => {
Logger.log(range.getA1Notation());
})
//Select C1:C1000 as new range
var newRange = targetSh.getRange(1,index + 3,1000,1);
ruleBuilder.setRanges([newRange]);
Logger.log("****new range****");
var ranges = ruleBuilder.getRanges();
ranges.forEach(range => {
Logger.log(range.getA1Notation());
})
Logger.log("****build modified rule****");
var newRule = ruleBuilder.build();
newRules.push(newRule);
});
targetSh.setConditionalFormatRules(newRules);
}
输出:
表 1:
表2:
您的代码:
function convertRules(rules,sheetnames){
const output = [];
const ss = SpreadsheetApp.getActiveSpreadsheet();
sheetnames.forEach(sh => {
rules.forEach(rule => {
const copy = rule.copy();
const newRanges = [];
const oldRanges = copy.getRanges();
oldRanges.forEach(range => {
const buildRange = ss.getSheetByName(sh).getRange(range.getA1Notation());
newRanges.push(buildRange);
});
copy.setRanges(newRanges);
copy.build(); // Build conditional format rules based on modified range
output.push(copy);
});
});
return output;
}
推荐阅读
- javascript - 如何提高 highcharts scatter 3d 性能
- java - 如何在不使用 DB 工具的情况下检测 Java 应用程序中的连接泄漏/打开连接
- c# - 将数据从内部网格视图传递到主网格视图(gridview 模板中的gridview)ASP.net C#
- mongodb - 使用 mongoDB 推入嵌套对象数组
- android - 在Android中使用画布在自定义视图(按钮)中绘制进度动画
- spring-data-jpa - 可以在 JPA 方法中使用的多个 In 子句
- c# - 如何在没有 Canvas 的图像控件上绘制椭圆?
- c++ - 最小异或值:给定一个包含 N 个整数的整数数组 A,找出数组中具有最小异或值的整数对
- php - 在不重叠的情况下对集合中的值进行分组
- xamarin - 加载时禁用用户交互