Скрипты в google docs, Часть 1: текст, параграфы, стили.

В данном туториале я рассмотрю базовые возможности скриптов в гугл документах и их работу с текстом.

Для начала создаю пустой документ и наполняю его текстом, размером в 5 параграфов из генератора lorem ipsum:

google-doc-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(); — стандартное обращение к телу документа. К телу, потому что есть еще хедэры, футеры.

Результат скрипта:

console-log-getNumChildren
10 child элементов

Что такое 10? Если перейти в документ и посчитать существующие параграфы, их будет ровно 10:

google-doc-getNumChildren

Скрипт №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(); — получаем чайлда как текст. Потому что еще его можно получить много как что, например как параграф — для работы со свойствами параграфа.

console-log-getChild-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) чайлда — или второй параграф — как параграф и устанавливаю в нем новый текст:

google-doc-setText
Второй параграф с текстом

Чтобы сверху и снизу добавились отступы (НО !!! НЕ параграфы КАК дополнительные (новые) чайлд элементы) необходимо добавить \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); — заменяет текст на необходимый.

В результате выделенное слово ниже:

google doc text to be changed

будет заменено на «Новый текст»:

google doc changed  text

Скрипт №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.

google doc changed text with styles
изменённый текст со стилями

Скрипт №5: Удаление (очистка) параграфа.

Допустим, необходимо удалить последний параграф (курсивом) документа:

google doc paragraph to be deleted
function delLastParagraph(){
  
  const childrenQty = getChildren() - 1;
  
  docBody.getChild(childrenQty).asParagraph().clear();

}

Зачем надо const childrenQty = getChildren() - 1; — так как длина на 1 меньше.

docBody.getChild(childrenQty).asParagraph().clear(); — очистка содержимого параграфа.

google doc result after delete

Добавить комментарий