代码之家  ›  专栏  ›  技术社区  ›  HSHO

使用GETBACKGROUNDCOLOR,但速度很慢

  •  0
  • HSHO  · 技术社区  · 4 年前

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

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

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

    =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();
    
    
    }
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Tanaike    4 年前

    我相信你的目标如下。

    • 您希望通过以下公式降低实现结果的过程成本: =IF($B2<>"",IF(GETBACKGROUNDCOLOR(cell("address", Data!P3)) = "#f4cccc", "MISSING",IF(Data!P3="P","Pending","")),"") .
    • 当 Data 床单换了。

    在本例中,下面的示例脚本如何?

    示例脚本:

    请将以下脚本复制粘贴到脚本编辑器并保存。而且,在使用示例电子表格时,请使用 =SAMPLE(Data!P3:AM,"Data!P3:AM",B2:B) 到“公式”表的“G2”单元格。通过这个,值被输入。

    在这个示例脚本中,的3个参数 Data!P3:AM,"Data!P3:AM",B2:B 都用过了。它们被用作“数据”的单元格值、检索背景颜色的范围和“公式”的单元格值。 Data!P3:AM 和 B2: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 "";
      }));
    }
    

    结果:

    将此脚本用于示例电子表格时,将获得以下结果。

    enter image description here

    注:

    • 在这个示例脚本中,自定义函数是 .以及 数据P3:AM,“数据!P3:AM”,B2:B .第二个参数是字符串类型。请小心点。
    • 当我使用您的示例电子表格测试我建议的脚本时,结果值很快就会显示出来。但我不确定你的实际情况。当处理速度不快时,请重新打开电子表格并再次测试。
    • 此示例脚本适用于您的示例电子表格。当实际电子表格与示例电子表格不同时,可能无法使用脚本。请小心这个。

    参考:

        2
  •  1
  •   kishkin Toughy    4 年前

    你可以稍微改变一下你的功能(注意 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,
          )
      )
    )
    

    这两个步骤都将显著提高性能。

    看到了吗 阵列解决方案 在你的电子表格样本中。