我正在尝试搜索条件格式规则中的所有公式。我有这个功能(我知道,太大了,我只是想让它发挥作用):
async function SearchInFormatConditions(
context,
wb: Excel.Workbook,
sht: Excel.Worksheet,
searchString: string,
matchComplete: boolean,
matchCase: boolean
) {
let foundRules = new foundCollection();
let rng = sht.getUsedRange();
let cfRules = rng.conditionalFormats;
let cfCt = cfRules.getCount();
await context.sync();
for (let i = 0; i < cfCt.value; i++) {
let cf = cfRules.getItemAt(i);
let cfRange = cf.getRange().load("address");
let customcfRule = cf.customOrNullObject;
let cellValueRule = cf.cellValueOrNullObject;
await context.sync();
if (cellValueRule) {
cellValueRule.load();
await context.sync();
let ruleFormula1;
let ruleFormula2;
try {
ruleFormula1 = cellValueRule.rule.formula1;
} catch {
ruleFormula1 = "";
}
try {
ruleFormula2 = cellValueRule.rule.formula2;
} catch {
ruleFormula2 = "";
}
if (ruleFormula1 + "|" + ruleFormula2 !== "|") {
if (Instr(ruleFormula1, searchString, matchCase, matchComplete)) {
foundRules.newFoundItem(
"formatCondition formula 1",
ruleFormula1,
"formatCondition formula 1 in " + cfRange.address,
sht,
cfRange,
ruleFormula1
);
}
if (ruleFormula2.length > 0) {
if (Instr(ruleFormula2, searchString, matchCase, matchComplete)) {
foundRules.newFoundItem(
"formatCondition formula 2",
ruleFormula2,
"formatCondition formula 2 in " + cfRange.address,
sht,
cfRange,
ruleFormula2
);
}
}
}
if (customcfRule && ruleFormula1 + "|" + ruleFormula2 == "|") {
let cfRule = customcfRule.rule;
cfRule.load();
await context.sync();
try {
let cfRuleFormula = cfRule.formula;
} catch {
let cfRuleFormula = null;
}
if (cfRule.formula) {
if (Instr(cfRule.formula, searchString, matchCase, matchComplete)) {
foundRules.newFoundItem(
"formatCondition formula",
cfRule.formula,
"formatCondition formula in " + cfRange.address,
sht,
cfRange,
cfRule.formula
);
}
} else {
let colorScaleCF = cf.colorScaleOrNullObject;
await context.sync();
if (colorScaleCF) {
colorScaleCF.load();
await context.sync();
console.log("colorscale " + cfRange.address);
let min = null;
let max = null;
try {
let max = colorScaleCF.criteria.maximum.formula;
} catch {
}
try {
let min = colorScaleCF.criteria.minimum.formula;
} catch {
}
if (min) {
if (min.formula.length > 0) {
if (Instr(min.formula, searchString, matchCase, matchComplete)) {
foundRules.newFoundItem(
"formatCondition min formula",
min.formula,
"formatCondition min formula in " + cfRange.address,
sht,
cfRange,
min.formula
);
}
}
}
if (max) {
if (max.formula.length > 0) {
if (Instr(max.formula, searchString, matchCase, matchComplete)) {
foundRules.newFoundItem(
"formatCondition max formula",
max.formula,
"formatCondition max formula in " + cfRange.address,
sht,
cfRange,
max.formula
);
}
}
}
// console.log(min.formula + "|" + max.formula);
}
}
}
}
}
return foundRules;
}
当代码到达这里时:
let colorScaleCF = cf.colorScaleOrNullObject;
await context.sync();
if (colorScaleCF) {
即使所讨论的范围没有设置色标 CF 规则(它有数据栏规则!),语句 if (colorScaleCF) 也会产生 True。
此外,当范围确实有色标规则时,代码无法读取 colorScaleCF.criteria.maximum.formula。
我在这里做错了什么?
colorScaleCF 是一个代理对象,一旦将其设置为 cf.colorScaleOrNullObject,它将始终被定义。
您应该使用 if (!colorScaleCF.isNullObject) {...} 进行测试,而不是使用 if (colorScaleCF) {...} 进行测试。