19

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

4

4 回答 4

20

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

肯定是现在最好的答案!8^)

此脚本是根据此答案中的脚本修改的,可以从 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();
}
于 2013-06-04T17:59:26.113 回答
14

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

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');
    }
  }
}
于 2012-08-22T11:33:42.203 回答
2

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

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

希望它会工作!;)

于 2012-08-22T07:58:26.363 回答
0

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

于 2018-02-05T19:12:37.093 回答