使用Office JS对比文件后,切换当前文件时getTrackedChanges()无法获取修订项的问题求助
问题描述
我最近在使用Office JS处理Word文档对比和修订获取的功能时遇到了一个棘手的问题:
我用compare()函数对比两个文件,当Word侧显示出修订变化后,尝试用getTrackedChanges()来获取这些修订,但通过console.log打印时发现返回的items数组是空的。具体场景:
- 当把文件1设为当前文件时,能正常从items里拿到修订内容
- 但如果把文件2设为当前文件,就完全获取不到任何修订项
我的代码片段如下:
const compareFiles = async () => { const createdBy = "name"; try { await Word.run(async (context) => { const options = { authorName: createdBy, }; context.document.compare("https:demo.blob.test", options); await context.sync(); }); } catch (error) { console.log("error: ", error); } }; const getTrackedChanges = async () => { await Word.run(async (context) => { const body = context.document.body; const trackedChanges = body.getTrackedChanges(); trackedChanges.load("items"); await context.sync(); // 这里打印trackedChanges.items是空数组 console.log(trackedChanges.items); }); };
有没有大佬能帮忙分析下问题出在哪,或者提供可行的解决思路?
解决方案思路
根据我使用Office JS处理文档对比的经验,这个问题大概率和对比后文档的上下文关联以及修订项的归属范围有关,给你几个可行的排查方向和解决方法:
确认对比操作的目标文档上下文
调用context.document.compare()时,对比操作会生成一个新的临时文档副本来展示修订,而非直接修改原文件。如果你切换到文件2作为当前文件,这个文件本身并没有被标记为对比的基准文档,自然没有关联的修订项。你可以尝试在对比完成后,直接针对生成的临时文档获取修订:const compareFiles = async () => { const createdBy = "name"; try { await Word.run(async (context) => { const options = { authorName: createdBy, compareTarget: Word.CompareTarget.newDocument // 明确生成新文档存放修订 }; const compareResult = context.document.compare("https:demo.blob.test", options); await context.sync(); // 直接在对比后获取修订 const trackedChanges = compareResult.document.body.getTrackedChanges(); trackedChanges.load("items/type, items/text"); await context.sync(); console.log("对比后的修订项:", trackedChanges.items); }); } catch (error) { console.log("error: ", error); } };完善getTrackedChanges的加载属性
你的代码只加载了items属性,可能需要加载更多细节确保数据完整,也可以尝试缩小获取范围(比如针对段落):const getTrackedChanges = async () => { await Word.run(async (context) => { const body = context.document.body; const trackedChanges = body.getTrackedChanges(); // 加载更多属性确保数据完整 trackedChanges.load("items/type, items/author, items/text"); await context.sync(); console.log(trackedChanges.items); }); };切换文件后强制同步上下文
切换当前文件时,Office JS的上下文可能未及时更新到新文件,可先执行一次context.sync()确保上下文与当前活动文档同步:const getTrackedChanges = async () => { await Word.run(async (context) => { // 先同步上下文,确保指向当前活动文件 await context.sync(); const body = context.document.body; const trackedChanges = body.getTrackedChanges(); trackedChanges.load("items"); await context.sync(); console.log(trackedChanges.items); }); };检查文档修订显示设置
若Word的显示设置隐藏了修订,也会导致getTrackedChanges()无法获取到,可通过代码强制开启显示:await Word.run(async (context) => { context.document.trackRevisions = true; context.document.showRevisions = true; await context.sync(); });
你可以先从这几个方向排查,应该能解决大部分问题。如果还是不行,可以检查对比的文件是否有权限访问,或者文件格式是否支持修订跟踪~
备注:内容来源于stack exchange,提问作者if357

