Добавить абзац или таблицу et c. на курсоре - PullRequest
1 голос
/ 07 января 2020

У меня есть функция для добавления содержимого отдельного документа Google в точке курсора в активном документе, но я не смог заставить его работать. Я продолжаю получать исключение «Элемент не содержит указанный дочерний элемент», а затем содержимое вставляется в конец документа, а не в точку курсора!

function AddTable() {
  //here you need to get document id from url (Example, 1oWyVMa-8fzQ4leCrn2kIk70GT5O9pqsXsT88ZjYE_z8)
  var FileTemplateFileId = "1MFG06knf__tcwHWdybaBk124Ia_Mb0gBE0Gk8e0URAM"; //Browser.inputBox("ID der Serienbriefvorlage (aus Dokumentenlink kopieren):");
  var doc = DocumentApp.openById(FileTemplateFileId);
  var DocName = doc.getName();

  //Create copy of the template document and open it
  var docCopy = DocumentApp.getActiveDocument();
  var totalParagraphs = doc.getBody().getParagraphs(); // get the total number of paragraphs elements
  Logger.log(totalParagraphs);
  var cursor = docCopy.getCursor();
  var totalElements = doc.getNumChildren();
  var elements = [];
  for (var j = 0; j < totalElements; ++j) {
    var body = docCopy.getBody();
    var element = doc.getChild(j).copy();
    var type = element.getType();
    if (type == DocumentApp.ElementType.PARAGRAPH) {
      body.appendParagraph(element);
    } else if (type == DocumentApp.ElementType.TABLE) {
      body.appendTable(element);
    } else if (type == DocumentApp.ElementType.LIST_ITEM) {
      body.appendListItem(element);
    }
    //    ...add other conditions (headers, footers...
  }
  Logger.log(element.editAsText().getText());
  elements.push(element); // store paragraphs in an array
  Logger.log(element.editAsText().getText());

  for (var el = 0; el < elements.length; el++) {
    var paragraph = elements[el].copy();
    
  var doc = DocumentApp.getActiveDocument();
  var bodys = doc.getBody();
  var cursor = doc.getCursor();
  var element = cursor.getElement();
  var container = element.getParent();
  try {
    var childIndex = body.getChildIndex(container);
    bodys.insertParagraph(childIndex, paragraph);
  } catch (e) {
    DocumentApp.getUi().alert("There was a problem: " + e.message);
  }
  
  }
}

1 Ответ

1 голос
/ 08 января 2020
  • Вы хотите скопировать объекты (абзацы, таблицы и списки) из документа 1MFG06knf__tcwHWdybaBk124Ia_Mb0gBE0Gk8e0URAM в активный документ.
  • Вы хотите скопировать объекты в положение курсора на активном документе. Документ.
  • Вы хотите добиться этого с помощью Google Apps Script.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Точки модификации:

  • В вашем сценарии appendParagraph, appendTable и appendListItem используются на 1-м для л oop. Я думаю, что причина, по которой скопированные объекты помещаются в последний документ, заключается именно в этом.
  • var body = docCopy.getBody(); можно поместить в out для for l oop.
  • В вашем случае, я думаю, что при изменении 1-го для l oop, 2-го для l oop не требуется.

Когда вышеуказанные точки отражаются в вашем сценарии, он становится

Модифицированный скрипт:

function AddTable() {
  var FileTemplateFileId = "1MFG06knf__tcwHWdybaBk124Ia_Mb0gBE0Gk8e0URAM";
  var doc = DocumentApp.openById(FileTemplateFileId);
  var docCopy = DocumentApp.getActiveDocument();
  var body = docCopy.getBody();
  var cursor = docCopy.getCursor();
  var cursorPos = docCopy.getBody().getChildIndex(cursor.getElement());
  var totalElements = doc.getNumChildren();
  for (var j = 0; j < totalElements; ++j) {
    var element = doc.getChild(j).copy();
    var type = element.getType();
    if (type == DocumentApp.ElementType.PARAGRAPH) {
      body.insertParagraph(cursorPos + j, element);
    } else if (type == DocumentApp.ElementType.TABLE) {
      body.insertTable(cursorPos + j, element);
    } else if (type == DocumentApp.ElementType.LIST_ITEM) {
      body.insertListItem(cursorPos + j, element);
    }
  }
}
  • Кажется, что DocName не используется в вашем скрипте.

Ссылки:

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

...