我需要将两个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...
},
})
如您所见,我可以获取单个文档的正文,但无法将它们插入一个文件中。
有人可以帮我吗?
Document的实例不是提供给Files: create的有效参数。您应该首先检索要添加到目标文档中的内容,然后使用Docs API插入这些内容。
我建议您(1)制作第一个文档的副本(此副本将成为合并的文档),(2)从第二个文档中检索内容,(3)插入在复制文档的上一步。
您可以按照以下方式进行操作:
用Files: copy复制第一份文档。第二份文档中的内容将附加到此副本中。
为了从第二个文档中提取正文内容,您必须考虑the structure of a Google Document:documents.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。您可以保留其他属性的信息,例如元素类型(不仅是文本),但是基本思想非常相似。
一旦成功从第二个文档中检索了结构元素,就必须使用Docs API使用documents.batchUpdate将这些元素附加到合并的文档中。
取决于您每次必须附加哪种类型的结构元素,可能需要不同的请求。例如,如果结构元素是仅包含文本的段落,则可以使用InsertTextRequest附加文本。或者,如果要附加表,则必须使用InsertTableRequest。因此,该脚本必须在将每种结构元素类型附加到文档之前先进行检查。