Оформление и структура листа
Скрипт может оформлять листы так же, как это делается вручную в таблице. Все команды оформления работают только в таблице скрипта, в связанных таблицах они недоступны.
Цвет, шрифт и выравнивание
Команды оформления возвращают тот же диапазон, поэтому их можно писать цепочкой:
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 |
setFontFamily | Arial, 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" |
setWrap | true переносит по словам, 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();
Менять защиту может только скрипт, созданный владельцем таблицы. Как защита действует на скрипты других участников — в статье Права и безопасность. Как защищать вручную: Защита данных в листах и диапазонах.