Миграция макросов Excel VBA на Р7 JavaScript
Основы макросов Р7
Макросы - это небольшие скрипты, которые используются для облегчения повседневной работы с различными типами документов. Макросы Р7 используют синтаксис JavaScript и нотацию скриптов API Р7 Document Builder.
Есть несколько причин, по которым Р7 использует JavaScript для макросов:
  • платформонезависимость,
  • простота использования,
  • безопасность, поскольку макросы не имеют доступа к системе. Они просто выполняются в том же окне, что и редакторы.
Обратите внимание, что начиная с версии 7.1, доступ к объектам окна и документа, а также функция alert ограничены для макросов из-за применения режима "use strict" к скриптам макросов. Не забудьте объявлять переменные перед их использованием, чтобы макросы работали корректно.
Вы можете найти готовые макросы здесь или создать свои собственные.
Как начать написание своего макроса:
  • Откройте вкладку Плагины и нажмите Макросы.
  • Нажмите Новый в появившемся окне.
  • Пользуйтесь документацией API для написания скрипта.
  • Напишите код для вашего макроса.
  • Переименуйте свой макрос, нажав соответствующую кнопку.
  • Когда будете готовы, нажмите Запустить, чтобы выполнить свой код в документе.
Первый макрос
Теперь, когда вы знаете, как работают макросы, попробуйте написать свой собственный макрос. У нас есть таблица, и нам нужно раскрасить альтернативные строки таблицы (нечетные будут зелеными, а четные - красными). В таблице 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));

Соберем все вместе с полным кодом скрипта:

(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));
}
})();

Вставьте код выше в окно макросов и нажмите Запустить. Строки таблицы с 1 по 200 будут раскрашены чередующимися цветами менее чем за секунду.
Подписка на событие
Для подписки на указанное событие и вызова функции обратного вызова при его наступлении используйте метод attachEvent.
Например, чтобы подписаться на событие при клике на гиперссылку в документе, используйте следующие строки:

Api.attachEvent("asc_onHyperlinkClick", function(){
console.log("HYPERLINK!!!");
});

Когда вы нажмете на любую гиперссылку в документе, будет выполнено событие asc_onHyperlinkClick, и сообщение "HYPERLINK!!!" появится в консоли.
Привязка (назначение) макроса к объекту
В редакторе электронных таблиц вы можете назначить макрос графическому объекту:
Щелкните правой кнопкой мыши по графическому объекту.
Отладка макросов в Р7
Для отладки макросов в Р7 выполните следующие шаги:
  • Откройте вкладку Плагины и нажмите Макросы.
  • Используйте команду отладчика 'debugger;' в своем скрипте:

debugger;
var oDocument = Api.GetDocument();
var oParagraph = oDocument.GetElement(0);
oParagraph.AddText("Hello world!");

Обратите внимание, что команда отладчика будет работать только если инструменты разработчика открыты. В противном случае браузер игнорирует её.

Команда debugger работает как точка останова и приостанавливает выполнение скрипта в точке, где эта команда вставлена.

Если вам нужно вывести определенные значения в консоль разработчика браузера, вы можете использовать метод console.log(). Передайте значение, которое вы хотите проверить, или строку сообщения в качестве аргумента этого метода и откройте консоль разработчика, нажав кнопку F12, чтобы увидеть результат:

  • console.log(123);
Преобразование макросов Excel VBA
Макросы Р7-Офис отличаются от макросов Microsoft, так как последние используют язык сценариев Visual Basic for Applications (VBA). JavaScript (язык макросов Р7) более гибок и может использоваться на любой платформе (что важно, так как редактор Р7 поддерживается на платформах Windows, Linux и Mac OS).

Это может создать некоторые неудобства, если вы ранее использовали Microsoft Office с макросами VBA, так как они станут несовместимы с макросами Р7. Вы можете преобразовать ранее использованные макросы, чтобы использовать их с Р7-Офис.

Процесс не слишком сложен. Рассмотрим следующий пример на языке VBA:

Sub Example()
Dim myRange
Dim result
Dim Run As Long

For Run = 1 To 3
Select Case Run
Case 1
result = "=SUM(A1:A100)"
Case 2
result = "=SUM(A1:A300)"
Case 3
result = "=SUM(A1:A25)"
End Select
ActiveSheet.range("B" & Run) = result
Next Run

End Sub

Этот макрос считает сумму значений из трех диапазонов ячеек столбца A и помещает результаты в три ячейки столбца B.

Того же самого можно достичь с помощью макросов Р7. Код будет практически идентичным и легко понятным, если вы знаете как VBA, так и JavaScript:

(function()
{
for (let run = 1; run <= 3; run++)
{
var result = "";
switch (run)
{
case 1:
result = "=SUM(A1:A100)";
break;
case 2:
result = "=SUM(A1:A300)";
break;
case 3:
result = "=SUM(A1:A25)";
break;
default:
break;
}
Api.GetActiveSheet().GetRange("B" + run).Value = result;
}
})();

Почти любой код макроса VBA (за некоторыми исключениями, описанными в нашем курсе) можно преобразовать в код на JavaScript, совместимый с макросами Р7.