Перейти к основному содержимому

Оформление и структура листа

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

Цвет, шрифт и выравнивание​

Команды оформления возвращают тот же диапазон, поэтому их можно писать цепочкой:

sheet.getRange("A1:G1")
.setBackground("#fff2cc")
.setFontWeight("bold")
.setFontSize(12)
.setHorizontalAlignment("center");
КомандаЗначения
setBackground(цвет), setFontColor(цвет)"#rrggbb", "#rgb", "rgb(255, 242, 204)", "red"; null убирает заливку
setFontWeight"bold", "normal"
setFontStyle"italic", "normal"
setFontLine"underline", "line-through", "none"
setFontSizeот 1 до 400
setFontFamilyArial, Roboto, Open Sans, Noto Sans, Times New Roman, PT Sans, PT Serif, PT Astra Sans, PT Astra Serif, PT Root UI, PT Mono
setHorizontalAlignment"left", "center", "right", "normal"
setVerticalAlignment"top", "middle", "bottom"
setWraptrue переносит по словам, false отключает перенос
Оформляйте диапазон целиком

Один вызов на весь диапазон вместо вызова на каждую ячейку. За запуск можно сделать до 300 вызовов оформления, один вызов обрабатывает до 20 000 ячеек. Диапазон до конца листа ("D2:D") считается по всем строкам листа.

Числовые форматы​

sheet.getRange("D2:D").setNumberFormat("#,##0.00 ₽");
sheet.getRange("E2:E").setNumberFormat("dd.mm.yyyy");
ФорматПример отображения
"#,##0.00"1 234,50
"0%"15%
"#,##0.00 ₽"1 234,50 ₽
"dd.mm.yyyy"05.10.2026
"@"значение как текст

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

Скопировать оформление готовой строки на другие: sheet.getRange("A2:G2").copyFormatTo(sheet.getRange("A3:G50")) (шрифт, цвета, выравнивание и числовой формат, до 5000 ячеек за вызов).

Границы​

// верх, лево, низ, право, внутренние вертикальные, внутренние горизонтальные, цвет, стиль
sheet.getRange("A1:G20").setBorder(true, true, true, true, true, true, "#999999", "solid");

true рисует линию, false убирает, null не трогает. Стили: "solid", "dotted", "dashed", "solid_medium", "solid_thick".

Примечания​

sheet.getRange("B2").setNote("Обновлено из CRM");
sheet.getRange("C2:C3").setNotes([["нет ИНН"], [""]]); // пустая строка удаляет примечание
const note = sheet.getRange("B2").getNote();

Объединение ячеек​

sheet.getRange("A1:G1").merge(); // в одну ячейку
sheet.getRange("A2:C5").mergeAcross(); // отдельно в каждой строке
sheet.getRange("A1:G1").breakApart(); // снять объединение

При объединении остаётся значение первой непустой ячейки.

Подсветка по условию​

// числа больше 100 000 — зелёным
sheet.getRange("D2:D").setConditionalFormat({ greaterThan: 100000 }, { background: "#c6efce", bold: true });

// вся строка красным, если в столбце E «Не оплачен»
sheet.getRange("A2:G").setConditionalFormat({ formula: '=$E2="Не оплачен"' }, { background: "#ffc7ce" });

Условия: greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual, equalTo, notEqualTo, between: [от, до], textContains, textEquals, duplicates: true, unique: true, formula. Оформление: background, color, bold, italic, strike.

Правило действует и на значения, которые появятся позже. Повторный вызов с теми же параметрами второе правило не создаёт, поэтому скрипт можно запускать сколько угодно раз. sheet.getConditionalFormats() возвращает правила листа, clearConditionalFormats() удаляет их.

Сортировка​

sheet.getRange("A2:G200").sort({ column: 4, ascending: false }); // по столбцу D по убыванию
sheet.getRange("A2:G200").sort([{ column: 3 }, { column: 2, ascending: false }]);

Номер столбца считается на листе. Строку заголовков в диапазон не включайте. Диапазон с объединёнными ячейками или включённым фильтром отсортировать нельзя.

Фильтр​

const filter = sheet.getFilter() || sheet.getRange("A1:G200").createFilter();
filter.setColumnFilter(5, { values: ["Не оплачен"] });

Условия: values, hideValues, greaterThan, lessThan, between, notBetween, textContains, textNotContains, textStartsWith, textEndsWith, textEquals, empty, notEmpty и другие. Фильтр применяется один раз: строки, добавленные позже, условие само не скрывает. filter.remove() снимает фильтр.

Выпадающие списки и флажки​

sheet.getRange("E2:E200").setDataValidation({
list: ["Новый", "В работе", "Оплачен"],
colors: ["#FCE5CF", "#FFF2CC", "#DAEAD4"],
});
sheet.getRange("F2:F200").setDataValidation({ checkbox: true });
sheet.getRange("G2:G200").setDataValidation({ listFromRange: Coverse.table.getSheet("Справочник").getRange("A2:A50") });

Отмеченный флажок читается как true, пустой как false.

Сводная таблица​

const pivot = Coverse.table.insertPivotTable({
source: Coverse.table.getSheet("Заказы").getDataRange(),
rows: ["Менеджер"],
columns: ["Статус"],
values: [{ field: "Сумма", summarize: "sum" }],
name: "Сводная по менеджерам",
replace: true,
});
console.log(pivot.getDataRange().getDisplayValues());

Сводная создаётся на отдельном листе и считается сразу. replace: true пересчитывает сводную с тем же именем на её листе, поэтому скрипт можно запускать повторно. Доступны группировка дат (group: "month"), фильтры, вычисляемые поля и показатели sum, count, average, max, min и другие. Полное описание — во вкладке «Справка» редактора.

Диаграмма​

const sheet = Coverse.table.getSheet("Продажи");
sheet.getCharts().forEach((chart) => chart.remove());
sheet.insertChart({ type: "column", range: "A1:C13", title: "План и факт", position: "E2" });

Типы: column, bar, line, area, pie. Диаграмма хранит снимок данных: после записи новых значений вызовите chart.refresh(). На листе может быть до 20 диаграмм.

Закрепление, ширина и высота​

sheet.setFrozenRows(1); // закрепить строку заголовков
sheet.setColumnWidths(1, 3, 180); // ширина столбцов A–C, пиксели
sheet.setRowHeight(1, 32);

Защита​

sheet.protect({ name: "Отчёт закрыт", except: ["E2:E200"] }); // закрыть лист, кроме E2:E200
sheet.getRange("A1:G1").protect({ name: "Шапка" });
sheet.unprotect();

Менять защиту может только скрипт, созданный владельцем таблицы. Как защита действует на скрипты других участников — в статье Права и безопасность. Как защищать вручную: Защита данных в листах и диапазонах.

Что дальше​