【问题标题】:App Script Conditional Formatting on multiple Sheets多个工作表上的应用脚本条件格式
【发布时间】:2021-02-10 10:23:29
【问题描述】:

我一直在使用此应用脚本在单张纸上应用条件格式。

我想将此条件格式应用于多张工作表。我正在努力找到一种像下面这样的方法,我将在其中添加工作表名称,条件格式将开始处理已添加到代码中的工作表。

我们将不胜感激。

类似的东西

["Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6", "Sheet7"];


function formatting() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Dec');
  const range = sheet.getRange("C1:AG"+sheet.getLastRow());
  const values = range.getValues();
  const bcolors = range.getBackgrounds();
  const new_bcolors = values.map((r,i)=>r.map((c,j)=>c=='L'?'#ea9999':bcolors[i][j]))
  range.setBackgrounds(new_bcolors)
 }

【问题讨论】:

  • 您要复制格式还是条件格式规则?因为您的代码尝试仅复制背景颜色(格式)
  • 是格式颜色,如果所有工作表 Range("C1:AG") 的值都为“L”,那么它应该像上面的代码一样粘贴格式。
  • 嘿@Strenous,你的问题解决了吗?如果没有 - 您介意提供更多有关使用 onEdit 触发器的详细信息吗?

标签: google-apps-script google-sheets


【解决方案1】:

解释:

您的目标是在选定的工作表上应用特定的条件格式。

我相信,为每个工作表构建条件格式会比为每个工作表遍历每个单元格以检查值“L”然后设置该单元格的背景颜色更快。此外,这种方法不会是动态的,因为您更改了格式,而不是条件格式。即,如果您将“L”更改为其他内容,例如"M" 单元格格式将一直保留,直到您再次运行脚本。

以下脚本的思路是使用ConditionalFormatRuleBuilder类,步骤如下:

  • 规则是:如果单元格的值等于“L”,则应用颜色#ea9999

  • forEach 文档中的工作表检查名称是否为 included 在所选工作表名称数组sheetsNames 中。

  • 如果是,则构造以下条件格式:

    SpreadsheetApp.newConditionalFormatRule()
                 .whenTextEqualTo("L")
                 .setBackground("#ea9999")
                 .setRanges([range])
                 .build();
    

解决方案:

function copyConditional(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetsNames = ["Sheet1", "Sheet2", "Sheet3", "Sheet4", 
                       "Sheet5", "Sheet6", "Sheet7"];
  const sheets = ss.getSheets();
  sheets.forEach(sh=>{
       if (sheetsNames.includes(sh.getName())){
           console.log(sh.getName())
           let range = sh.getRange("C1:AG"+sh.getMaxRows());  
           let rule = SpreadsheetApp.newConditionalFormatRule()
                   .whenTextEqualTo("L")
                   .setBackground("#ea9999")
                   .setRanges([range])
                   .build();
           let rules = sh.getConditionalFormatRules();
           rules.push(rule);
           sh.setConditionalFormatRules(rules);
       }})                   
}

【讨论】:

  • 你的意思是我应该分别为每张纸使用条件格式以使其更快。
  • @Strenuous 很高兴您的问题已解决。稍微改进了我的解释。
  • @是的,事实证明你总是乐于助人。
  • 是的@Marios,你是对的,它非常慢有没有办法通过使用单个公式的内置条件格式功能通过提及每个工作表名称来完成此操作。
  • @Strenuous 是的,将这些工作表名称添加到 sheetsNames 并尝试一下。它应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
相关资源
最近更新 更多