Объедините два документа Google вместе, используя узел googleapis - PullRequest
0 голосов
/ 19 апреля 2020

Мне нужно объединить два документа Google в один. Я знаю, как скопировать одну заявку c, но мне нужно создать новый документ, содержащий содержимое двух документов Google.

Я придумал следующее:

    const auth = await authorize(credentials)
    const docs = google.docs({version: 'v1', auth})
    const drive = google.drive({version: 'v3', auth})

    const file1ToCopy = await docs.documents.get({documentId: FILE_1_ID})
    const file2ToCopy = await docs.documents.get({documentId: file_2_ID})
    const {body: body1ToCopy} = file1ToCopy.data
    const {body: body2ToCopy} = file2ToCopy.data

    await drive.files.create({
        resource: {
            name: `test ${moment().toString()}`,
            mimeType: 'application/vnd.google-apps.document',
        },
        media: {
            body: {...body1ToCopy, ...body2ToCopy}, // This is not the correct way, body accepts only stream also the bodies received from documents.get are objects, so they probably can not be combined like this...
        },
    })

Как видите, я могу получить тела отдельных документов, но не могу вставить их в один файл.

Кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 20 апреля 2020

Экземпляры Документ не являются допустимыми аргументами для предоставления Файлам: create . Сначала вы должны извлечь содержимое, которое хотите добавить в целевой документ, а затем вставить это содержимое с помощью API Документов.

Я бы предложил вам (1) сделать копию первого из Документов (это копией будет объединенная Do c), (2) извлечение содержимого из второй Do c и (3) вставка содержимого, полученного на предыдущем шаге, в скопированную Do c.

Вы можете сделать что-то вроде следующего:

Шаг 1. Скопируйте первый документ:

Сделайте копию первого документа с Files: copy . Содержимое второго документа будет добавлено к этой копии.

Шаг 2. Извлечение содержимого из второго документа:

Чтобы извлечь содержимое тела из второго Do c, вы необходимо учитывать структуру документа Google : documents.get извлекает экземпляр Document , который содержит содержимое, которое вы хотите добавить к новому документу, но не является самим содержимым.

Содержимое тела в ресурсе документа в основном состоит из списка StructuralElements внутри content, например:

{
  "documentId": string,
  "title": string,
  "body": {
    "content": [
      {
        object (StructuralElement)
      }
    ]
  },
  // Other document props
}

Вам нужно будет перебирать каждый StructuralElement в content и сохранять всю информацию, необходимую для добавления содержимого на следующем шаге (эти будет включать, по крайней мере, тип структурного элемента (поскольку в зависимости от этого должен использоваться тот или иной метод - и текстовое содержимое). Я бы посоветовал вам сохранить эту информацию в массиве объектов для последующего использования.

В качестве примера, довольно приличное объяснение того, как извлечь текст из документа, можно найти здесь (хотя пример содержит только образцы в Java и Python, не должно быть особенно сложно "перевести" это в Node): Извлечь текст из документа . Вы можете хранить информацию о других свойствах, таких как тип элемента (не только текст), но идея базового c очень похожа.

Шаг 3. Добавление содержимого в новый документ:

После успешного извлечения структурных элементов из второго документа вам нужно будет использовать API Docs для добавления этих элементов к объединенному документу, используя documents.batchUpdate .

В зависимости от типа структурного элемента, который вы должны добавлять каждый раз, может потребоваться другой запрос. Например, если структурный элемент представляет собой абзац, содержащий только текст, вы можете использовать InsertTextRequest для добавления текста. Или, если вы хотите добавить таблицу, вам придется использовать InsertTableRequest . Из-за этого сценарию придется проверять каждый тип структурного элемента перед добавлением его в документ.

Ссылка:

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