Google Docs API v1-如何创建列表嵌套元素?

时间:2019-09-18 23:55:58

标签: google-docs-api

因此有一个示例:https://developers.google.com/docs/api/how-tos/lists

如何制作嵌套列表元素?那么添加Sub-Item One的示例看起来如何?

1 个答案:

答案 0 :(得分:0)

对于Google Docs API的第1版,它非常复杂。我发现的最佳方法是将文档创建过程分为两个阶段:

  1. 将缩进的文本与命名范围一起放入
  2. 样式命名范围

第一阶段和第二阶段文档之间的客户端正在刷新,命名范围已重新计算到位置。多亏了这种设计,我才能完成所有工作。重要的技巧是在阶段1中,按照教程中的建议以相反的顺序发送所有请求。

第1阶段的请求或多或少是这样的:

requests.add(
            new Request()
                    .setCreateNamedRange(
                            new CreateNamedRangeRequest()
                                    .setName(rangeName)
                                    .setRange(
                                            new Range()
                                                    .setStartIndex(1)
                                                    .setEndIndex(outputText.length() + 1))));
    requests.add(
            new Request()
                    .setInsertText(
                            new InsertTextRequest()
                                    .setText(outputText)
                                    .setLocation(new Location().setIndex(1))));

请注意,在插入文本之前正在创建命名范围请求。在准备好所有请求之后,请到阶段1结束,然后将它们撤消,然后将命名范围请求正确地应用于刚刚插入的文本。

另一个重要的事情是rangeName参数。对于文本的单行类型(标题,标题等),我不在乎,我将它们命名为html-ish(标题,h1,h2,p)。在多行部分的前面(例如问题的项目符号列表),用唯一的名称命名每个多行部分很重要。因此,如果我的文档中有3个列表,则每个列表中的每一行都将使用rangeName = "l" + x创建,因此列表1中的每一行都将命名为l1,而列表2中的每一行都将命名为range名为l2,依此类推。

然后阶段2来了。对于单行范围:

List<MyRange> myRanges = GoogleContentCreator.countSingleRanges(document, rangeName);
    if (myRanges != null) {
        List<Request> requests = new ArrayList<>();
        for (MyRange myRange : myRanges) {
            requests.add(new Request().setUpdateParagraphStyle(new UpdateParagraphStyleRequest()
                    .setRange(new Range()
                            .setStartIndex(myRange.getStart())
                            .setEndIndex(myRange.getEnd()))
                    .setParagraphStyle(new ParagraphStyle()
                            .setNamedStyleType(namedStyleType))
                    .setFields("namedStyleType")
            ));
        }
        return requests;
    }

以及多行范围(明确在此处为项目符号列表):

MyRange range = GoogleContentCreator.countListRange(document, rangeName);
    if (range != null) {
        List<Request> requests = new ArrayList<>();
        requests.add(new Request().setCreateParagraphBullets(
                new CreateParagraphBulletsRequest()
                        .setRange(new Range()
                                .setStartIndex(range.getStart())
                                .setEndIndex(range.getEnd()))
                        .setBulletPreset("BULLET_DISC_CIRCLE_SQUARE")));
        return requests;
    }

关键的事情是countSingleRanges(...)countListRange(...)方法。我没有粘贴实现,因为它很乱,但是核心概念是countListRange(...)返回一个范围,该范围取第一次出现的rangeName标签的开始和最后一次出现的rangeName标签的结束。另一方面,countSingleRanges(...)返回的范围列表与放置在文档中的范围完全相同。

所有此操作文档正确格式化和设置样式之后。

到目前为止,我无法在Google Docs API中使用的一件事是表格,但是无论如何这都不是这个问题的范围。