如何在 c# 中将内容添加到 google doc table 单元格

How to add content to google doc table cell in c#

我正在尝试将 3x3 table 插入 google 文档,然后使用 c# 将文本插入 table 单元格。我遇到了这个 ,它帮助我添加了 table,并且至少在其中一个单元格中添加了一些文本。

该线程中的答案是将 4 添加到新创建的 table 的 startindex。我这样做了,我的所有文本都被添加到第一行的第二个单元格中。

您可以从我下面的代码中看到,在 for 循环中我希望用一些测试文本填充每个单元格。所以,我不确定为什么所有文本都放在一个单元格中。

var docId = "mydocid";

List<Request> requests = new List<Request>
{
    new Request()
    {
        InsertTable = new InsertTableRequest()
        {
            EndOfSegmentLocation = new EndOfSegmentLocation
            {
                SegmentId = ""
            },
            Columns = 3,
            Rows = 3
        }
    }
};

BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest {Requests = requests};

service.Documents.BatchUpdate(body, docId).Execute();

var doc = service.Documents.Get(docId).Execute();

var index = doc.Body.Content.FirstOrDefault(x => x.Table != null).StartIndex + 4;

requests = new List<Request>();

for (var i = 0; i < 3; i++)
{
    index++;

    requests.Add(new Request()
    {
        InsertText = new InsertTextRequest()
        {
            Text = "test 1",
            Location = new Location()
            {
                Index = index
            }
        }
    });

    index++;

    requests.Add(new Request()
    {
        InsertText = new InsertTextRequest()
        {
            Text = "test 2",
            Location = new Location()
            {
                Index = index
            }
        }
    });

    index++;

    requests.Add(new Request()
    {
        InsertText = new InsertTextRequest()
        {
            Text = "test 3",
            Location = new Location()
            {
                Index = index
            }
        }
    });
}

body = new BatchUpdateDocumentRequest { Requests = requests };

service.Documents.BatchUpdate(body, docId).Execute();

编辑:经过更多测试后,我意识到我最初并没有注意到一个单元格中的文本最终变成了这个 - tttttttttest 3est 2est 1est 3est 2est 1est 3est 2est 1 所以,看起来索引不是'它不一定用于说明将内容写入哪个单元格,而是某种类型的子字符串函数。所以,很明显我不明白如何遍历每一行和单元格以插入索引为 属性.

的文本

根据要求,这里是将请求体对象转换为json。

{
    "requests": [{
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 60,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 1",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 61,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 2",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 62,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 3",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 63,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 1",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 64,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 2",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 65,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 3",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 66,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 1",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 67,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 2",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }, {
        "createNamedRange": null,
        "createParagraphBullets": null,
        "deleteContentRange": null,
        "deleteNamedRange": null,
        "deleteParagraphBullets": null,
        "deletePositionedObject": null,
        "deleteTableColumn": null,
        "deleteTableRow": null,
        "insertInlineImage": null,
        "insertPageBreak": null,
        "insertTable": null,
        "insertTableColumn": null,
        "insertTableRow": null,
        "insertText": {
            "endOfSegmentLocation": null,
            "location": {
                "index": 68,
                "segmentId": null,
                "ETag": null
            },
            "text": "test 3",
            "ETag": null
        },
        "replaceAllText": null,
        "updateParagraphStyle": null,
        "updateTableColumnProperties": null,
        "updateTableRowStyle": null,
        "updateTextStyle": null,
        "ETag": null
    }],
    "writeControl": null,
    "ETag": null
}

根据 Tanaike 建议的答案进行编辑。

这是代码的更新版本。

public class AddendumRow
{
    public string Title {get;set;}
    public string Value {get;set;}
    public string Description {get;set;}
}


var tableRows = new List<AddendumRow>()
{
    new AddendumRow(){Title = "Row 1 Title", Value = "Row 1 Value", Description = "Row 1 Description" },
    new AddendumRow(){Title = "Row 2 Title", Value = "Row 2 Value", Description = "Row 2 Description" },
    new AddendumRow(){Title = "Row 3 Title", Value = "Row 3 Value", Description = "Row 3 Description" }
};

List<Request> requests = new List<Request>
{
    new Request()
    {
        InsertTable = new InsertTableRequest()
        {
            EndOfSegmentLocation = new EndOfSegmentLocation
            {
                SegmentId = ""
            },
            Columns = 3,
            Rows = tableRows.Count
        }
    }
};

BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest {Requests = requests};

service.Documents.BatchUpdate(body, docId).Execute();

var doc = service.Documents.Get(docId).Execute();

var index = doc.Body.Content.FirstOrDefault(x => x.Table != null).StartIndex + 3;

requests = new List<Request>();

foreach (var row in tableRows){

    requests.Add(new Request()
    {
        InsertText = new InsertTextRequest()
        {
            Text = row.Title,
            Location = new Location()
            {
                Index = index
            }
        }
    }); 
    index += 2;

    requests.Add(new Request()
    {
        InsertText = new InsertTextRequest()
        {
            Text = row.Value,
            Location = new Location()
            {
                Index = index
            }
        }
    }); 
    index += 2;

    requests.Add(new Request()
    {
        InsertText = new InsertTextRequest()
        {
            Text = row.Description,
            Location = new Location()
            {
                Index = index
            }
        }
    }); 

    index += 3;
}


body = new BatchUpdateDocumentRequest { Requests = requests };

var json = JsonConvert.SerializeObject(requests);

当我 运行 我认为与您的示例匹配的代码时,它会将所有内容放入第一行的第一个单元格中。该单元格的内容是...

RoRoRowRoRoRowRoRoRow 3 Descriptionw 3 Valuew 3 Title 2 Descriptionw 2 Valuew 2 Title 1 Descriptionw 1 Valuew 1 Title

您可以看到它似乎使用索引作为某种子字符串方法,用于将文本插入现有文本而不是移动到下一个单元格。

这一行的结果json - var json = JsonConvert.SerializeObject(requests);在下面。据我所见,它与您的示例非常匹配,但还有很多其他属性。

[{
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 58,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 1 Title",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 60,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 1 Value",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 62,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 1 Description",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 65,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 2 Title",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 67,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 2 Value",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 69,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 2 Description",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 72,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 3 Title",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 74,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 3 Value",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}, {
    "createNamedRange": null,
    "createParagraphBullets": null,
    "deleteContentRange": null,
    "deleteNamedRange": null,
    "deleteParagraphBullets": null,
    "deletePositionedObject": null,
    "deleteTableColumn": null,
    "deleteTableRow": null,
    "insertInlineImage": null,
    "insertPageBreak": null,
    "insertTable": null,
    "insertTableColumn": null,
    "insertTableRow": null,
    "insertText": {
        "endOfSegmentLocation": null,
        "location": {
            "index": 76,
            "segmentId": null,
            "ETag": null
        },
        "text": "Row 3 Description",
        "ETag": null
    },
    "replaceAllText": null,
    "updateParagraphStyle": null,
    "updateTableColumnProperties": null,
    "updateTableRowStyle": null,
    "updateTextStyle": null,
    "ETag": null
}]
  • 您想将具有 3 行和 3 列的新 table 附加到 Google 文档。
  • 您想将值放入所有单元格。

我可以这样理解。如果我的理解是正确的,这个修改怎么样?

修改点:

  • 在您的例子中,值被放入新的 table。在这种情况下,每个值都可以放在每个单元格的起始索引中。

  • 从你的请求体来看,我推测这次修改后的请求是以下情况。

    • 新 table,它有 3 行和 3 列,附加到 Google 文档。 table 的所有单元格都是空的。
    • 值被放入所有单元格。
    • startIndex (body.content[].startIndex) 的附加 table 是 57.
    • 在这种情况下,第 1 行和第 1 列的 startIndex (body.content[].table.tableRows[0].tableCells[0].content[0].startIndex) 为“60”。而其他startIndex个单元格如下

      • 从上图中发现,列和行单元格的偏移量分别为23
  • 当通过一次 API 调用使用 batchUpdate 方法将值放入所有单元格时,有一点很重要。

    • 例如,将"sample"的值放入第1行第1列的单元格(startIndex60)时,startIndex第 1 行和第 2 列的单元格变为 60 + 6 + 2 = 6862 的值分别是字符串的长度 sample 和下一个单元格的偏移量。
    • 在您的脚本中,偏移量是 1。这样,所有值都放在一个单元格中。
    • 作为将值放入空单元格的简单方法,在具有 3 行和 3 列的 table 的情况下,它通过将第 3 行的单元格中的值放入来创建请求正文和第 3 列的顺序相反。

当以上几点反映到你的request body中,就变成了这样。

修改后的请求正文:

{"requests":[
    {"insertText":{"location":{"index":78},"text":"c3"}},
    {"insertText":{"location":{"index":76},"text":"b3"}},
    {"insertText":{"location":{"index":74},"text":"a3"}},
    {"insertText":{"location":{"index":71},"text":"c2"}},
    {"insertText":{"location":{"index":69},"text":"b2"}},
    {"insertText":{"location":{"index":67},"text":"a2"}},
    {"insertText":{"location":{"index":64},"text":"c1"}},
    {"insertText":{"location":{"index":62},"text":"b1"}},
    {"insertText":{"location":{"index":60},"text":"a1"}}
]}

结果:

将上述请求体用于table的startIndex57的新table时,可得到如下结果。如果您使用上述请求体,请注意 index.

的值

参考文献: