Как установить определенное количество пробелов или отступов перед абзацем в Документах Google с помощью скрипта Google Apps - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть сценарий из 20 строк, и я хочу убедиться, что каждый абзац имеет отступ ровно один раз.

Надстройка называется Autoformat, и это надстройка Google Docs, которую я сделал с кем-то, использующим Google Apps Script, который форматирует документ пользователя или эссе в формате MLA. Я

function myFunction() {
  /*
  This function turns the document's format into standard MLA.
  */

  var body = DocumentApp.getActiveDocument().getBody();
  body.setFontSize(12); // Set the font size of the contents of the documents to 9
  body.setForegroundColor('#000000');
  body.setFontFamily("Times New Roman");

  // Loops through paragraphs in body and sets each to double spaced
  var paragraphs = body.getParagraphs();
  for (var i = 3; i < paragraphs.length; i++) { // Starts at 3 to exclude first 4 developer-made paragraphs
      var paragraph = paragraphs[i];
      paragraph.setLineSpacing(2);
      // Left align the first cell.
      paragraph.setAlignment(DocumentApp.HorizontalAlignment.LEFT);
      // One indent
      paragraph.editAsText().insertText(0, "\t"); // Adds one tab every time
  }
  var bodyText = body.editAsText();
  bodyText.insertText(0, 'February 3, 1976\nMrs. Smith\nYour Name Here\nSocial Studies\n');
  bodyText.setBold(false);
}

Код, который я пробовал, не работает. Но мои ожидаемые результаты состоят в том, что для каждого абзаца в цикле for в myFunction() перед первым словом в каждом абзаце ровно 4 пробела.


Вот пример: https://docs.google.com/document/d/1sMztzhOehzheRdqumC6PLnvk4qJgUCSE0irjTZ0FjTQ/edit?usp=sharing

Если пользователь использует автоформат, но уже имеет абзацы с отступом ... Placeholder text with indented paragraph using snipping tool Placeholder text indented twice

Обновление

Я исследовал использование метода Paragraph.setIndentFirstLine(). Когда я устанавливаю его на четыре, он устанавливает его на 1 пробел. Теперь я понимаю, что это потому, что точки и пробелы - это не одно и то же. На какое число мне нужно умножиться, чтобы получить четыре пробела в баллах?

1 Ответ

1 голос
/ 22 апреля 2019

Давайте рассмотрим несколько основных операций идентификации: вручную и по сценарию.На следующем рисунке показано, как сделать отступ для текущего абзаца (курсор остается внутри него).

Manual indenting of the current paragraph

Обратите внимание, что единицы измерения - это сантиметры.Также обратите внимание, что в абзаце нет начальных пробелов или табуляций, они нам не нужны.

Предположим, мы хотим получить значения отступа в сценарии и применить их к следующему абзацу.Посмотрите на код ниже:

function myFunction() {
  var ps = DocumentApp.getActiveDocument().getBody().getParagraphs();
  // We work with the 5-th and 6-th paragraphs indeed
  var iFirst = ps[5].getIndentFirstLine();
  var iStart = ps[5].getIndentStart();
  var iEnd = ps[5].getIndentEnd();
  Logger.log([iFirst, iStart, iEnd]);
  ps[6].setIndentFirstLine(iFirst);
  ps[6].setIndentStart(iStart);
  ps[6].setIndentEnd(iEnd);
}

Если вы запустите и посмотрите журнал, вы увидите что-то вроде этого: [92.69291338582678, 64.34645669291339, 14.173228346456694].Не удивительно, у нас есть типографские точки вместо сантиметров .(1cm = 28.3465pt) Таким образом, мы можем точно измерить и изменить любые значения отступа абзаца.

Добавление

По некоторым причинам вы можете захотеть контролировать число пробелов в началеабзаца.Это также возможно с помощью сценариев, но это не влияет на «левый» или «правый» абзацы абзаца.

Пример кода ниже для аналогичной задачи: подсчитать число пробелов в 5-м абзаце и сделатьтакое же количество пробелов в начале следующего.

function mySpaces() {
  var ps = DocumentApp.getActiveDocument().getBody().getParagraphs();
  // We work with the 5-th and 6-th paragraphs indeed
  var spacesCount = getLeadingSpacesCount(ps[5]);
  Logger.log(spacesCount);
  var diff = getLeadingSpacesCount(ps[6]) - spacesCount;
  if (diff > 0) {
    ps[6].editAsText().deleteText(0, diff - 1);
  } else if (diff < 0) {
    var s = Array(1 - diff).join(' ');
    ps[6].editAsText().insertText(0, s);
  }
}


function getLeadingSpacesCount(p) {
  var found = p.findText("^ +");
  return found ? found.getEndOffsetInclusive() + 1 : 0;
}

Мы использовали методы deleteText () и insertText () класса Text для правильных исправлений и findText() , чтобы найти пробелы, если таковые имеются.Обратите внимание, что последний аргумент метода - это строка, представляющая регулярное выражение.Соответствует «всем ведущим пробелам», если они существуют.См. подробнее о синтаксисе регулярных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...