Создание первого макроса для Р7-Офис

На занятии вы узнаете:
Что такое макросы?

Макросы — это набор инструкций или команд, которые выполняются автоматически. Они позволяют автоматизировать рутинные задачи и упростить работу с программами. В контексте редактора макросов в Табличном редакторе Р7-Офис, макросы предоставляют возможность автоматически выполнять повторяющиеся операции, такие как форматирование, вставка текста или изменение структуры документа.

Макросы — это так же небольшие скрипты, которые используются для облегчения повседневной работы с различными типами документов. Макросы Р7 используют синтаксис JavaScript и нотацию скриптов API Р7 Document Builder.
Есть несколько причин, по которым Р7 использует JavaScript для макросов:
  • платформонезависимость,
  • простота использования,
  • безопасность, поскольку макросы не имеют доступа к системе. Они просто выполняются в том же окне, что и редакторы.
Ознакомление с редактором макросов

Редактор макросов предоставляет инструменты для создания, редактирования и запуска макросов. В нем вы можете записывать действия, которые хотите автоматизировать, и сохранять их в виде макросов.

Теперь, когда мы разобрались, что такое макросы, давайте перейдем к их более подробному изучению и созданию собственных макросов!
Задачи, решаемые с помощью макросов

Рассмотрим структуру таблицы и попробуем разобраться, как работать с объектами таблицы через макросы.
Структура таблицы

Таблица в Табличном редакторе Р7-Офис состоит из следующих элементов:
  • Ячейки: Основные элементы таблицы, в которых можно размещать текст, числа, формулы и другие данные.
  • Строки и столбцы: Строки – это горизонтальные ряды ячеек, а столбцы – вертикальные группы ячеек.
  • Заголовки строк и столбцов: Можно задавать заголовки для строк и столбцов таблицы.
  • Объединение ячеек: Важный аспект – объединение нескольких ячеек в одну (дипазон) для создания более сложной структуры.


Создание простых макросов
Теперь, когда вы знаете, как работают макросы, попробуйте написать свой собственный макрос. У нас есть таблица, и нам нужно раскрасить альтернативные строки таблицы (нечетные будут зелеными, а четные - красными). В таблице 200 строк и столбцы от A до S. Сделать это вручную займет много времени. Поэтому использование макросов будет лучшим решением для этой проблемы.
Откройте редакторы Р7 и создайте новую таблицу.
Откройте вкладку Плагины и выберите Макросы.
  • Появится окно макросов.
  • Нажмите Новый.
  • Вам будет предложен базовый оберточный функционал, в который можно ввести необходимый код:
(function() {
    // ... ваш код здесь ...
})();
Давайте посмотрим в документации Builder.API, что нам нужно сделать для выполнения нашей задачи.
Сначала получим текущий рабочий лист с помощью метода 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));
Соберем все вместе с полным кодом скрипта:
Пример 1
Вставьте код выше в окно макросов и нажмите Запустить.
Строки таблицы с 1 по 200 будут раскрашены чередующимися цветами менее чем за секунду.
(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"); // Вызываем функцию и указываем в аргументе имя листа куда мы копируем.
Поддержка слушателей курса
"Основы Java Script для Р7"