Условное форматирование сценария приложения на нескольких листах

Я использую этот скрипт приложения для применения условного форматирования на одном листе.

Я хотел бы применить это условное форматирование к нескольким листам. Я изо всех сил стараюсь найти способ, подобный этой строке ниже, где я бы добавил имя листа, и условное форматирование начнет работать на тех листах, которые были добавлены в код.

Ваша помощь будет принята с благодарностью.

что-то вроде этого

["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)
 }

person Strenuous    schedule 10.02.2021    source источник
comment
Вы хотите скопировать формат или правила условного форматирования? Поскольку ваш код пытается скопировать только цвета фона (формат)   -  person soMario    schedule 10.02.2021
comment
Да, цвет формата, если все листы Range (C1: AG) имеют это значение L, тогда он должен вставить формат, как это делает приведенный выше код.   -  person Strenuous    schedule 10.02.2021
comment
Привет, @Strenous, твоя проблема решена? Если нет, не могли бы вы предоставить более подробную информацию об использовании триггера onEdit?   -  person ale13    schedule 10.02.2021


Ответы (1)


Объяснение:

Ваша цель — применить определенное условное форматирование к выбранным листам.

Я считаю, что построение условного форматирования для каждого листа будет быстрее, чем перебор каждой ячейки для каждого листа, чтобы проверить значение L, а затем установить цвет фона этой ячейки. Также этот подход не будет динамическим, потому что вы меняете формат, а не условное форматирование. А именно, если вы измените L на что-то другое, например. M формат ячейки останется, пока вы снова не запустите скрипт.

Идея следующего сценария заключается в использовании ConditionalFormatRuleBuilder класс и шаги:

  • Правило такое: если значение ячейки равно L, то применяется цвет #ea9999.

  • forEach в проверке документа если имя включено в выбранный массив имен листов 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);
       }})                   
}
person soMario    schedule 10.02.2021
comment
Вы имеете в виду, что я должен использовать условное форматирование для каждого листа отдельно, чтобы сделать его быстрее. - person Strenuous; 10.02.2021
comment
@Strenuous Рад, что ваша проблема была решена. Немного улучшил мое объяснение. - person soMario; 10.02.2021
comment
@ Да, ты как всегда оказался полезным. - person Strenuous; 10.02.2021
comment
Да, @Marios, вы были правы, это очень медленно, есть ли способ сделать это с помощью встроенной функции условного форматирования, используя одну формулу, указав имя каждого листа. - person Strenuous; 10.02.2021
comment
Диапазон (C1:AG), затем текст ровно L, затем формат на этих листах [январь, февраль, март, апрель, май, июнь, июль, август, сентябрь, октябрь, ноябрь, декабрь] - person Strenuous; 10.02.2021
comment
@Strenuous, да, добавьте эти имена листов в sheetsNames и попробуйте. Он должен работать. - person soMario; 10.02.2021
comment
Да, я сделал, и мне потребовалось около 8 минут, чтобы выполнить эту функцию, проблема в том, что когда я добавляю триггер при редактировании, и всякий раз, когда я добавляю что-либо на лист, это занимает 8 минут каждый раз. - person Strenuous; 10.02.2021
comment
@Strenuous, зачем вам выполнять этот код с помощью триггера onEdit? правило условного форматирования будет действовать вечно, если вы не будете менять его каждый раз. Какова цель триггера onEdit? - person soMario; 10.02.2021
comment
Хорошо, я не знал, что он будет работать автоматически, я имею в виду без триггера. Если это произойдет, я не буду использовать триггер - person Strenuous; 10.02.2021
comment
@Strenuous Я изменил код, чтобы применить условное форматирование к нижней части каждого листа (полный диапазон листов C1:AG). Как только условное форматирование установлено, оно останется там навсегда, пока вы его не удалите или не измените. Поэтому нет необходимости обновлять его с помощью триггера onEdit. - person soMario; 10.02.2021