获取上一个 Paragraph 时遇到的坑

场景重现

image.png
需求描述如上图,期望在光标位置使用 ApiParagraph.GetPrevious() 查找到框选的 Paragraph (再通过 ApiParagraph.GetNumbering() 来获取它的 Numbering ), 但很遗憾,程序一直被阻断,错误如下:
image.png
代码如下

  1. ...
  2. let oParagraphPrev = oParagraph.GetPrevious()
  3. let oParagraphPrevNumbering = oParagraphPrev.GetNumbering() // 此处需要修改
  4. while (oParagraphPrev && !oParagraphPrevNumbering) { // 找到前一个 Numbering
  5. oParagraphPrev = oParagraphPrev.GetPrevious()
  6. oParagraphPrevNumbering = oParagraphPrev.GetNumbering() // 此处需要修改
  7. }
  8. console.log(oParagraphPrev.Select())
  9. ...

解决问题

如上问题加了 try-catch ,发现是找不到方法导致程序阻断了。
那么解决问题仍用 try-catch 解决(因为代码是被 GCC(Google Closure Compiler) 压缩过的)

代码如下

  1. let oParagraphPrev = oParagraph.GetPrevious()
  2. let oParagraphPrevNumbering
  3. try { // 如果不是Paragraph类的可能找不到对应的方法,会阻断
  4. oParagraphPrevNumbering = oParagraphPrev.GetNumbering()
  5. } catch (error) {
  6. oParagraphPrevNumbering = null
  7. }
  8. try {
  9. while (oParagraphPrev
  10. && !oParagraphPrevNumbering) { // 找到前一个 Numbering
  11. oParagraphPrev = oParagraphPrev.GetPrevious()
  12. try { // 如果不是Paragraph类的可能找不到对应的方法,会阻断
  13. oParagraphPrevNumbering = oParagraphPrev.GetNumbering()
  14. } catch (error) {
  15. oParagraphPrevNumbering = null
  16. }
  17. }
  18. console.log(oParagraphPrev.Select())
  19. } catch (e) {
  20. console.error(e)
  21. }

总结

在使用相关API方法时尽量使用 try-catch 包裹。

插件中 sdkjs 里面的对象创建和方法调用

  1. // 调用asc_docs_api 的方法
  2. // 如添加 Caption : DE.controllers.Viewport.api.asc_AddObjectCaption(props)
  3. this.ctx.callCommand(() => {
  4. try {
  5. const props = new window.Asc.CAscCaptionProperties()
  6. props.put_Before(true)
  7. props.put_Label('附件')
  8. props.put_ExcludeLabel(false)
  9. props.put_Format(window.Asc.c_oAscNumberingFormat.Decimal)
  10. props.put_IncludeChapterNumber(false) // 是否包括章节号,
  11. // props.put_HeadingLvl(this.cmbChapter.getValue()) // 章节的风格,不包括章节号时不用填
  12. // props.put_Separator(this.cmbSeparator.getValue()) // 分隔符,不包括章节号时不用填
  13. props.updateName()
  14. DE.controllers.Viewport.api.asc_AddObjectCaption(props)
  15. } catch (error) {
  16. console.error(error)
  17. }
  18. }, false)