首页 > 解决方案 > 如何选择段落中所有带下划线的文本

问题描述

我正在尝试创建一个谷歌应用程序脚本,它将格式化段落的某些部分。例如,带下划线的文本也将变为粗体/斜体。

我尝试过的一个文档插件具有类似的功能:https ://imgur.com/a/5Cw6Irn (这正是我想要实现的)

如何编写一个函数来选择某种类型的文本并格式化它?

**我设法编写了一个脚本,它遍历段落中的每个字母并检查它是否有下划线,但是随着段落变长,它变得非常慢,所以我正在寻找一个更快的解决方案。

function textUnderline() {
  var selectedText = DocumentApp.getActiveDocument().getSelection();  
  if(selectedText) {
    var elements = selectedText.getRangeElements();
    for (var index = 0; index < elements.length; index++) {
      var element = elements[index];
      if(element.getElement().editAsText) {        
        var text = element.getElement().editAsText();
        var textLength = text.getText().length;        
        //For every single character, check if it's underlined and then format it
        for (var i = 0; i < textLength; i++) {        
          if(text.isUnderline(i)) {          
            text.setBold(i, i, true);
            text.setBackgroundColor(i,i,'#ffff00');               
          } else {            
            text.setFontSize(i, i, 8);             
          } 
        }   
      } 
    }
  }
}

标签: google-apps-scriptgoogle-docs

解决方案


使用 getTextAttributeIndices:

无需检查选择中的每个字符。您可以使用getTextAttributeIndices()获取文本格式更改的索引。这种方法:

检索与不同文本格式化运行的开始相对应的文本索引集。

您只需要遍历这些索引(即检查文本格式更改的索引),它们只是所有字符索引的一小部分。这将大大提高效率。

代码示例:

function textUnderline() {
  var selectedText = DocumentApp.getActiveDocument().getSelection();  
  if(selectedText) {
    var elements = selectedText.getRangeElements();
    for (var index = 0; index < elements.length; index++) {
      var element = elements[index];
      if(element.getElement().editAsText) {        
        var text = element.getElement().editAsText();
        var textRunIndices = text.getTextAttributeIndices();
        var textLength = text.getText().length;
        for (let i = 0; i < textRunIndices.length; i++) {
          const startOffset = textRunIndices[i];
          const endOffset = i + 1 < textRunIndices.length ? textRunIndices[i + 1] - 1 : textLength - 1;
          if (text.isUnderline(textRunIndices[i])) {
            text.setBold(startOffset, endOffset, true);
            text.setBackgroundColor(startOffset, endOffset,'#ffff00');  
          } else {
            text.setFontSize(startOffset, endOffset, 8);
          }
        }
      } 
    }
  }
}

参考:


推荐阅读