我有一张纸,显示了基于其他底纸的计算结果。手动进行更改,但是“摘要”表只是公式。这些变化出现在分散的细胞中,大部分是不连续的。
在衬纸中进行手动更改后,我想在摘要表中突出显示哪些单元格已更改。为此,我使用了第二个摘要表,该摘要表是主要摘要的副本。
最后一个要素是在编辑后运行的脚本。它遍历汇总范围并将值与第二个副本进行比较。任何差异都会在主摘要中突出显示,然后复制回第二个摘要。
我认为由于更新,此过程确实有效,但速度很慢。伪代码:
Syntax error: "(" unexpected
我认为无法批量更新分散的范围,这似乎是一个简单的解决方案。
我正在寻找通过脚本或使用其他策略来加快此过程的方法。
答案 0 :(得分:1)
根据每个官方"best practices,",您应该批量读取关联的单元格数据,而不是重复读取并可能写入值。该语句确实假设dst
中的设置值不会影响将来的读取。
因此,最简单的更改是在Range#getDisplayValues
和src
上使用dst
:
...
src.setBackground("white");
var srcValues = src.getDisplayValues();
var dstValues = dst.getDisplayValues();
srcValues.forEach(function (srcRow, r) {
var dstRow = dstValues[r];
srcRow.forEach(function (value, c) {
if (value !== dstRow[c]) {
dst.getCell(r + 1, c + 1).setValue(value);
src.getCell(r + 1, c + 1).setBackground("gray");
}
});
});
另一项优化是使用RangeList
类来批量更改。要使用create a RangeList
,您需要一个单元格/范围符号数组,可以使用R1C1或A1样式的寻址。 R1C1最容易计算。
...
var dstChanges = [];
var srcChanges = [];
...
if (value !== dstRow[c]) {
dstChanges.push({row: r + 1, col: c + 1, newValue: value});
srcChanges.push({row: r + 1, col: c + 1});
}
...
if (srcChanges.length > 0) {
var srcRow = src.getRow();
var dstRow = dst.getRow();
var srcCol = src.getColumn();
var dstCol = dst.getColumn();
copy.getRangeList(dstChanges.map(function (obj) {
return "R" + (obj.row + dstRow) + "C" + (obj.col + dstCol);
}).getRanges().forEach(function (rg, i) {
rg.setValue(dstChanges[i].newValue);
});
summary.getRangeList(srcChanges.map(function (obj) {
return "R" + (obj.row + srcRow) + "C" + (obj.col + srcCol);
}).setBackground("gray");
}
...
其他参考