2012-08-22 19 views

Odpowiedz

8

Jest to lepsze rozwiązanie:

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

Poprzedni Odpowiedź:

Kluczem do sukcesu jest bycie w stanie odwołać się tylko te słowa, które chcesz pokolorować.

Moje rozwiązanie jest:

Get tekst akapitu, który zawiera słowa, które chcesz kolor, usunąć oryginalny akapit, następnie dodać każdy fragment tekstu z powrotem. Jak można dodać każdą część z powrotem appendText zwraca odwołanie do tylko tekst dodał, wtedy można określić jego kolor z 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

Dziękuję. Tego właśnie szukałem. Jak radzisz sobie ze słowem występującym więcej niż raz w akapicie? – user1613077

+0

Ta sama zasada dotyczy. Rozsuwasz paragraf i składasz go ponownie. Po ponownym złożeniu, używasz setForegroudColor na każdym słowie. – Weehooey

2

myślę, że to możliwe dzięki metodzie setBackgroundColor klasy tekstów w DocumentApp: https://developers.google.com/apps-script/class_text#setBackgroundColor

Musisz odzyskać swoje słowa jako elementy tekstu. W tym celu możesz użyć metody szukania dokumentu obiektu, a następnie powtórzyć wyniki wyszukiwania i użyć getElement. Na koniec, aby przekształcić obiekt Element w obiekt tekstowy, można użyć asText().

Mam nadzieję, że to zadziała! ;)

13

Wraz z wprowadzeniem skryptów dokument związany, to teraz możliwe, aby funkcja podświetlania tekstu, która jest wywoływana z niestandardowego menu.

Z pewnością THIS jest teraz najlepszą odpowiedzią! 8 ^)

Ten skrypt został zmodyfikowany z tego w this answer i może zostać wywołany z interfejsu użytkownika (bez parametrów) lub skryptu.

+0

Masz findText() do pracy z RegEx? –

+0

Tak, findText() działa z RegEx dla 'searchpattern'. W odpowiedzi dostajemy ciąg znaków od użytkownika, więc musisz wygenerować z tego RegEx; zobacz [tę odpowiedź] (http://stackoverflow.com/questions/4371565). – Mogsdad

+0

Dobra odpowiedź ... ale czy nie jest to kwestia koloru "ForeGround"? ;) nie wygląda jednak trudniej ekstrapolować. –

0

Jest dostępny jako dodatek do Dokumentów Google o nazwie Podświetlenie tekstu z wieloma instancjami. Wskazówki: Początkowo nie działało, ale zamknąłem dokument i ponownie go otworzyłem, a następnie zadziałało. Wtedy to nie działało od czasu do czasu, ale odkryłem, że znaki specjalne w twoim ciągu tekstowym mogą je złamać; Myślę, że miałem ciąg + w moim łańcuchu i po prostu nic nie zrobił. Ale bez specjalnych znaków, działa świetnie. Naprawdę mi pomogłem.

+0

Czy tekst wielu wystąpień może być używany w Skryptach Google Apps? Pytanie dotyczyło automatycznego kolorowania i nie mogłem znaleźć interfejsu programisty dla tego dodatku. –