Удалить горизонтальную линию в Google Doc с помощью скрипта Google Apps - PullRequest
1 голос
/ 06 июля 2019

У меня есть Документ Google с текстом, за которым следует горизонтальная линия ниже.Если пользователь выбирает «НЕТ» из ui.alert, мне нужно удалить весь этот текст (просто с помощью регулярных выражений) и горизонтальную линию.Я понятия не имею, как удалить эту горизонтальную линию с помощью скрипта Google Apps.Ничего не могу найти в документации.У кого-нибудь есть идеи?Спасибо!

var regExpFirstBriefing = "[A-Z \(\)]{42}\\v+[A-Za-z\.\", ]*[\\v+]{1}"; // This accounts for all the text I need removed along with an extra new line. The horizontal line is the next line.

  // Ask user if this is the first briefing
  var responseFirstBriefing = ui.alert('Question here...' , ui.ButtonSet.YES_NO);
  if (responseFirstBriefing == ui.Button.YES) {
    document.replaceText(regExpFirstBriefing, '');
  }

1 Ответ

1 голос
/ 06 июля 2019
  • Вы хотите удалить искомый текст в Документе Google.
  • Вы хотите удалить "HORIZONTAL_RULE" под текстом.
  • Вы хотите запустить выше, когда пользователь выбирает «НЕТ» из ui.alert.
  • Вы хотите добиться этого с помощью Google Apps Script.

Если мое понимание верно, как насчет этого примера сценария? Хотя я не уверен в вашем настоящем Документе, из вашего объяснения я представил его и подготовил образец сценария. Пожалуйста, подумайте об этом как один из нескольких ответов. Процесс этого примера сценария выглядит следующим образом.

Поток:

  1. Поиск текста поиска осуществляется с помощью findText().
  2. Поместить элемент искомого текста в массив.
    • Этот массив используется для удаления элемента.
  3. Поиск "HORIZONTAL_RULE" ниже искомого текста.
    • В этом случае, когда «HORIZONTAL_RULE» не соседствует с искомым текстом, поиск «HORIZONTAL_RULE» осуществляется с помощью offsetValue. В этом примере выполняется поиск до 3 абзацев.
    • Когда "HORIZONTAL_RULE" найден, элемент помещается в массив.
  4. Удалить элементы в массиве.
    • Из вашего скрипта искомый текст очищается. В этом случае абзац не удаляется.
    • Из вашего вопроса о "HORIZONTAL_RULE" абзац удален.

Когда вышеуказанный поток отражается в сценарии, он становится следующим:

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

Когда вы запускаете скрипт, тексты, найденные с помощью regExpFirstBriefing, очищаются, а "HORIZONTAL_RULE" под текстом также удаляется.

function myFunction() {
  var document = DocumentApp.getActiveDocument(); // Added
  var ui = DocumentApp.getUi(); // Added

  var regExpFirstBriefing = "[A-Z \(\)]{42}\\v+[A-Za-z\.\", ]*[\\v+]{1}";
  var responseFirstBriefing = ui.alert('Question here...' , ui.ButtonSet.YES_NO);
  if (responseFirstBriefing == ui.Button.YES) {
    document.replaceText(regExpFirstBriefing, '');

  // I added below script.
  } else if (responseFirstBriefing == ui.Button.NO) {
    var offsetValue = 3; // When "HORIZONTAL_RULE" doesn't adjacent the searched text, "HORIZONTAL_RULE" is searched by "offsetValue". In this sample, it is searched up to 3 paragraph ahead.
    var body = document.getBody();
    var r = body.findText(regExpFirstBriefing);
    var remove = [];
    while (r) {
      remove.push(r.getElement().asText())
      var parentParagraph = body.getChildIndex(r.getElement().getParent());
      var totalChildren = body.getNumChildren();
      for (var offset = 1; offset <= offsetValue; offset++) {
        if (parentParagraph + offset <= totalChildren) {
          var nextParagraph = body.getChild(parentParagraph + offset);
          if (nextParagraph.getType() === DocumentApp.ElementType.PARAGRAPH) {
            var c = nextParagraph.asParagraph().getNumChildren();
            for (var i = 0; i < c; i++) {
              var childOfNextParagraph = nextParagraph.asParagraph().getChild(i);
              if (childOfNextParagraph.getType() === DocumentApp.ElementType.HORIZONTAL_RULE) {
                remove.push(childOfNextParagraph.asHorizontalRule());
                break;
              }
            }
            if (remove[remove.length - 1].getType === DocumentApp.ElementType.HORIZONTAL_RULE) {
              break;
            }
          }
        }
      }
      r = body.findText(regExpFirstBriefing, r);
    }
    for (var i = remove.length - 1; i >=0; i--) {

      /////
      // If you want to delete the paragraph of searched text, please delete this if statement.
      if (remove[i].getType() === DocumentApp.ElementType.TEXT) {
        remove[i].removeFromParent();
        continue;
      }
      /////

      remove[i].getParent().asParagraph().removeFromParent();
    }
  }
}

Примечание:

  • Этот сценарий предполагает, что регулярное выражение [A-Z \(\)]{42}\\v+[A-Za-z\.\", ]*[\\v+]{1} работает для вашего документа.
  • Если вы хотите удалить абзац искомого текста, удалите его, если из приведенного выше сценария указано следующее.

    if (remove[i].getType() === DocumentApp.ElementType.TEXT) {
      remove[i].removeFromParent();
      continue;
    }
    

Ссылки:

Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, я прошу прощения В то время, чтобы правильно понять вашу ситуацию, можете ли вы предоставить образец документа, который вы хотите использовать? Конечно, пожалуйста, удалите вашу личную информацию. Я хотел бы подтвердить проблему от этого.

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