В Google Docs примените форматирование маленьких заглавных букв к части строки - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь написать сценарий, чтобы заменить отдельные слова на их заглавные буквы. Я создал заголовок6 в стиле маленьких заглавных букв в своем документе, но его можно применять только к текстовому диапазону в целом. Можно ли применить стиль частично?

Вот моя попытка:

function applyHeading(textToFind){
   var style = {};
   style[DocumentApp.Attribute.HEADING] = DocumentApp.ParagraphHeading.HEADING6;
   var body = DocumentApp.getActiveDocument().getBody();
   var foundElement = body.findText(textToFind);

    while (foundElement != null) {
      // Get the text object from the element
      var foundText = foundElement.getElement().asText();

      // Where in the element is the found text?
      var start = foundElement.getStartOffset();
      var end = foundElement.getEndOffsetInclusive();

      var newText = foundText.getText().substring(0, start) + textToFind.toLowerCase() + foundText.getText().substring(end + 1);
      foundText.setText(newText);
      // Set style -- does not work
      foundText.setAttributes(start, end, style);

      // Find the next match
      foundElement = body.findText(textToFind, foundElement);
    }
}

1 Ответ

0 голосов
/ 29 марта 2019
  • Вы хотите преобразовать найденные тексты в маленькие заглавные буквы.

Я мог понять, как выше. Если мое понимание верно, как насчет этого примера сценария?

К сожалению, на текущем этапе в Document Service пока нет способов изменить часть текста на маленькие заглавные буквы. Я думаю, что это может быть достигнуто с помощью Document Service в будущем обновлении. Но в качестве текущего обходного пути я подумал, что недавно выпущенный Google Docs API может быть использован для достижения этой цели. Поэтому я бросил вызов этому.

Чтобы использовать следующий пример сценария, прежде чем запускать сценарий, включите API Google Docs на консоли API следующим образом.

Включить API Google Docs на консоли API:

  • в редакторе скриптов
    • Ресурсы -> Проект облачной платформы
    • Просмотр консоли API
    • На начальном этапе нажмите «Исследовать и включить API».
    • В левой части нажмите Библиотека.
    • В поле «Поиск API и сервисов» введите «Документы». И нажмите «API Документов Google».
    • Нажмите кнопку включения.
    • Если API уже включен, не выключайте его.

Расход:

Ход выполнения примера сценария выглядит следующим образом.

  1. Поиск текстов в Документе Google с помощью метода findText Сервиса документов.
  2. Получить все содержимое из Документа Google, используя метод get API Google Docs.
    • Каждый контент соответствует каждому абзацу документа.
  3. Создание диапазонов всех найденных текстов с использованием извлеченного содержимого и объектов, извлеченных методом findText.
  4. Изменить стиль текста найденных текстов с помощью метода batchUpdate API Документов Google.

Пример сценария:

Пример сценария для сценария с контейнером в Google Document. Скопируйте и вставьте следующий скрипт в редактор скриптов и запустите функцию sample().

function applySmallCapital(textToFind) {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  var id = doc.getId();
  var baseUrl = "https://docs.googleapis.com/v1/documents/";
  var headers = {"Authorization": "Bearer " + ScriptApp.getOAuthToken()};
  var params = {headers: headers};

  // Retrieve all contents from Google Document.
  var res = UrlFetchApp.fetch(baseUrl + id + "?fields=*", params);
  var obj = JSON.parse(res.getContentText());

  // In order to use at Google Docs API, create ranges of found texts.
  var foundElement = body.findText(textToFind);
  var ranges = [];
  while (foundElement != null) {
    var p = foundElement.getElement();
    if (p.getType() == DocumentApp.ElementType.TEXT) p = p.getParent();
    if (p.getType() == DocumentApp.ElementType.PARAGRAPH || p.getType() == DocumentApp.ElementType.LIST_ITEM) {
      var content = obj.body.content[body.getChildIndex(p) + 1];
      ranges.push({
        startIndex: content.startIndex + foundElement.getStartOffset(),
        endIndex: content.startIndex + foundElement.getEndOffsetInclusive(),
      });
    }
    foundElement = body.findText(textToFind, foundElement);
  }

  // Modify textStyle of found texts.
  if (ranges.length > 0) {
    var resource = {requests: ranges.map(function(e) {return {
      updateTextStyle: {
        textStyle: {smallCaps: true},
        range: e,
        fields: "smallCaps"}
      }
    })};
    params.method = "post";
    params.contentType = "application/json";
    params.payload = JSON.stringify(resource);
    UrlFetchApp.fetch(baseUrl + id + ":batchUpdate", params);
  }
}

function sample() {
  applySmallCapital("this should be small caps");
}

Результат:

От:

enter image description here

Кому:

enter image description here

  • Для тестирования этого скрипта были использованы ваши образцы текста в вашем общем документе. Вы можете видеть, что текст «это должны быть маленькие заглавные буквы» изменен на маленькие заглавные буквы.

Ссылки:

Добавлено:

Когда используется API Google Docs для Advanced Google Services, приведенный выше сценарий выглядит следующим образом. Когда вы используете это, включите Google Docs API в Advanced Google Services. В этом скрипте стоимость стала немного ниже, чем выше, за счет сокращения одного цикла.

function applySmallCapital(textToFind) {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  var id = doc.getId();

  // Retrieve all contents from Google Document.
  var obj = Docs.Documents.get(id, {fields: "*"})

  // In order to use at Google Docs API, create ranges of found texts.
  var foundElement = body.findText(textToFind);
  var requests = [];
  while (foundElement != null) {
    var p = foundElement.getElement();
    if (p.getType() == DocumentApp.ElementType.TEXT) p = p.getParent();
    if (p.getType() == DocumentApp.ElementType.PARAGRAPH || p.getType() == DocumentApp.ElementType.LIST_ITEM) {
      var content = obj.body.content[body.getChildIndex(p) + 1];
      requests.push({
      updateTextStyle: {
        textStyle: {smallCaps: true},
        range: {
          startIndex: content.startIndex + foundElement.getStartOffset(),
          endIndex: content.startIndex + foundElement.getEndOffsetInclusive(),
        },
        fields: "smallCaps"}
      });
    }
    foundElement = body.findText(textToFind, foundElement);
  }

  // Modify textStyle of found texts.
  if (requests.length > 0) {
    var resource = {requests: requests};
    Docs.Documents.batchUpdate(resource, id);
  }
}

function sample() {
  applySmallCapital("this should be small caps");
}

Ссылка:

...