【问题标题】:Google Apps Script - Cannot read Bold Attribute of a Paragraph in a Google DocGoogle Apps 脚本 - 无法读取 Google 文档中段落的粗体属性
【发布时间】:2018-09-22 18:32:10
【问题描述】:

我正在尝试使用 Apps 脚本从 Google 文档中读取段落的属性。当我读取属性时,一些 BOLD 属性返回为 null。

这是我读取属性的示例脚本。

// 读取此 Google 文档中每个段落的属性并打印所有粗体的段落文本

function readAttributes() {
  var doc = DocumentApp.getActiveDocument(); 
  var body = doc.getBody(); 
  var paras = body.getParagraphs();
  for (var i = 0; i < paras.length; i++){ 
    var paragraph = paras[i];  
    var attribute = paragraph.getAttributes(); 
    if (attribute.BOLD === true) {
      Logger.log(paragraph.getText()); 
    }
  } 
}

这是一个模拟的示例文档: 该脚本位于此 Google 文档的后面。文件 -> 制作副本。

https://docs.google.com/document/d/13FYg8AAk6PX9TEUdgfaT-60Vi5xoQlZ9Moink5guLH0/edit?usp=sharing

我的文档有什么问题?只有第18题的属性返回为BOLD,第17题的属性返回为null。

Google 文档中任何段落的返回 Attribute 对象如下所示。

 {
    FONT_SIZE=null, 
    ITALIC=null, 
    HORIZONTAL_ALIGNMENT=null, 
    INDENT_END=null,
    INDENT_START=null, 
    LINE_SPACING=1.0, 
    LINK_URL=null, 
    UNDERLINE=null, 
    BACKGROUND_COLOR=null, 
    INDENT_FIRST_LINE=null, 
    LEFT_TO_RIGHT=true, 
    SPACING_BEFORE=null, 
    HEADING=Normal, 
    SPACING_AFTER=null, 
    STRIKETHROUGH=null, 
    FOREGROUND_COLOR=null, 
    BOLD=null, 
    FONT_FAMILY=Calibri
}

我的 Logger.log() 结果:

预期输出:

  1. 如果您的车辆在驾驶时起火,以下哪项是最有效的行动计划?
  2. 出行前,您需要检查轮胎。哪些问题需要立即采取行动?

结果输出:

  1. 出行前,您需要检查轮胎。哪些问题需要立即采取行动?

显示问题的图片

很明显文档中的问题17有问题,所以它的BOLD属性为空。

【问题讨论】:

  • 不确定,但有效和计划之间的空格是斜体和粗体。也许整个段落不被认为是粗体,而只是单个文本元素。也许试试paragraph.editAsText().getAttribute(offset)?
  • @I'-'I 例如有一段文字为sample,除a外的所有字符都是BOLD属性。当paragraph.editAsText().getAttributes(offset)用于搜索BOLD属性时,当其中仅包含一个普通字符(a)时,似乎BOLD的属性对于所有偏移量都变为null。这可能是规范。但是当使用isBold(offset)时,即使段落中包含一个普通字符,除了a之外的字符显示true。

标签: google-apps-script google-docs


【解决方案1】:

在您的示例中,在17. Which of ... 的段落中,整个段落不是 BOLD 属性。另一方面,在18. Before taking... 的段落中,整个段落是BOLD 属性。这样,17. Which of ... 段落的 BOLD 属性变为null。那么这个改装怎么样呢?我认为您的情况有几个答案。因此,请将此视为其中之一。

修改点:

  • 关于每个段落,扫描每个字符的文本。并检索具有 BOLD 属性的字符。
    • 对于这种情况,它使用isBold()。

修改后的脚本:

请进行如下修改。

从:
for (var i = 0; i < paras.length; i++){ 
  var paragraph = paras[i];  
  var attribute = paragraph.getAttributes(); 
  if (attribute.BOLD === true) {
    Logger.log(paragraph.getText()); 
  }
} 
至:
for (var i = 0; i < paras.length; i++) {
  var res = "";
  var paragraph = paras[i];
  var attribute = paragraph.editAsText();
  for (var j = 0; j < attribute.getText().length; j++) {
    if (attribute.isBold(j)) {
      res += attribute.getText()[j];
    }
  }
  if (res.length > 0) {
    Logger.log(res)
  }
}

结果:

  1. 如果您的车辆在行驶时着火,以下哪项是最有效的行动计划?
  2. 出行前,您需要检查轮胎。哪些问题需要立即采取行动?

注意:

  • 在此修改中,如果句子中包含非 BOLD 属性的字符,则不检索此类字符。如果所有字符都是 BOLD 属性,则检索整个句子。请注意这一点。

参考:

如果这不是你想要的,我很抱歉。

【讨论】:

  • 谢谢田池。您的答案完美无缺。是的,我必须在段落中查找每个子元素以确定其 BOLD 属性。显然,段落末尾有一个空格,因此,我认为整个段落的 BOLD 属性返回为空。你让我开心!
  • @Prahlad 欢迎您。我很高兴你的问题得到了解决。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多