Вероятно, кто-то уже сталкивался с новым подходом в реализации скриптов автоматизации в 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+ записей происходит достаточно медленно (зависит от структуры таблицы и объема текстовых данных), поэтому рекомендую запускать такие сценарии ночью или на выходных, когда гарантировано никто не будет вторгаться ни в файл, ни в списки хранения информация для резервного копирования. 

В общем, может кому-то пригодится.