【问题标题】:Formatting in replaceText()在 replaceText() 中格式化
【发布时间】:2018-05-12 10:52:44
【问题描述】:

我现在在 Google 文档脚本中的 doc.getBody().replaceText(oldregex,newstring) 工作正常,并希望在 newstring 上设置一些粗体/斜体。这看起来比我想象的要难。有没有人找到一个整洁的方法来做到这一点?

我目前认为我需要...

  • 使用rangeBuilder 将newtext 构建为范围
  • 找到 oldtext 并选择它作为一个范围(不知何故...)
  • 清除旧文本范围并在查找位置插入新文本范围

对于那些使用类似 HTML 的标签来说是微不足道的事情,这似乎需要做很多工作。我肯定错过了一些东西。非常感谢任何建议。

【问题讨论】:

标签: google-apps-script google-docs


【解决方案1】:

由于replaceText 仅更改纯文本内容,保留格式,因此可以通过在替换之前应用格式来实现目标。首先,findText 遍历文本并为每个匹配设置粗体;然后replaceText 执行替换。

有两种情况需要考虑:仅匹配元素中的部分文本(这是典型的)和匹配整个元素。 RangeElement 类的 isPartial 属性区分这些。

function replaceWithBold(pattern, newString) {
  var body = DocumentApp.getActiveDocument().getBody();
  var found = body.findText(pattern);
  while (found) {
    var elem = found.getElement();
    if (found.isPartial()) {
      var start = found.getStartOffset();
      var end = found.getEndOffsetInclusive();
      elem.setBold(start, end, true);
    }
    else {
      elem.setBold(true);
    }
    found = body.findText(pattern, newString);
  }
  body.replaceText(pattern, newString);
}

对于一些微不足道的事情来说,这似乎需要做很多工作

这对于使用 Apps 脚本处理 Google 文档是正确且典型的。

【讨论】:

  • 这真的很有用,谢谢!不幸的是,我希望用一块动态生成的格式化文本替换占位符,所以这听起来工作量太大。从头开始创建一个新的格式化文档然后手动剪切和粘贴会更容易吗?如果这也很棘手,那么我可能会回到使用 LaTeX 或 HTML...
  • Apps 脚本无法插入格式化文本;所有插入方法都采用一个字符串。但是可以首先在使用 findText 标识的偏移量处插入一个字符串,然后将格式应用于包含偏移量的 Element,以便将格式应用于插入的文本。占位符可以在过程结束时删除。但如果这听起来工作量太大,那么当然可以使用其他解决方案。
  • replaceText 不会保留格式。
  • 注意:第二个findText中的第二个参数应该是found。 - documentation.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
相关资源
最近更新 更多