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

时间:2019-07-19 23:20:23

标签: google-apps-script google-sheets gs-conditional-formatting

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

我有一张带有数量列的工作表。每个数量都有一个唯一的条件格式设置值,这样,如果单元格中的数量值降至该阈值以下(在条件格式内设置),则该单元格的背景将变为红色。

一切正常。

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

我尝试了许多不同的变化 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

1 个答案:

答案 0 :(得分:1)

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

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

按照您链接的文档,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
}