使用 GETBACKGROUNDCOLOR 函数写入单元格 但是很慢

Using GETBACKGROUNDCOLOR function to write in cell But it is slow

我正在使用这个函数在单元格中写入值。

例如,如果单元格具有特定颜色,则将值写入单元格,此函数速度较慢。有特定颜色的单元格有没有快速写入值的函数

还有一个问题是这些格式会根据条件格式规则发生变化,但是当它发生变化时,公式不会相应地更改值。它应该是动态的,它的单元格颜色变化然后公式必须观察。

我试过下面的功能,但是速度很慢。

=IF($B2<>"",IF(GETBACKGROUNDCOLOR(cell("address", Data!P3)) = "#f4cccc", "MISSING",IF(Data!P3="P","Pending","")),"")

Sheet Link

function GETBACKGROUNDCOLOR(cell){
  return SpreadsheetApp.getActiveSheet().getRange(cell).getBackground();


}

您可以稍微更改函数(注意末尾的 s)以使用范围而不是单个单元格:

function GETBACKGROUNDCOLORS(range){
  return SpreadsheetApp.getActiveSheet().getRange(range).getBackgrounds();
}

然后使用ARRAYFORMULA:

=ARRAYFORMULA(
  IF(
    B2:B27 = "",,
      IFS(
        GETBACKGROUNDCOLORS("Data!P3:AM28") = "#f4cccc",
          "MISSING",
        Data!P3:AM28 = "P",
          "Pending",
        True,
      )
  )
)

这两个步骤都会显着提高性能。

请参阅您的样本传播数组解决方案 sheetsheet。

我相信你的目标如下。

  • 您想通过=IF($B2<>"",IF(GETBACKGROUNDCOLOR(cell("address", Data!P3)) = "#f4cccc", "MISSING",IF(Data!P3="P","Pending","")),"").
  • 这样的公式来降低实现结果情况的过程成本
  • Data sheet 的单元格值更改时,您需要动态更新值。

在这种情况下,下面的示例脚本怎么样?

示例脚本:

请将以下脚本复制并粘贴到脚本编辑器中并保存。并且,当您使用示例 Spreadsheet 时,请将自定义函数 =SAMPLE(Data!P3:AM,"Data!P3:AM",B2:B) 放入“公式”sheet 的单元格“G2”中。这样,值就被放入了。

在此示例脚本中,使用了 Data!P3:AM,"Data!P3:AM",B2:B 的 3 个参数。这些用作“数据”的单元格值、检索背景颜色的范围以及“公式”的单元格值。使用 Data!P3:AMB2:B。这样,当更改这些单元格时,将重新计算自定义函数。我以为这可能是你期望的结果。

function SAMPLE(srcValues, srcRange, dstValues) {
  const srcBackgrounds = SpreadsheetApp.getActiveSpreadsheet().getRange(srcRange).getBackgrounds();
  return srcValues.map((r, i) => r.map((c, j) => {
    if (dstValues[i][0] != "") {
      if (srcBackgrounds[i][j] == "#f4cccc") {
        return "MISSING";
      }
      return c == "P" ? "Pending" : "";
    }
    return "";
  }));
}

结果:

当此脚本用于您的示例 Spreadsheet 时,将获得以下结果。

注:

  • 在此示例脚本中,自定义函数为 =SAMPLE(Data!P3:AM,"Data!P3:AM",B2:B)。并且,Data!P3:AM,"Data!P3:AM",B2:B 的参数。第二个参数是字符串类型。请注意这一点。
  • 当我使用您的示例 Spreadsheet 测试我建议的脚本时,结果值很快就会显示出来。但是我不确定你的实际情况。当处理速度不快时,请重新打开Spreadsheet再测试
  • 此示例脚本适用于您的示例 Spreadsheet。当您的实际 Spreadsheet 与示例 Spreadsheet 不同时,脚本可能无法使用。请注意这一点。

参考: