我似乎无法弄清楚如何获取工作表中的所有条件格式,尤其是如何获取在条件内设置的值。
我有一张带有数量列的工作表。每个数量都有一个唯一的条件格式设置值,这样,如果单元格中的数量值降至该阈值以下(在条件格式内设置),则该单元格的背景将变为红色。
一切正常。
问题是我需要通过条件格式访问为每个单元格设置的唯一阈值。
我尝试了许多不同的变化
var rules = sheet.getConditionalFormatRules()
等,然后遍历这些规则,只会得到奇怪的Logger.log
结果,如下所示:
com.google.apps.maestro.server.beans.trix.impl.ConditionalFormatRuleApiAdapter@17521c6a
完全按照以下文档进行操作并失败:
https://developers.google.com/apps-script/reference/spreadsheet/boolean-condition
答案 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
}