В данном туториале я рассмотрю базовые возможности скриптов в гугл документах и их работу с текстом.
Для начала создаю пустой документ и наполняю его текстом, размером в 5 параграфов из генератора lorem ipsum:
Скрипт №1: Получение количества child элементов.
const doc = DocumentApp.getActiveDocument();
const docBody = doc.getBody();
function getChildren() {
const docChildren = docBody.getNumChildren();
console.log(docChildren)
return docChildren
}
const doc = DocumentApp.getActiveDocument();
— обращение к текущему (активному документу). Данный вариант работает только когда скрипт запускается непосредственно в гугл документе. Иначе надо обращаться по id.
const docBody = doc.getBody();
— стандартное обращение к телу документа. К телу, потому что есть еще хедэры, футеры.
Результат скрипта:
Что такое 10
? Если перейти в документ и посчитать существующие параграфы, их будет ровно 10:
Скрипт №2: Вывод содержимого каждого child элемента в консоль.
function getChildrenContent(){
const childrenQty = getChildren();
for(let i = 0; i < childrenQty; i++){
let childText = docBody.getChild(i).asText().getText();
console.log(childText)
}
}
let childText = docBody.getChild(i).asText().getText();
— получаем чайлда как текст. Потому что еще его можно получить много как что, например как параграф — для работы со свойствами параграфа.
Если возможно получить текст, значит этот текст, как минимум, можно добавить, изменить, удалить.
Скрипт №3: добавления нового текста.
function setChildNewText(){
const newText = "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?"
docBody.getChild(1).asParagraph().setText(newText)
}
const newText =
есть условный новый текст, в данном примере просто текст, но его можно брать из любого другого гугл приложения.
docBody.getChild(1).asParagraph().setText(newText)
— получаю (1) чайлда — или второй параграф — как параграф и устанавливаю в нем новый текст:
Чтобы сверху и снизу добавились отступы (НО !!! НЕ параграфы КАК дополнительные (новые) чайлд элементы) необходимо добавить \n в начало и конец текста:
const newText = "\nBut I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?\n"
Скрипт №4: замена части текста.
function changeChildText(){
const textToBeChanged = "facilisis";
const changedText = "Новый текст";
const changedChild = docBody.getChild(0).asText();
changedChild.replaceText(textToBeChanged,changedText);
}
changedChild.replaceText(textToBeChanged,changedText);
— заменяет текст на необходимый.
В результате выделенное слово ниже:
будет заменено на «Новый текст»:
Скрипт №4 — продолжение: Добавление стилей
Чтобы визуально было понятно, что именно было изменено, добавлю стили:
function setStyles(){
return {
[DocumentApp.Attribute.BACKGROUND_COLOR]: '#A4C400',
[DocumentApp.Attribute.BOLD]:true,
[DocumentApp.Attribute.ITALIC]:true
}
}
делается это через атрибуты документа, которые возвращаются как объект к применению к тому или иному чайлду или боди — будь то параграф или текст.
Далее необходимо немного изменить первоначальный скрипт:
function changeChildText(){
const textToBeChanged = "facilisis";
const changedText = "Новый текст";
const changedChild = docBody.getChild(0).asText();
changedChild.replaceText(textToBeChanged,changedText);
const startPosition = changedChild.findText(changedText).getStartOffset();
changedChild.editAsText().setAttributes(startPosition, (startPosition + changedText.length - 1), setStyles())
}
const startPosition = changedChild.findText(changedText).getStartOffset();
— нахожу измененный текст и получаю его начальную позицию в чайлде — числовое значение «начало окраса»
changedChild.editAsText().setAttributes(startPosition, (startPosition + changedText.length - 1), setStyles())
— устанавливаю атрибуты из функции setStyles()
для измененного текста.
startPosition
— откуда начинать «красить»
startPosition + changedText.length - 1
— где заканчивать красить, как длина текста -1.
Скрипт №5: Удаление (очистка) параграфа.
Допустим, необходимо удалить последний параграф (курсивом) документа:
function delLastParagraph(){
const childrenQty = getChildren() - 1;
docBody.getChild(childrenQty).asParagraph().clear();
}
Зачем надо const childrenQty = getChildren() - 1
; — так как длина на 1 меньше.
docBody.getChild(childrenQty).asParagraph().clear();
— очистка содержимого параграфа.