使用节点googleapis将两个google文档合并在一起

问题描述 投票:0回答:1

我需要将两个Google文档合并为一个。我知道如何复制一个文档,但是我需要创建一个包含两个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...
        },
    })

如您所见,我可以获取单个文档的正文,但无法将它们插入一个文件中。

有人可以帮我吗?

javascript node.js google-drive-api google-docs-api
1个回答
0
投票

Document的实例不是提供给Files: create的有效参数。您应该首先检索要添加到目标文档中的内容,然后使用Docs API插入这些内容。

我建议您(1)制作第一个文档的副本(此副本将成为合并的文档),(2)从第二个文档中检索内容,(3)插入在复制文档的上一步。

您可以按照以下方式进行操作:

步骤1.复制第一个文档:

Files: copy复制第一份文档。第二份文档中的内容将附加到此副本中。

步骤2.从第二个文档中提取内容:

为了从第二个文档中提取正文内容,您必须考虑the structure of a Google Documentdocuments.get检索Document的实例,该实例包含您要附加到新文档的内容文档,但不是内容本身。

Document resource中的主体内容基本上是由StructuralElements内的content列表组成,如下所示:

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

[您将必须遍历StructuralElement中的每个content,并存储在下一步中附加内容所需的所有信息(这些将至少包括结构元素的类型,因为依赖于此,一种方法或其他内容(以及文本内容)。我建议您将这些信息存储到对象数组中,以备后用。

作为示例,可以在此处找到有关如何从文档中提取文本的相当不错的解释(即使示例仅包含Java和Python中的示例,将其“翻译”为Node也不应该特别困难) ):Extract the text from a document。您可以保留其他属性的信息,例如元素类型(不仅是文本),但是基本思想非常相似。

步骤3.将内容附加到新文档:

一旦成功从第二个文档中检索了结构元素,就必须使用Docs API使用documents.batchUpdate将这些元素附加到合并的文档中。

取决于您每次必须附加哪种类型的结构元素,可能需要不同的请求。例如,如果结构元素是仅包含文本的段落,则可以使用InsertTextRequest附加文本。或者,如果要附加表,则必须使用InsertTableRequest。因此,该脚本必须在将每种结构元素类型附加到文档之前先进行检查。

参考:

© www.soinside.com 2019 - 2024. All rights reserved.