创建文档时避免计算startIndex和endIndex

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

我已经向自己证明,我可以使用以下代码将文本插入 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,可以让我构建一个文档而无需这种内务处理?

google-docs-api
3个回答
1
投票

不幸的是,简短的答案是否定的,没有 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")

从那里您将看到嵌套的

tableRows
tableCells
对象,并且每个单元格内的
content
都有一个
startIndex
。构造一个表格单元格起始索引矩阵,然后,为了填充它们,从右下角单元格向后工作到左上角,以避免替换存储的索引(如文档和评论之一中所建议的)。

这绝对是一个有点麻烦。表格单元格的样式是另一种野兽,它是一个令人眼花缭乱的 JSON 选项迷宫。 Docs API 站点上的交互式 JSON 构造工具对于编写语法非常有用。

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


0
投票

查看此文档。它很好地解释了您的问题。 https://jlvalorvc.medium.com/creating-a-google-doc-through-the-api-from-salesforce-apex-34ca779733a

另请查看此视频以处理索引问题。 https://youtu.be/gjXtWQnBKno?si=BuHLxKPwYfws8m6l


-1
投票

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

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

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

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