2012-08-22 19 views

Respuesta

8

Ésta es una solución mejor:

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); 
    } 
    } 
} 

anterior respuesta:

La clave es ser capaz de hacer referencia sólo las palabras que desea colorear.

Mi solución es:

obtener el texto del párrafo que contiene las palabras que desea colores, retire el párrafo original, y después agregue una parte del texto de nuevo. A medida que agrega cada parte posterior del appendText devuelve una referencia a sólo el texto añadido, a continuación, puede especificar su color con 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'); 
    } 
    } 
} 
+0

Gracias. Eso es lo que estaba buscando. ¿Cómo manejarías la palabra que aparece más de una vez en el párrafo? – user1613077

+0

Se aplica el mismo concepto. Sacas el párrafo y lo vuelves a armar. A medida que lo vuelve a armar, usa setForegroudColor en cada palabra. – Weehooey

2

creo que es posible con el método setBackgroundColor de texto en clase DocumentApp: https://developers.google.com/apps-script/class_text#setBackgroundColor

Vas a tener que recuperar sus palabras como elementos de texto. Para hacerlo, puede usar el método de búsqueda de su objeto Documento, luego iterar sobre los resultados de búsqueda y usar getElement. Finalmente, para convertir su objeto Element en un objeto Text, puede usar asText().

¡Espero que funcione! ;)

13

Con la introducción de secuencias de comandos de documentos de ruedas, ahora es posible hacer una función de resaltado de texto que se invoca desde un menú personalizado.

Surely THIS es la mejor respuesta ahora! 8 ^)

Esta secuencia de comandos se modificó a partir del uno en this answer, y se puede llamar desde la interfaz de usuario (sin parámetros) o una secuencia de comandos.

/** 
* 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(); 
} 
+0

¿Tiene findText() para trabajar con un RegEx? –

+0

Sí, findText() funciona con RegEx para el 'searchpattern'. En la respuesta, recibimos una entrada de cadena del usuario, por lo que necesitaría generar un RegEx a partir de eso; ver [esta respuesta] (http://stackoverflow.com/questions/4371565). – Mogsdad

+0

Una buena respuesta ... pero ¿no es la pregunta sobre el color "ForeGround"? ;) no parece difícil extrapolar desde allí. –

0

Esto está disponible como un complemento de documentos de Google denominado Multi-instance Text Highlighting. Sugerencias: Al principio no pareció funcionar, pero cerré mi documento y lo volví a abrir, y luego funcionó. Entonces no pareció funcionar de vez en cuando, pero descubrí que los caracteres especiales en su cadena de texto pueden romperlo; Creo que tenía un + en mi cadena y simplemente no hice nada. Pero sin personajes especiales, funciona genial. Realmente me ayudó.

+0

¿Se puede utilizar Resaltar texto de varias instancias desde Google Apps Script? La pregunta era sobre el coloreado automático y no pude encontrar una interfaz de desarrollador para este complemento. –

Cuestiones relacionadas