是否有更有效的公式来使用 ROW 函数应用条件格式?

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

我在我的 Google 表格 的主选项卡上使用带有条件格式的自定义公式,当条目是“4”、“✘”或在上部和下部之外时,它会将行 2:22 中的单元格变为红色通过检查“±”或“-”符号并应用为每个定义的适当限制,由第二个数据表上的变量为每一行定义的限制。

我的问题是,应用条件格式需要花费大量时间,因为我的实际工作表处于要处理数百列数据的位置。我想知道是否有更有效的公式可以提供相同的结果。这是我目前的公式:

=IF(NOT(ISBLANK(J2)),IF(OR(J2=4,J2="✘"),TRUE,IF(REGEXMATCH(INDIRECT("Data!$C"&ROW()),"±"),IF(OR(J2>$D2+REGEXEXTRACT(INDIRECT("Data!$C"&ROW()),".*\±(.*)"),J2<$D2-REGEXEXTRACT(INDIRECT("Data!$C"&ROW()),".*\±(.*)")),TRUE,FALSE), IF(REGEXMATCH(INDIRECT("Data!$C"&ROW()),"-"),IF(OR(J2>$D2+REGEXEXTRACT(INDIRECT("Data!$C"&ROW()),".*\+(.*)"),J2<$D2-REGEXEXTRACT(INDIRECT("Data!$C"&ROW()),".*\-(.*)")),TRUE,FALSE),FALSE))),FALSE)

此外,我正在尝试弄清楚如何使用 COUNTIF 实现另一个公式,让第 24 行中的每个单元格计算条件格式为每个相应列返回 TRUE 的次数,但我所能完成的就是让它看第一个范围内的单元格,可能是由于在我的公式中使用了 ROW 函数。

最好的方法是什么?

google-sheets google-sheets-formula conditional-formatting
1个回答
0
投票

来自以下回复,

我没有考虑过 Google Apps Script 的选项,因为我自己对公式更熟悉,但如果这有助于降低流程成本,我肯定有兴趣看看它有什么帮助。

而且,关于

My issue is that this is taking a considerable amount of time for the conditional formatting to apply, as my actual sheet is at the point where there are hundreds of columns of data to process.
,虽然我不确定您的实际电子表格,但为了降低流程成本,作为一个方向,使用 Google Apps 脚本而不是公式怎么样?

当您的公式转换为 Google Apps 脚本时,下面的示例脚本怎么样?

示例脚本:

请设置您的数据表名称和源表名称并保存脚本。

const dataSheetName = "DATA"; // Please set data sheet name.
const srcSheetName = "Sheet1"; // Please set source sheet name.

function sample() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const dataSheet = ss.getSheetByName(dataSheetName);
  const srcSheet = ss.getSheetByName(srcSheetName);
  const srcValues1 = srcSheet.getRange("D1:D" + srcSheet.getLastRow()).getValues();
  const dataValues = dataSheet.getRange("C1:C" + dataSheet.getLastRow()).getDisplayValues().map(([c], i) => {
    const t = Number(srcValues1[i][0]);
    if (c.includes("±")) {
      const v = Number(c.replace("±", ""));
      return [t - v, t + v];
    } else if (c.includes("+") || c.includes("-")) {
      const [p, m] = [c.match(/\+(.+)/), c.match(/\-(.+)/)].map(e => e ? Number(e[1]) : 0);
      return [t - m, t + p];
    }
    return null;
  });
  const range = srcSheet.getRange("J1:AA" + srcSheet.getLastRow());
  const currentColors = range.getBackgrounds();
  const colors = range.getValues().map((r, i) => {
    const t = dataValues[i];
    if (!t) {
      return r.map((c, j) => [4, "✘"].includes(c) ? "#ea9999" : (c.toString() ? "#b6d7a8" : currentColors[i][j]));
    }
    const [a, b] = t;
    return r.map((c, j) => !(c >= a && c <= b) ? "#ea9999" : (c.toString() ? "#b6d7a8" : currentColors[i][j]));
  });
  range.setBackgrounds(colors);
}
  • 当此脚本手动运行到您提供的电子表格时,我可以确认获得了与您的公式相同的情况。

  • 比如数据表和源表的编辑表要自动运行时,请添加如下脚本。这样,当编辑数据表和源表时,脚本会自动运行。在这种情况下,请不要直接运行

    onEdit
    功能。

    function onEdit(e) {
      const sheet = e.range.getSheet();
      if (![dataSheetName, srcSheetName].includes(sheet.getSheetName())) return;
      sample();
    }
    

注:

  • 此示例脚本适用于您提供的电子表格。更改电子表格时,可能无法使用此脚本。请注意这一点。

参考资料:

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