Создание первого макроса 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"); // Вызываем функцию и указываем в аргументе имя листа куда мы копируем.


ссылка на оригинал статьи https://habr.com/ru/articles/836722/