避免在使用 Google Docs API 创建文档时计算 startIndex 和 endIndex



我已经向自己证明了我可以使用以下代码将文本插入Google文档:

function appendToDocument() {
let offset = 12;
let updateObject = {
documentId: 'xxxxxxx',
resource: {
requests: [{
"insertText": {
"text": "John Doe",
"location": {
"index": offset,
},
},
}],
},
};
gapi.client.docs.documents.batchUpdate(updateObject).then(function(response) {
appendPre('response =  ' + JSON.stringify(response));
}, function(response) {
appendPre('Error: ' + response.result.error.message);
});
}

我的下一步是使用 API 创建一个完整的复杂文档。 我对我需要在文档中维护位置这一事实感到震惊,就像这样

new Location().setIndex(25)

我通过阅读这篇 https://developers.google.com/docs/api/how-tos/move-text 来了解自己的观点

我尝试创建的文档非常动态且非常复杂,将跟踪索引值的编码挑战交给 api 用户而不是 api 设计人员似乎很奇怪。

是否有一种方法或更高级别的 API 允许我在没有这种内务管理的情况下构建文档?

不幸的是,简短的回答是否定的,没有 API 可以让您绕过基本 Google Docs API 所需的索引跟踪 - 至少在构建表时是这样。

我最近不得不自己解决这个问题 - 模板更新和文档构建的结合 - 我基本上最终编写了一个带有辅助函数的中间 API,用于按字符索引搜索和插入。

例如,我一直用于创建表的一个技巧是首先在给定索引处创建一个指定大小的表,然后在第一个单元格中放置一些文本。 然后,我可以在文档对象中搜索包含该文本的tableCells元素,并从那里返回以获取表开始索引。

另一个技巧是,如果您知道文档中有多少种特定类型的对象(如表格(,则可以解析完整的文档对象并跟踪表计数,并在到达要更新/删除的对象时停止(您也可以使用此方法进行创建,但目标文本方法更容易, 我发现(。

从那里进行一些 JSON 解析和试错,您可以找出表中每个单元格的开始索引,并编写函数以编程方式查找和创建/替换/删除。 如果有更简单的方法可以完成所有这些,我还没有找到。 有一个 Github 存储库带有专门用于表的 Google Docs API 包装器,它似乎确实处于活动状态,尽管我在自己编写所有内容后找到了它并且我没有使用它。

以下是一些代码可帮助您入门:

def get_target_table(doc, target_txt):
""" Given a target string to be matched in the upper left column of a table
of a Google Docs JSON object, return JSON representing that table. """
body = doc["body"]["content"]
for element in body:
el_type = list(element.keys())[-1]
if el_type == "table":
header_txt = get_header_cell_text(element['table']).lower().strip()
if target_txt.lower() in header_txt:
return element
return None
def get_header_cell_text(table):
""" Given a table element in Google Docs API JSON, find the text of
the first cell in the first row, which should be a column header. """
return table['tableRows'][0]
['tableCells'][0]
['content'][0]
['paragraph']['elements'][0]
['textRun']['content']

假设您已经创建了一个包含目标文本的表:现在,首先从 API 中提取文档 JSON 对象,然后使用get_target_table()查找与该表相关的 JSON 块。

doc = build("docs", "v1", credentials=creds).documents().get(documentId=doc_id).execute() 
table = get_target_table(doc, "my target")

从那里你会看到嵌套的tableRowstableCells对象,每个单元格内的content都有一个startIndex。 构造表单元格起始索引矩阵,然后,为了填充它们,从右下角的单元格向后工作到左上角,以避免替换存储的索引(如文档和其中一个注释中所建议的那样(。

这绝对有点艰难。 样式表单元格是一个完整的野兽,这是一个令人眼花缭乱的JSON选项迷宫。 文档 API 站点上的交互式 JSON 构造函数工具可用于获取语法写入。

希望这有帮助,祝你好运!

我得到的答案是:您可以在不使用其 JSON 架构的情况下创建文档。

https://developers.google.com/drive/api/v3/manage-uploads#node.js_1

因此,以您选择的格式(HTML,DocX,MD(您可以使用pandoc将MD转换为另一种格式((创建文档,然后上传。

最新更新