Вероятно, кто-то уже сталкивался с новым подходом в реализации скриптов автоматизации в Excel из O365. У меня была интересная задача создания консолидированного файла с резервными данными на регулярной основе нескольких списков из SharePoint Online. Небольшая сложность состояла в том, что нужно при каждом нового бэкапе чистить таблицы от предыдущего бэкапа. Да, конечно, эту задачу можно решать по-разному, но я решил использовать имеющиеся современные возможности работы Power Automate со скриптами автоматизации Excel.
Основа языка сценариев автоматизации у Microsoft называется TypeScript, но не совсем тот, который относится к эволюции JavaScript в привычном веб-программировании, а именно язык описания офисных скриптов (подробнее можете почитать по ссылке). Проще говоря, автоматизация Excel написана на TypeScript, а значит и ваши скрипты пишутся на нем. Как выглядит процесс автоматизации создания бэкапа в таблицы Excel, представлено на рисунке.
Примечательно, что только такие скрипты читаются облачными сервисами Microsoft.
➕Плюсы от такого функционала:
- скрипт можно вызвать и применить к любому файлу Excel в облаке (если у вас нет специфики при работе с конкретными наборами данных),
- скрипт можно изменить и сразу запустить/отладить.
➖ Минусы скриптов:
- нехорошая документация по применению языка для решения офисных задач (личное мнение автора),
- Power Automate не всегда корректно отрабатывает команду применения скрипта при вызове, иногда это связано с особенностями работы с файлами Excel в облаке (блок файла от записи, чтения, нарушение прав владельца файла и т.п.)
Вернёмся к решению задачи очистки данных в таблице Excel. Конечно имеется ввиду, что у вас корректно создана именованная таблица, скажем с именем tMyTable
. Поэтому скрипт очистки данных в ней будет выглядеть так:
function main(workbook: ExcelScript.Workbook) {
let table1 = workbook.getTable("tMyTable");
let rowCount1 = table1.getRangeBetweenHeaderAndTotal().getRowCount();
try {
table1.deleteRowsAt(0, rowCount1);
} catch (e) {
if (rowCount1 === 1 && e.code === 'InvalidArgument') {
console.log("This error means there's no row to delete.")
}
}
}
В скрипте без лишнего изящества прописана функция, где мы обозначаем и читаем таблицу tMyTable
через переменную, далее в ней считаем количество всех строк (от предыдущего бэкапа) и пытаемся запустить построчное удаление записей в ней. И отработка ошибки, которую робот Power Automate тоже зарегистрирует, если что.
Должен отметить, что производительность операции удаления для количества 1000+ записей происходит достаточно медленно (зависит от структуры таблицы и объема текстовых данных), поэтому рекомендую запускать такие сценарии ночью или на выходных, когда гарантировано никто не будет вторгаться ни в файл, ни в списки хранения информация для резервного копирования.
В общем, может кому-то пригодится.