google-apps-script - Google Apps 脚本 - 表格 - 条件格式 - X = 突出显示

标签 google-apps-script google-sheets gs-conditional-formatting

我有一张包含超过 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/

相关文章:

json - Google App 脚本 - 使用列标题作为 JSON 键/值对中的名称

javascript - 使用谷歌应用程序脚本连接动态列

javascript - 使用谷歌工作表脚本在列中查找空单元格

github - 如何最好地开发 Google Sheets 脚本和 Git 版本控制

google-apps-script - 使用 TextFinder 搜索范围比搜索整个工作表慢

sorting - Google 电子表格,如何在整个工作表中搜索相同的匹配项并返回位于它们右侧的值?

google-sheets - 根据另一个单元格值更改单元格的颜色

google-apps-script - 使用 Google Apps 脚本将图像从云端硬盘插入电子表格单元格

google-sheets - 根据 Google 电子表格上的日期切换行背景

c# - .NET 客户端中 Google 表格中的条件格式请求