Попытка установитьBackgroundColor на основе ключевого слова в скрипте Google Apps

Я пытаюсь выделить строку в таблице на основе соответствующего ключевого слова. Однако мои попытки установить цвет фона моего диапазона ячеек не дали никаких цветов. Я использовал регистраторы внутри оператора if/else, и все они работали, поэтому я думаю, что я как-то делаю неправильно.

function statusHighlighter(){
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = ss.getActiveSheet();
  var sheetValues = ss.getDataRange().getValues();

  sheetValues.forEach(function(row, index) {
    var acctStatus = row[7];
    var highlightRange = sheetName.getRange(index+1, 1, 1, sheetName.getLastColumn());

    if (acctStatus === "Kept"){
      highlightRange.setBackgroundColor('##fffec4');
      Logger.log(acctStatus + " " + index);
    } else if (acctStatus === "Suspended"){
      highlightRange.setBackground('##cf4a4a');
    } else if (acctStatus === "Deleted"){
      highlightRange.setBackground('##6c75ad');
    }
  });
} 
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
106
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Объяснение / Проблемы:

В вашем коде есть одна проблема и несколько оптимизаций, которые я хотел бы предложить.

  • Шестнадцатеричные коды цветов должны содержать только один #, но вы используете два ##.

  • Вы многократно используете setBackground , но вместо этого вы можете создать массив с цветами внутри цикла forEach, а затем использовать setBackgrounds , чтобы установить цвета за один раз. Взгляните на лучшие практики, чтобы понять, почему.

  • Поскольку вас интересует конкретный столбец, имеет смысл рассмотреть только один столбец вместо полного dataRange. В следующем скрипте acctStatusVals учитывает только столбец 8. Я выбираю 8, потому что в вашем коде вы используете индекс массива для 7, который эквивалентен для столбца 8. Будьте осторожны с этим. В моем коде 8 означает столбец H. Отрегулируйте это в соответствии с вашими потребностями. Чтобы преобразовать 2D-массив в 1D, поскольку мы используем один столбец, вы можете использовать flat.

  • Я использую следующее выражение: Array(lastCol).fill('#6c75ad') создать массив из lastCol количества элементов (последний столбец с содержимым ) и заполнить одним и тем же значением, потому что цель состоит в том, чтобы окрасить всю строку одним и тем же значением цвета. .

Оптимизированное решение:

Будьте осторожны с активным листом. Убедитесь, что вы выбрали правильный лист, прежде чем запускать этот код. Я бы посоветовал вам использовать ss.getSheetByName('Sheet1');, но я оставлю это как комментарий, так как этот шаг не является обязательным.

function statusHighlighter(){ 
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetName = ss.getActiveSheet();
//  const sheetName = ss.getSheetByName('Sheet1'); // change to the name of your sheet
  const lastRow = sheetName.getLastRow();
  const lastCol = sheetName.getLastColumn();
  const acctStatusVals = sheetName.getRange(1,8,lastRow).getValues().flat();
  const colors = [];
  acctStatusVals.forEach(acctStatus=>{
   if (acctStatus === "Kept"){
      colors.push(Array(lastCol).fill('#fffec4'));
    } else if (acctStatus === "Suspended"){
      colors.push(Array(lastCol).fill('#cf4a4a'));
    } else if (acctStatus === "Deleted"){
      colors.push(Array(lastCol).fill('#6c75ad'));
    }                   
  });
  sheetName.getRange(1, 1, lastRow, lastCol).setBackgrounds(colors);
}

Лист, используемый для вышеуказанного скрипта:

Спасибо за этот ответ, было очень полезно увидеть лучшие практики кодирования в действии. Единственное изменение, которое я должен был сделать, это настроить lastRow на sheetName.getLastRow() - 1 и подтолкнуть sheetName.getRange(2, 1, lastRow, lastCol) для настройки строки заголовка. Еще раз спасибо за помощь!

Maason Kao 15.12.2020 18:41

Другие вопросы по теме