Я считаю, что ваша цель следующая.
- Вы хотите снизить стоимость процесса вашего скрипта.
Для этого, как насчет этого ответа?
Точки модификации:
В вашем скрипте getRange
, getValue
и setBackground
используются в l oop. Думаю, что в этом случае стоимость процесса скрипта будет высокой. Чтобы снизить стоимость вашего скрипта, я хотел бы предложить следующую схему. В этой модификации я изменил Step3
в вашем скрипте.
- Получить все значения из диапазона
E3:I121
. Используется - Создайте массив для размещения цветов с использованием полученных значений.
- В этом случае цвет, который вы хотите установить, используется из
dict_data
, созданного вами. И ячейки, у которых нет цветов, устанавливаются как null
. Таким образом, в вашем случае ssPlanner.getRange("I4:BU120").setBackground('#ffffff')
можно изменить на ssPlanner.getRange("I4:BU120").setBackground(null)
. getRange
, getValue
и setBackground
не используются.
- Установите цвета, используя созданный массив, включая цветовые коды. Используется
Когда указанный выше поток отражается в вашем скрипте, он становится следующим:
Измененный скрипт:
Когда ваш скрипт изменен, пожалуйста, измените следующее.
От:
//Step3:set background color for each row
for (var bRow=4; bRow<121; bRow++){
if (ssPlanner.getRange("E"+bRow).getValue()!=""){
var start = ssPlanner.getRange(bRow,7).getValue()-ssPlanner.getRange(3,9).getValue()+9;
var duration = ssPlanner.getRange(bRow,8).getValue();
ssPlanner.getRange(bRow,start,1,duration).setBackground(dict_data[ssPlanner.getRange(bRow,5).getValue()]);
}
}
Кому:
// Step3:set background color for each row
// 1. Retrieve all values from the range of `E3:I121`.
const values = ssPlanner.getRange("E3:I121").getValues();
const offset = values.shift()[4];
// 2. Create an array for putting the colors using the retrieved values.
const colors = values.reduce((ar, [e,f,g,h]) => {
let base = Array(65).fill(null);
if (e != "") Array.prototype.splice.apply(base, [g - offset, h].concat(Array(h).fill(dict_data[e][0])));
ar.push(base);
return ar;
}, []);
// 3. Set the colors using the created array including the color codes.
ssPlanner.getRange(4, 9, colors.length, colors[0].length).setBackgrounds(colors);
Ссылки: