Excel,色阶条件格式规则阅读公式

问题描述 投票:0回答:1

我正在尝试搜索条件格式规则中的所有公式。我有这个功能(我知道,太大了,我只是想让它发挥作用):

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。

我在这里做错了什么?

office-js
1个回答
1
投票

colorScaleCF 是一个代理对象,一旦将其设置为 cf.colorScaleOrNullObject,它将始终被定义。

您应该使用 if (!colorScaleCF.isNullObject) {...} 进行测试,而不是使用 if (colorScaleCF) {...} 进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.