Historique des modifications

Consultez les versions précédentes, comparez leur contenu et restaurez une version si vous en avez le droit. La conservation des versions nécessite un service d’historique intégré avec le Server SDK. Annuler et rétablir dans la session courante ne nécessite pas ce service.

Préparer la collaboration et l’historique

Terminez l’intégration collaborative et la configuration de la licence, puis connectez le stockage et les autorisations avec les modules d’extension et l’exemple History. La collaboration de base n’active pas automatiquement l’historique.

Enregistrer les plugins d’historique

Ajoutez ces plugins à votre configuration Sheets et collaborative. Si un preset collaboratif les enregistre déjà, modifiez sa configuration pour éviter les doublons. L’interface d’historique Sheets nécessite aussi 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,})

Remplacez /api/history par le préfixe de votre service d’historique et utilisez la même valeur pour les deux historyServerUrl. univerContainerId doit correspondre à l’ID DOM du conteneur de l’éditeur. Chargez les ressources de la langue de l’éditeur.

Prise en charge mobile

Configurez d’abord l’éditeur mobile. Dans l’initialisation en mode plugin de cette page, remplacez les inscriptions de bureau ci-dessous par les exports mobiles des mêmes paquets avant d’ouvrir un document. Conservez modèles, styles, traductions et imports Facade ; n’enregistrez pas les deux variantes.

PaquetInscription de bureauInscription mobile
@univerjs-pro/sheets-history-uiUniverSheetsHistoryUIPluginUniverSheetsHistoryMobileUIPlugin

Consulter et restaurer une version

Modifiez des cellules, des formules ou des formats, attendez la confirmation collaborative, puis ouvrez l’historique depuis le menu de l’éditeur. Vérifiez les versions, les différences et leur conservation après redémarrage du service. La restauration modifie le document partagé : le serveur doit vérifier les droits de restauration, et une autre session collaborative doit recevoir la mise à jour.

Comparer des snapshots

Pour créer une interface de révision ou transmettre les changements à un AI Agent, utilisez compareUnitData(), ou préparez le résultat une seule fois avec prepareUnitComparison(). Enregistrez le plugin History du produit et importez son entrée Facade. Fournissez deux snapshots complets du même document dans beforeSnapshot et afterSnapshot. Cette comparaison en lecture seule ne nécessite aucun service d’historique et ne restaure ni ne fusionne le contenu.

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)

Lisez scopes pour découvrir les vues, puis transmettez une portée à query() pour filtrer sans recalculer les différences. La pagination renvoie 100 éléments par défaut, avec un maximum de 1 000. Utilisez page.hasMore et offset pour la suite. summary décrit toujours la comparaison entière, même après filtrage. Vérifiez diagnostics.readiness et diagnostics.codes avant de considérer le résultat comme complet. Pour Node.js ou une CLI sans éditeur, consultez l’API de comparaison sans interface.

Que pensez-vous de ce guide ?

© 2026 DreamNum Co., Ltd.