Google Apps 脚本:如何获取 sheet 中的条件格式规则,包括每个规则的值

Google Apps Script: How to get the conditional format rules in a sheet, including the values for each rule

我似乎无法弄清楚如何获取 sheet 中的所有条件格式,尤其是获取在条件内设置的值。

我有一个 sheet,其中有一列数量。每个数量都有一个唯一的条件格式值集,这样,如果单元格中的数量值低于此阈值(在条件格式中设置),则单元格的背景变为红色。

一切正常。

问题是我需要通过条件格式访问为每个单元格设置的唯一阈值。

我尝试了很多不同的变体 var rules = sheet.getConditionalFormatRules(), 等等然后遍历这些规则只得到奇怪的 Logger.log 结果,看起来像这样:

com.google.apps.maestro.server.beans.trix.impl.ConditionalFormatRuleApiAdapter@17521c6a

完全遵循以下文档但也失败了:

https://developers.google.com/apps-script/reference/spreadsheet/conditional-format-rule#getBooleanCondition()

https://developers.google.com/apps-script/reference/spreadsheet/boolean-condition

编辑:我知道该行是您的日志结果...

它看起来像这样,因为它是一个对象,当您尝试在没有 A1Notation() 的情况下记录范围时,它也会这样做。这只是意味着您没有使用 returns 数组或值的方法。

根据您 link 的文档,getCriteriaValues() method 应该可以满足您的需要。像这样为我工作:

function findThresholds() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();;
  var formats = sheet.getConditionalFormatRules();
  var thresholds = [];
  formats.forEach(function(format, i) {
    var booleanCondition = format.getBooleanCondition();
    if (booleanCondition) {
      var threshold = booleanCondition.getCriteriaValues();
      thresholds.push(threshold[0]) //if you have more than one value per contional format, omit [0]
    }
  });
  return thresholds

这会将它们推入一个数组,但您也可以直接对它们进行操作。

编辑 2:因为知道阈值在哪一行是相关的: 对于每种格式,您都可以使用 .getRanges() 方法。然后,在每个范围上,您将使用 .getRow() 来了解该范围从哪一行开始。如果该范围超过一行高,您将需要 getValues(),以便能够通过将行的索引值添加到您之前获得的起始行来计算每一行。最后,您可以将该值作为键和阈值作为字典中的值推送,您将能够调用该行来获取您的阈值。

function findThresholds() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(<sheet name>);
  var formats = sheet.getConditionalFormatRules();
  var thresholds = {};
  formats.forEach(function(format) {
    var booleanCondition = format.getBooleanCondition();
    var ranges = format.getRanges();
    if (booleanCondition) {
      var threshold = booleanCondition.getCriteriaValues();
      ranges.forEach(function(range) {
        var rowStart = range.getRow();
        var rows = [];
        var vals = range.getValues(); //if every format only apply to one row, you may omit this part and just use 'rowStart' as 'row'
        for(var i = 0; i < vals.length; i++){
          var row = (rowStart+i);
          thresholds[row] = threshold[0]
        }
      });
    }
  });
  return thresholds
}