Я пытаюсь выделить определенные слова в своем Документе Google. Я знаю, что я могу заменить текст, используя document.replace, но он заменяет только строку, а не форматирование. Есть ли способ заменить строку цветной строкой с помощью Google Apps Script?
Могу ли я покрасить определенные слова в Google Документе с помощью Google Apps Script?
Ответ 1
Это лучшее решение:
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');
}
}
}
Ответ 2
С введением скриптов, связанных с документами, теперь можно сделать функцию выделения текста, которая вызывается из пользовательского меню.
Конечно, ЭТО - лучший ответ! 8 ^)
Этот script был изменен с помощью этого ответа и может быть вызван из пользовательского интерфейса (без параметров) или script.
/**
* 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();
}
Ответ 3
Я думаю, что это возможно с помощью метода setBackgroundColor класса Text в DocumentApp: https://developers.google.com/apps-script/class_text#setBackgroundColor
Вам нужно будет вернуть свои слова в виде текстовых элементов. Для этого вы можете использовать метод find вашего документа Document, затем перебирать результаты поиска и использовать getElement. Наконец, чтобы преобразовать объект Element в объект Text, вы можете использовать asText()
.
Надеюсь, это сработает!;)
Ответ 4
Это доступно как дополнение к документам Google с именем Multi-instance Text Highlighting. Подсказки: сначала это не сработало, но я закрыл свой документ и снова открыл его, а затем он сработал. Затем, похоже, это не работало, но я узнал, что специальные символы в вашей текстовой строке могут сломать ее; Я думаю, что у меня была + в моей строке, и она просто ничего не делала. Но без особых символов он отлично работает. Действительно помог мне.