如何在 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
个单元格如下
- 从上图中发现,列和行单元格的偏移量分别为
2
和3
。
当通过一次 API 调用使用 batchUpdate 方法将值放入所有单元格时,有一点很重要。
- 例如,将"sample"的值放入第1行第1列的单元格(
startIndex
为60
)时,startIndex
第 1 行和第 2 列的单元格变为 60 + 6 + 2 = 68
。 6
和 2
的值分别是字符串的长度 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的startIndex
为57
的新table时,可得到如下结果。如果您使用上述请求体,请注意 index
.
的值
参考文献:
我正在尝试将 3x3 table 插入 google 文档,然后使用 c# 将文本插入 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
个单元格如下- 从上图中发现,列和行单元格的偏移量分别为
2
和3
。
- 从上图中发现,列和行单元格的偏移量分别为
当通过一次 API 调用使用 batchUpdate 方法将值放入所有单元格时,有一点很重要。
- 例如,将"sample"的值放入第1行第1列的单元格(
startIndex
为60
)时,startIndex
第 1 行和第 2 列的单元格变为60 + 6 + 2 = 68
。6
和2
的值分别是字符串的长度sample
和下一个单元格的偏移量。 - 在您的脚本中,偏移量是
1
。这样,所有值都放在一个单元格中。 - 作为将值放入空单元格的简单方法,在具有 3 行和 3 列的 table 的情况下,它通过将第 3 行的单元格中的值放入来创建请求正文和第 3 列的顺序相反。
- 例如,将"sample"的值放入第1行第1列的单元格(
当以上几点反映到你的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的startIndex
为57
的新table时,可得到如下结果。如果您使用上述请求体,请注意 index
.