Создание первого макроса JavaScript для табличного редактора Р7 офис
Продолжаем публиковать выдержки из бесплатного курса по разработке в Р7 офис
Что такое макросы?
Макросы — это набор инструкций или команд, которые выполняются автоматически. Они позволяют автоматизировать рутинные задачи и упростить работу с программами. В контексте редактора макросов в Табличном редакторе Р7-Офис, макросы предоставляют возможность автоматически выполнять повторяющиеся операции, такие как форматирование, вставка текста или изменение структуры документа.
Макросы - это так же небольшие скрипты, которые используются для облегчения повседневной работы с различными типами документов. Макросы Р7 используют синтаксис JavaScript и нотацию скриптов API Р7 Document Builder.
Есть несколько причин, по которым Р7 использует JavaScript для макросов:
платформонезависимость,
простота использования,
безопасность, поскольку макросы не имеют доступа к системе. Они просто выполняются в том же окне, что и редакторы.
Ознакомление с редактором макросов
Редактор макросов предоставляет инструменты для создания, редактирования и запуска макросов. В нем вы можете записывать действия, которые хотите автоматизировать, и сохранять их в виде макросов.
Теперь, когда мы разобрались, что такое макросы, давайте перейдем к их более подробному изучению и созданию собственных макросов!
Задачи, решаемые с помощью макросов
Рассмотрим структуру таблицы и попробуем разобраться, как работать с объектами таблицы через макросы.
Структура таблицы
Таблица в Табличном редакторе Р7-Офис состоит из следующих элементов:
Ячейки: Основные элементы таблицы, в которых можно размещать текст, числа, формулы и другие данные.
Строки и столбцы: Строки – это горизонтальные ряды ячеек, а столбцы – вертикальные группы ячеек.
Заголовки строк и столбцов: Можно задавать заголовки для строк и столбцов таблицы.
Создание простых макросов
Теперь, когда вы знаете, как работают макросы, попробуйте написать свой собственный макрос. У нас есть таблица, и нам нужно раскрасить альтернативные строки таблицы (нечетные будут зелеными, а четные - красными). В таблице 200 строк и столбцы от A до S. Сделать это вручную займет много времени. Поэтому использование макросов будет лучшим решением для этой проблемы.Откройте редакторы Р7 и создайте новую таблицу.
Откройте вкладку Плагины и выберите Макросы.
Появится окно макросов.
Нажмите Новый.
Вам будет предложен базовый оберточный функционал, в который можно ввести необходимый код:
(function()
{
// ... ваш код здесь ...
})();
Давайте посмотрим в документации Builder.API, что нам нужно сделать для выполнения нашей задачи:
Пример 1
Сначала получим текущий рабочий лист с помощью метода GetActiveSheet:var oWorksheet = Api.GetActiveSheet();
Затем создадим цикл, который будет запускаться от первой до последней строки:for (var i = 1; i < 200; i += 2) {
}
Установим две переменные: одну для нечетных строк, вторую для четных строк:var rowOdd = i, rowEven = i + 1;
Раскрасим четные и нечетные строки в соответствующие цвета. Установим желаемые цвета, используя метод CreateColorFromRGB.
Получим диапазон ячеек с помощью метода GetRange и зададим цвет для нечетных строк:
oWorksheet.GetRange("A" + rowOdd + ":S" + rowOdd).SetFillColor(Api.CreateColorFromRGB(138, 181, 155));
То же самое для четных строк, но с другим цветом:
oWorksheet.GetRange("A" + rowEven + ":S" + rowEven).SetFillColor(Api.CreateColorFromRGB(216, 227, 220));
Соберем все вместе с полным кодом скрипта:
(function()
{
var oWorksheet = Api.GetActiveSheet();
for (var i = 1; i < 200; i += 2) {
var rowOdd = i, rowEven = i + 1;
oWorksheet.GetRange("A" + rowOdd + ":S" + rowOdd).SetFillColor(Api.CreateColorFromRGB(138, 181, 155));
oWorksheet.GetRange("A" + rowEven + ":S" + rowEven).SetFillColor(Api.CreateColorFromRGB(216, 227, 220));
}
})();
Пример 2
Форматирование ячеек: Применение шрифтов, цветов и других параметров к ячейкам.
(function()
{
var oWorksheet = Api.GetActiveSheet();
for (var i = 1; i < 5; i += 2) {
var rowOdd = i, rowEven = i + 1;
oWorksheet.GetRange("A" + rowOdd + ":S" + rowOdd).SetFillColor(Api.CreateColorFromRGB(138, 181, 155));
oWorksheet.GetRange("A" + rowEven + ":S" + rowEven).SetFillColor(Api.CreateColorFromRGB(216, 227, 220));
oWorksheet.GetRange("A3").SetFontColor(Api.CreateColorFromRGB(0, 255, 0));
}
})();
Отладка макросов в Р7
Для отладки макросов в Р7 выполните следующие шаги:
Откройте вкладку Плагины и нажмите Макросы.
Используйте команду отладчика 'debugger;' в своем скрипте:
debugger;
var oDocument = Api.GetDocument();
var oParagraph = oDocument.GetElement(0);
oParagraph.AddText("Hello world!");
Обратите внимание, что команда отладчика будет работать только если инструменты разработчика открыты. В противном случае браузер игнорирует её.
Команда debugger работает как точка останова и приостанавливает выполнение скрипта в точке, где эта команда вставлена.
Если вам нужно вывести определенные значения в консоль разработчика браузера, вы можете использовать метод console.log(). Передайте значение, которое вы хотите проверить, или строку сообщения в качестве аргумента этого метода и откройте консоль разработчика, нажав кнопку F12, чтобы увидеть результат:
console.log(123);
Подписка на событие
Для подписки на указанное событие и вызова функции обратного вызова при его наступлении используйте метод attachEvent.Например, чтобы подписаться на событие при клике на гиперссылку в документе, используйте следующие строки:
Api.attachEvent("asc_onHyperlinkClick", function(){
console.log("HYPERLINK!!!");
});
Когда вы нажмете на любую гиперссылку в документе, будет выполнено событие asc_onHyperlinkClick, и сообщение "HYPERLINK!!!" появится в консоли.
Привязка (назначение) макроса к объекту
В редакторе электронных таблиц вы можете назначить макрос графическому объекту:Щелкните правой кнопкой мыши по графическому объекту.
Создание сложных макросов
Изменение содержимого ячеек: Заполнение ячеек данными, вставка формул и текста.
Автоматическая настройка ширины столбцов и высоты строк.
(function()
{
const sheet = Api.GetActiveSheet(); // Получаем активный лист
sheet.GetRange("A1").SetValue("111");
sheet.GetRange("B1").SetValue("222222222");
sheet.GetRange("A1:B1").AutoFit(false,true);//(ширина,высота)
})();
Поиск и восстановление скрытых строк.
(function()
{
const rangeStr="A2:G10";
const sheet = Api.GetActiveSheet(); // Получаем активный лист
const range=sheet.GetRange(rangeStr);//Получаем диапазон
//Если диапазон приемлемый
if(range!==undefined&&range){
//ПОлучаем адрес диапазона в формате R1C1:R2C2 (R-row C-collumn)
const sAdress = sheet.GetRange(rangeStr).GetAddress(true, true, "xlR1C1", false);
const diapArr=sAdress.split(":");//Разбиваем диапазон на начальный и конечный
if(diapArr.length){
let rBegin=findRowNumber(diapArr[0]);//Ищем номер строки через встроенную функцию
let rEnd=findRowNumber(diapArr[1]);
//Если диапазоны строк определились верно
if(rBegin>=0&&rEnd>=0){
//Проходим по строкам и проверяем на признак скрытости
for(let i=1;i<=rEnd-rBegin;i++){
var row = range.GetRows(i);
if(row!==undefined&&row){
if(row.GetHidden())//Если строка скрыта, то откроем её
row.SetHidden(false);
}
}
}
}
}
})();
//Ищем номер строки в формате R1C1
function findRowNumber(strAdr){
let arrAdr=strAdr.split("C");//Ищем место, где начинается адрес столбца
if(arrAdr.length){
return Number(arrAdr[0].substring(1,arrAdr[0].length));
}
return -1;
}
Макрос копирования данных между таблицами.
//Требуемый диапазон уже должен быть выбран на листе источнике!
function copySelectedDataBetweenTables(nameSheet) {
const sourceSheet = Api.GetActiveSheet(); // Получаем активный лист с исходными данными
if(sourceSheet.GetName()!==nameSheet){
const targetSheet = Api.GetSheet(nameSheet);
// Выделите нужный диапазон ячеек в исходной таблице
const sourceRange = sourceSheet.GetSelection(); //
// Вставьте данные в целевую таблицу
if(sourceRange!==undefined&&sourceRange.GetCount()>0){
let nameRange=sourceRange.GetAddress(true, true, "xlA1", false);
nameRange=nameRange.replace("$","");
sourceRange.Copy(targetSheet.GetRange(nameRange));
}
}
}
copySelectedDataBetweenTables("Лист2"); // Вызываем функцию и указываем в аргументе имя листа куда мы копируем.