使用 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","")),"")
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: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 "";
}));
}
结果:
当此脚本用于您的示例 Spreadsheet 时,将获得以下结果。
注:
- 在此示例脚本中,自定义函数为
=SAMPLE(Data!P3:AM,"Data!P3:AM",B2:B)
。并且,Data!P3:AM,"Data!P3:AM",B2:B
的参数。第二个参数是字符串类型。请注意这一点。
- 当我使用您的示例 Spreadsheet 测试我建议的脚本时,结果值很快就会显示出来。但是我不确定你的实际情况。当处理速度不快时,请重新打开Spreadsheet再测试
- 此示例脚本适用于您的示例 Spreadsheet。当您的实际 Spreadsheet 与示例 Spreadsheet 不同时,脚本可能无法使用。请注意这一点。
参考:
我正在使用这个函数在单元格中写入值。
例如,如果单元格具有特定颜色,则将值写入单元格,此函数速度较慢。有特定颜色的单元格有没有快速写入值的函数
还有一个问题是这些格式会根据条件格式规则发生变化,但是当它发生变化时,公式不会相应地更改值。它应该是动态的,它的单元格颜色变化然后公式必须观察。
我试过下面的功能,但是速度很慢。
=IF($B2<>"",IF(GETBACKGROUNDCOLOR(cell("address", Data!P3)) = "#f4cccc", "MISSING",IF(Data!P3="P","Pending","")),"")
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: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 "";
}));
}
结果:
当此脚本用于您的示例 Spreadsheet 时,将获得以下结果。
注:
- 在此示例脚本中,自定义函数为
=SAMPLE(Data!P3:AM,"Data!P3:AM",B2:B)
。并且,Data!P3:AM,"Data!P3:AM",B2:B
的参数。第二个参数是字符串类型。请注意这一点。 - 当我使用您的示例 Spreadsheet 测试我建议的脚本时,结果值很快就会显示出来。但是我不确定你的实际情况。当处理速度不快时,请重新打开Spreadsheet再测试
- 此示例脚本适用于您的示例 Spreadsheet。当您的实际 Spreadsheet 与示例 Spreadsheet 不同时,脚本可能无法使用。请注意这一点。