Подробный гайд: Автосохранение в LibreOffice Calc после каждого изменения
К сожалению, LibreOffice не имеет встроенной функции сохранения после каждого изменения ячейки, но есть несколько рабочих решений — от стандартных настроек до макросов.
Вариант 1: Стандартное автосохранение (AutoRecovery)
Это встроенная функция, которая сохраняет информацию для восстановления каждые заданные минуты:
Настройка:
- Откройте Сервис → Параметры (или Alt+F12)
- Перейдите в Загрузка/сохранение → Общие
- Установите галочку «Сохранять информацию для автовосстановления каждые»
- Укажите минимальный интервал (например, 1 минута)
- Нажмите ОК
Важно:
- Это не сохраняет файл на диск после каждого изменения, а создаёт временную копию для восстановления при сбое.
Вариант 2: Резервные копии при каждом сохранении
Чтобы при каждом ручном сохранении (Ctrl+S) создавалась резервная копия:
- Сервис → Параметры → Загрузка/сохранение → Общие
- Включите опцию «Всегда создавать резервную копию»
- При необходимости измените путь к папке резервных копий:
LibreOffice → Пути → Резервные копии
Резервные файлы имеют расширение .BAK и сохраняются в указанной папке.
Вариант 3: Макрос для автосохранения при изменении (наиболее близко к «после каждого изменения»)
Макрос с таймером (рекомендуемый)
Этот макрос сохраняет документ с заданным интервалом при любой активности пользователя (нажатия клавиш, клики мыши):
Option Explicit
Global Const gsTime = "00:01:00" ' Интервал: 1 минута (формат ЧЧ:ММ:СС)
Global Const gsMacro = "Standard.AutoSave.EndBackup"
Global Const gsExt = ".autosave"
Global goKeyHandler As Object, goDocController As Object, goMouseHandler As Object
Global gTime As Date, gBackupTime As Date
Sub StartBackup
gTime = Now
gBackupTime = TimeValue(gsTime)
' Привязка макроса к событию закрытия вида
Dim mEventProps(1) As New com.sun.star.beans.PropertyValue
mEventProps(0).Name = "EventType"
mEventProps(0).Value = "StarBasic"
mEventProps(1).Name = "Script"
mEventProps(1).Value = "macro:///" & gsMacro
ThisComponent.Events.ReplaceByName("OnPrepareViewClosing", mEventProps())
RegisterHandlers
MsgBox "Автосохранение включено. Интервал: " & gsTime, 64, "Готово"
End Sub
Sub EndBackup
UnregisterHandlers
Dim mEventProps(0) As New com.sun.star.beans.PropertyValue
mEventProps(0).Name = ""
mEventProps(0).Value = ""
ThisComponent.Events.ReplaceByName("OnPrepareViewClosing", mEventProps())
SaveFile
End Sub
Sub CreateCopy
If Now() > gTime + gBackupTime Then
SaveFile
Dim s As String
s = ThisComponent.Location
If s <> "" Then FileCopy(s, s & gsExt)
gTime = Now
End If
End Sub
Sub SaveFile
CreateUnoService("com.sun.star.frame.DispatchHelper").executeDispatch( _
ThisComponent.CurrentController.Frame, ".uno:Save", "", 0, Array())
End Sub
Sub RegisterHandlers
goDocController = ThisComponent.CurrentController
goKeyHandler = CreateUnoListener("Key_", "com.sun.star.awt.XKeyHandler")
goDocController.addKeyHandler(goKeyHandler)
goMouseHandler = CreateUnoListener("Mouse_", "com.sun.star.awt.XMouseClickHandler")
goDocController.addMouseClickHandler(goMouseHandler)
End Sub
Sub UnregisterHandlers
If Not IsNull(goDocController) And Not IsEmpty(goDocController) Then
goDocController.removeKeyHandler(goKeyHandler)
goDocController.removeMouseClickHandler(goMouseHandler)
End If
End Sub
' Обработчики событий
Function Key_keyReleased(Optional oEvt) As Boolean
CreateCopy
Key_keyReleased = False
End Function
Function Key_keyPressed(Optional oEvt) As Boolean
Key_keyPressed = False
End Function
Function Key_disposing(Optional oEvt)
End Function
Function Mouse_mouseReleased(oEvent As com.sun.star.awt.MouseEvent) As Boolean
CreateCopy
Mouse_mouseReleased = False
End Function
Function Mouse_mousePressed(oEvent As com.sun.star.awt.MouseEvent) As Boolean
Mouse_mousePressed = False
End Function
Как установить макрос:
- Откройте документ Calc
- Нажмите Alt+F11 → откроется редактор макросов
- В Standard создайте новый модуль (ПКМ → Insert → Module)
- Вставьте код выше
- Сохраните модуль
- Запустите макрос StartBackup для включения автосохранения
Важно:
- Документ должен быть сохранён в формате .ods с поддержкой макросов, иначе код не сохранится.
Вариант 4: Расширение Timestamped Backup
Установите официальное расширение для автоматического создания резервных копий с метками времени:
- Timestamped Backup на extensions.libreoffice.org - extensions.libreoffice.org/en/extensions/show/timestamp-backup
Преимущества:
- Автоматическое создание копий с интервалом
- Не требует написания кода
- Копии имеют уникальные имена (с датой/временем)
Сравнение методов
| Метод | Сохраняет после каждого изменения | Требует макросов | Надёжность | Сложность |
|---|---|---|---|---|
| AutoRecovery | Нет (по таймеру) | Нет | Высокая | Низкая |
| Резервные копии | Нет (только при Ctrl+S) | Нет | Очень высокая | Низкая |
| Макрос с таймером | Да (почти) | Да | Высокая | Средняя |
| Расширение Backup | Да (по таймеру) | Нет | Очень высокая | Средняя |
Важные предупреждения
- Частое сохранение на диск может замедлить работу с большими файлами
- Макросы должны быть включены:
Сервис → Параметры → LibreOffice → Безопасность → Безопасность макросов
- При использовании макросов отключите запросы на сохранение при закрытии, если не хотите двойного сохранения
- Для максимальной надёжности комбинируйте: макрос + облачное хранилище (Dropbox, Nextcloud и т.п.)
Рекомендация
Для большинства пользователей оптимальна комбинация:
- Включить AutoRecovery с интервалом 1–2 минуты
- Включить резервные копии при сохранении
- Использовать облачную синхронизацию папки с документами
Это обеспечит защиту данных без риска потери производительности или сложности настройки макросов.