【问题标题】:Can I color certain words in Google Document using Google Apps Script?我可以使用 Google Apps 脚本为 Google 文档中的某些单词着色吗?
【发布时间】:2012-08-17 09:29:25
【问题描述】:

我正在尝试突出显示我的 Google 文档中的某些字词。我知道我可以使用 document.replace 替换文本,但它只替换字符串本身,而不是格式。有没有办法使用 Google Apps 脚本将字符串替换为彩色字符串?

【问题讨论】:

    标签: google-apps-script google-docs


    【解决方案1】:

    这是一个名为 Multi-instance Text Highlighting 的 Google 文档插件。提示:起初它似乎不起作用,但我关闭了我的文档并重新打开它,然后它就起作用了。然后它似乎有时不起作用,但我发现你的文本字符串中的特殊字符会破坏它;我想我的字符串中有一个 + ,但它什么也没做。但是没有特殊字符,它的效果很好。真的帮了我大忙。

    【讨论】:

    • 可以从 Google Apps 脚本中使用多实例文本突出显示吗?问题是关于自动着色的,我找不到这个插件的开发者界面。
    【解决方案2】:

    随着文档绑定脚本的引入,现在可以制作从自定义菜单调用的文本突出显示功能。

    当然 THIS 是现在最好的答案! 8^)

    此脚本是从this answer 中的脚本修改而来的,可以从 UI(不带参数)或脚本调用。

    /**
     * Find all matches of target text in current document, and highlight them.
     *
     * @param {String} target     (Optional) The text or regex to search for. 
     *                            See Body.findText() for details.
     * @param {String} background (Optional) The desired highlight color.
     *                            A default orange is provided.
     */
    function highlightText(target,background) {
      // If no search parameter was provided, ask for one
      if (arguments.length == 0) {
        var ui = DocumentApp.getUi();
        var result = ui.prompt('Text Highlighter',
          'Enter text to highlight:', ui.ButtonSet.OK_CANCEL);
        // Exit if user hit Cancel.
        if (result.getSelectedButton() !== ui.Button.OK) return;
        // else
        target = result.getResponseText();
      }
      var background = background || '#F3E2A9';  // default color is light orangish.
      var doc = DocumentApp.getActiveDocument();
      var bodyElement = DocumentApp.getActiveDocument().getBody();
      var searchResult = bodyElement.findText(target);
    
      while (searchResult !== null) {
        var thisElement = searchResult.getElement();
        var thisElementText = thisElement.asText();
    
        //Logger.log(url);
        thisElementText.setBackgroundColor(searchResult.getStartOffset(), searchResult.getEndOffsetInclusive(),background);
    
        // search for next match
        searchResult = bodyElement.findText(target, searchResult);
      }
    }
    
    /**
     * Create custom menu when document is opened.
     */
    function onOpen() {
      DocumentApp.getUi().createMenu('Custom')
          .addItem('Text Highlighter', 'highlightText')
    
          .addToUi();
    }
    

    【讨论】:

    • 是的,findText() 与 RegEx 一起用于searchpattern。在答案中,我们从用户那里得到一个字符串输入,所以你需要从中生成一个正则表达式;见this answer
    • 不错的答案...但不是关于“前景”颜色的问题吗? ;) 看起来并不难从那里推断出来。
    • 这太棒了。我根据我的目的对其进行了调整。我的 UI 菜单不会提示突出显示某个单词,而是调用一个包含完整单词列表的包装函数,该函数为每个单词调用 highlightTexthighlightText 现在有一个计数器,可以返回有多少单词突出显示,我的包装器将它们全部汇总并显示在警报中。谢谢!
    【解决方案3】:

    这是一个更好的解决方案:

    function highlightTextTwo() {
      var doc  = DocumentApp.openById('<your document id');
      var textToHighlight = 'dusty death';
      var highlightStyle = {};
      highlightStyle[DocumentApp.Attribute.FOREGROUND_COLOR] = '#FF0000';
      var paras = doc.getParagraphs();
      var textLocation = {};
      var i;
    
      for (i=0; i<paras.length; ++i) {
        textLocation = paras[i].findText(textToHighlight);
        if (textLocation != null && textLocation.getStartOffset() != -1) {
          textLocation.getElement().setAttributes(textLocation.getStartOffset(),textLocation.getEndOffsetInclusive(), highlightStyle);
        }
      }
    }
    

    上一个答案:

    关键是能够仅引用您想要着色的单词。

    我的解决办法是:

    获取包含您要着色的单词的段落文本,删除原始段落,然后添加文本的每个部分。当您添加每个部分时,appendText 返回一个对添加文本的引用,然后您可以使用 setForegroundColor() 指定其颜色:

    function highlightText() {
      var doc = DocumentApp.openById('<your document id>');
      var textToHighlight = 'dusty death';
      var textLength = textToHighlight.length;
      var paras = doc.getParagraphs();
      var paraText = '';
      var start;
      for (var i=0; i<paras.length; ++i) {
        paraText = paras[i].getText();
        start = paraText.indexOf(textToHighlight);
        if (start >= 0) {
          var preText = paraText.substr(0, start);
          var text = paraText.substr(start, textLength);
          var postText = paraText.substr(start + textLength, paraText.length);
          doc.removeChild(paras[i]);
          var newPara = doc.insertParagraph(i, preText);
          newPara.appendText(text).setForegroundColor('#FF0000');
          newPara.appendText(postText).setForegroundColor('#000000');
        }
      }
    }
    

    【讨论】:

    • 谢谢。这就是我一直在寻找的。您将如何处理段落中出现多次的单词?
    • 同样的概念也适用。您将段落拆开并重新组装。当你重新组装它时,你在每个单词上使用 setForegroudColor。
    【解决方案4】:

    我认为可以使用 DocumentApp 中类 Text 的 setBackgroundColor 方法:https://developers.google.com/apps-script/class_text#setBackgroundColor

    您必须将您的文字检索为文本元素。为此,您可以使用对象 Document 的 find 方法,然后遍历搜索结果并使用 getElement。最后,要将 Element 对象转换为 Text 对象,可以使用asText()

    希望它会工作! ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 2014-08-06
      相关资源
      最近更新 更多