Historial de edición

Consulta versiones anteriores, compara su contenido y restaura una versión si tienes permiso. Para conservar versiones debes integrar un servicio de historial con Server SDK. Deshacer y rehacer en la sesión actual no requiere ese servicio.

Preparar la colaboración y el historial

Completa la integración colaborativa y la configuración de la licencia. Después, conecta el almacenamiento y los permisos siguiendo los módulos de extensión y el ejemplo History. La colaboración básica no activa el historial automáticamente.

Registrar los plugins de historial

Añade estos plugins a tu configuración de Sheets y colaboración. Si un preset colaborativo ya los registra, modifica esa configuración para evitar duplicados. La interfaz de historial de Sheets también necesita UniverCollaborationClientUIPlugin.

Shell
pnpm add @univerjs-pro/edit-history @univerjs-pro/edit-history-ui @univerjs-pro/sheets-history @univerjs-pro/sheets-history-ui
TypeScript
import { UniverEditHistoryPlugin } from '@univerjs-pro/edit-history'import EditHistoryLocale from '@univerjs-pro/edit-history-ui/locale/en-US'import { UniverSheetsHistoryPlugin } from '@univerjs-pro/sheets-history'import { UniverSheetsHistoryUIPlugin } from '@univerjs-pro/sheets-history-ui'import HistoryLocale from '@univerjs-pro/sheets-history-ui/locale/en-US'import { LocaleType, mergeLocales } from '@univerjs/core'import '@univerjs-pro/edit-history-ui/lib/index.css'import '@univerjs-pro/sheets-history-ui/lib/index.css'const historyServerUrl = '/api/history'univerAPI.loadLocales(LocaleType.EN_US, mergeLocales(EditHistoryLocale, HistoryLocale))univer.registerPlugin(UniverEditHistoryPlugin, { historyServerUrl })univer.registerPlugin(UniverSheetsHistoryPlugin)univer.registerPlugin(UniverSheetsHistoryUIPlugin, {  univerContainerId: 'app',  historyServerUrl,})

Sustituye /api/history por el prefijo de tu servicio de historial y usa el mismo valor en ambos historyServerUrl. univerContainerId debe coincidir con el ID DOM del contenedor del editor. Carga los recursos del idioma del editor.

Compatibilidad móvil

Configure primero el editor móvil. En la inicialización en modo plugin de esta página, sustituya los registros de escritorio siguientes por las exportaciones móviles de los mismos paquetes antes de abrir un documento. Conserve modelos, estilos, traducciones e importaciones Facade; no registre ambas variantes.

PaqueteRegistro de escritorioRegistro móvil
@univerjs-pro/sheets-history-uiUniverSheetsHistoryUIPluginUniverSheetsHistoryMobileUIPlugin

Consultar y restaurar versiones

Edita celdas, fórmulas o formatos, espera la confirmación colaborativa y abre el historial desde el menú del editor. Comprueba la lista, las diferencias y la persistencia tras reiniciar el servicio. La restauración modifica el documento compartido: el servidor debe comprobar los permisos y otra sesión colaborativa debe recibir la actualización.

Comparar snapshots

Para crear una pantalla de revisión o proporcionar cambios a un AI Agent, usa compareUnitData() o prepara el resultado una sola vez con prepareUnitComparison(). Registra el plugin History del producto e importa la entrada Facade. Proporciona dos snapshots completos del mismo documento en beforeSnapshot y afterSnapshot. Esta comparación de solo lectura no necesita un servicio de historial y no restaura ni combina contenido.

TypeScript
import { UnitComparisonDetailLevel, UnitComparisonFidelity } from '@univerjs-pro/edit-history'import { UniverInstanceType } from '@univerjs/core'import '@univerjs-pro/edit-history/facade'const comparison = univerAPI.prepareUnitComparison({  comparisonId: 'review-1',  unitId: beforeSnapshot.id,  type: UniverInstanceType.UNIVER_SHEET,  fidelity: UnitComparisonFidelity.SNAPSHOT,  leftData: beforeSnapshot,  rightData: afterSnapshot,})const overview = comparison.query({ detail: UnitComparisonDetailLevel.SUMMARY })const scope = overview.scopes[0]const page = comparison.query({ scope, offset: 0, limit: 100 })console.log(page.items, page.page.hasMore, page.diagnostics)

Lee scopes para obtener las vistas disponibles y pasa un ámbito a query() para filtrar sin recalcular las diferencias. Cada página devuelve 100 elementos de forma predeterminada, con un máximo de 1.000. Usa page.hasMore y offset para continuar. summary describe siempre la comparación completa, incluso al filtrar elementos. Comprueba diagnostics.readiness y diagnostics.codes antes de tratar el resultado como completo. Para Node.js o una CLI sin editor, consulta la API de comparación sin interfaz.

¿Cómo es esta guía?

© 2026 DreamNum Co., Ltd.