我有一张包含超过 100,000 个单元格(很快将超过 300,000 个单元格)的工作表,用作甘特图。每个单元格都有一个 IF 公式,如果相应列的标题(日期)位于行的开始日期和结束日期之间,则该公式返回字母 X。
但显着减慢工作表速度的是其背后的条件格式。条件格式表示如果单元格的值为 X,则将单元格的背景颜色和字体颜色更改为绿色。如果没有 X,则背景颜色应为白色。据我了解,由于条件格式在您对工作表进行任何编辑时都会重新计算,因此性能非常差。所以我的想法是删除条件格式并将其添加为脚本,并使用一个菜单按钮,我可以在需要运行时随时单击该按钮,而不是每次编辑工作表时都运行条件格式。
这是我得到的脚本,它不起作用。我已经尝试了几十种变体,但找不到有效的东西 - 有时我让它运行而没有错误,有时会出现错误。我的上下文是否有错误?
function formatting() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet 1");
var range = ss.getRange("A1:A100");
var cellValue = range.getValues();
if (cellValue === 'X') {
ss.range.setBackgroundColor('#000000'); }
else {
cellValue.setBackgroundColor('#ffffff'); }
}
最佳答案
这是使用批处理函数的方法Range.setBackgrounds() 。此函数采用二维值数组作为参数,允许您在单个 API 调用中设置某个范围的所有单元格背景。
另请注意函数 Range.getValues()返回值的二维数组。要检查每个单独的单元格值,您需要循环遍历数组。
由于您将二维数组同时作为输入和输出来处理,因此构建背景值输出数组的逻辑反射(reflect)了您需要用来检查当前单元格值的逻辑。因此,您可以在循环访问单元格值时构建背景值的二维数组。
function setCellBackgrounds() {
// The name of the sheet to process.
var sheetName = "Sheet1";
// The range of cells to inspect.
var range = "A1:Z100";
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var range = sheet.getRange(range);
var values = range.getValues();
var colors = [];
for (var x = 0; x < values.length; x++) {
colors[x] = [];
for (var y = 0; y < values[x].length; y++) {
if (values[x][y] == 'X') {
colors[x][y] = '#999999';
} else {
colors[x][y] = '#ffffff';
}
}
}
range.setBackgrounds(colors);
}
使用批处理函数,而不是重复调用非批处理版本,是a documented Apps Script best practice .
关于google-apps-script - Google Apps 脚本 - 表格 - 条件格式 - X = 突出显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50596018/