Как объединить несколько документов Google в один файл с помощью скрипта Google Apps

У меня есть документы Google того же формата в папке Google Диска, которые я хочу объединить/объединить в один файл Google Doc, образец объединяемых документов Google выглядит так: это. Вот пример кода, который я пытаюсь использовать для этой цели:

function mergeGoogleDocs() {

  var folderId = "####"; //Where all Google docs currently are
  var folder = DriveApp.getFolderById(folderId);
  var docIDs = [];
  var combinedDoc = DocumentApp.create("Merged Document");
 
  var files = folder.getFiles();

  //Get all file Ids present in a folder
  while (files.hasNext()) {
    var file = files.next();
    docIDs.push(file.getId());
  }

  var baseDoc = DocumentApp.openById(combinedDoc.getId());

  var body = baseDoc.getActiveSection();

  for (var i = 1; i < docIDs.length; ++i) {
    var otherBody = DocumentApp.openById(docIDs[i]).getActiveSection();
    var totalElements = otherBody.getNumChildren();
    for (var j = 0; j < totalElements; ++j) {
      var element = otherBody.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);
      else if (type == DocumentApp.ElementType.INLINE_IMAGE) {
        var image = element.asInlineImage();
        var blob = image.getBlob();
        var imageFile = folder.createFile(blob);
        combinedDoc.getBody().appendImage(imageFile.getBlob());
        }
      else throw new Error('Unknown element type: ' + type);
    }
  }
}

Однако, когда я пытаюсь запустить его, он показывает следующую ошибку:

Исключение: Услуга недоступна: Документы

Я также добавил Документы в разделе «Услуги» слева в редакторе скриптов. Но проблема не решена. Подскажите, пожалуйста, в чем проблема со скриптом и почему он не может объединить все документы в один? Любая помощь приветствуется.

getActiveSection() не является методом класса Document

Cooper 02.05.2023 04:52

@Cooper, спасибо за ваш ответ, я изменил его на baseDoc.getBody(), но он показывает ту же ошибку, я сослался на этот источник скрипта: labnol.org/code/19892-merge-multiple-google -документы

Roomi 02.05.2023 05:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  • Когда я увидел предоставленный вами документ, мне показалось, что встроенное изображение не используется. Но используется позиционированное изображение. В этом случае при копировании абзаца, включающего позиционированное изображение, возникает такая ошибка. Я подумал, что это может быть причиной вашей текущей проблемы.
  • Чтобы получить только документ Google, я хотел бы предложить использовать getFilesByType(MimeType.GOOGLE_DOCS).
  • 15 апреля 2013 года имя Document.getActiveSection() было изменено на Document.getBody(). Ссылка На текущем этапе кажется, что getBody() и getActiveSection() возвращают один и тот же объект DocumentBodySection. Но я хотел бы порекомендовать использовать getBody сейчас.

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

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

function mergeGoogleDocs() {
  var folderId = "###"; //Where all Google docs currently are
  var folder = DriveApp.getFolderById(folderId);
  var docIDs = [];
  var files = folder.getFilesByType(MimeType.GOOGLE_DOCS);

  //Get all file Ids present in a folder
  while (files.hasNext()) {
    var file = files.next();
    docIDs.push(file.getId());
  }

  if (docIDs.length == 0) return;
  var baseDoc = DocumentApp.create("Merged Document");
  var baseDocId = baseDoc.getId();
  var body = baseDoc.getBody();

  for (var i = 0; i < docIDs.length; ++i) {
    var otherBody = DocumentApp.openById(docIDs[i]).getBody();
    var totalElements = otherBody.getNumChildren();
    for (var j = 0; j < totalElements; ++j) {
      var element = otherBody.getChild(j).copy();
      var type = element.getType();
      if (type == DocumentApp.ElementType.PARAGRAPH) {
        var cp = element.asParagraph();
        var positionedImages = cp.getPositionedImages();
        if (positionedImages.length > 0) {
          var img = positionedImages[0];
          var { id, blob, width, height, layout, leftOffset, topOffset } = { id: img.getId(), blob: img.getBlob(), width: img.getWidth(), height: img.getHeight(), layout: img.getLayout(), leftOffset: img.getLeftOffset(), topOffset: img.getTopOffset() };
          cp.removePositionedImage(id);
          var p = body.appendParagraph(cp);
          p.addPositionedImage(blob)
            .setWidth(width)
            .setHeight(height)
            .setLayout(layout)
            .setLeftOffset(leftOffset)
            .setTopOffset(topOffset);
        } else {
          body.appendParagraph(element);
        }
      } else if (type == DocumentApp.ElementType.TABLE) {
        body.appendTable(element);
      } else if (type == DocumentApp.ElementType.LIST_ITEM) {
        body.appendListItem(element);
      } else if (type == DocumentApp.ElementType.INLINE_IMAGE) {
        var image = element.asInlineImage();
        var blob = image.getBlob();
        var imageFile = folder.createFile(blob);
        combinedDoc.getBody().appendImage(imageFile.getBlob());
      } else {
        throw new Error('Unknown element type: ' + type);
      }
    }

    // Below script is used for removing the duplicated image. But, this might not be required to be used.
    baseDoc.saveAndClose();
    baseDoc = DocumentApp.openById(baseDocId);
    body = baseDoc.getBody();
    var lastP = body.getParagraphs().pop();
    var lastPImage = lastP.getPositionedImages();
    if (lastPImage.length != 0) {
      lastP.removePositionedImage(lastPImage[0].getId());
    }
    body.appendPageBreak();
  }
}
  • Когда этот сценарий используется в предоставленном вами документе, я подтверждаю, что ваш образец документа может быть объединен в «Объединенный документ».

Примечание:

  • Этот модифицированный скрипт предназначен для предоставленного вами документа. Когда вы изменяете документ, этот скрипт может быть не в состоянии использоваться. Пожалуйста, будьте осторожны с этим.

Другие вопросы по теме