В этом документе объясняется, как работать с таблицами в API Google Docs.
API Docs позволяет редактировать содержимое таблиц. Доступные операции включают следующее:
- Вставка и удаление строк, столбцов или целых таблиц.
- Вставьте содержимое в ячейки таблицы.
- Считывание содержимого из ячеек таблицы.
- Измените свойства столбцов и стиль строк.
В документах Google Docs таблицы представлены в документе как StructuralElement . Каждая Table содержит список объектов TableRow , где каждая строка содержит список объектов TableCell . Как и все структурные элементы, таблица имеет начальный и конечный индексы , указывающие на ее положение в документе. Свойства таблицы включают множество элементов стиля, таких как ширина столбцов и отступы.
Пример таблицы
Следующий фрагмент JSON отображает таблицу 2x2, из которой удалена большая часть деталей:
"table": {
"columns": 2,
"rows": 2,
"tableRows": [
{ "tableCells": [
{
"content": [ { "paragraph": { ... }, } ],
},
{
"content": [ { "paragraph": { ... }, } ],
}
],
},
{
"tableCells": [
{
"content": [ { "paragraph": { ... }, } ],
},
{
"content": [ { "paragraph": { ... }, } ],
}
],
}
]
}
В следующей таблице показаны смещения индексов для каждого структурного элемента в таблице 2x2, при условии, что таблица начинается с индекса S и все ячейки пусты (каждая содержит только один символ новой строки \n длиной = 1):
| Элемент | Путь | Начальный индекс | Конечный указатель |
|---|---|---|---|
| Стол | / | S | S + 12 |
| TableRow 0 | /rows[0] | S + 1 | S + 6 |
| TableCell (0,0) | /rows[0]/cells[0] | S + 2 | S + 4 |
| Абзац | /rows[0]/cells[0]/p[0] | S + 3 | S + 4 |
| TableCell (0,1) | /rows[0]/cells[1] | S + 4 | S + 6 |
| Абзац | /rows[0]/cells[1]/p[0] | S + 5 | S + 6 |
| Таблица, строка 1 | /rows[1] | S + 6 | S + 11 |
| TableCell (1,0) | /rows[1]/cells[0] | S + 7 | S + 9 |
| Абзац | /rows[1]/cells[0]/p[0] | S + 8 | S + 9 |
| TableCell (1,1) | /rows[1]/cells[1] | S + 9 | S + 11 |
| Абзац | /rows[1]/cells[1]/p[0] | S + 10 | S + 11 |
Вставка и удаление таблиц
Для добавления таблицы в документ используйте объект InsertTableRequest . При вставке таблицы необходимо указать следующие параметры:
- Размеры таблицы в строках и столбцах.
- Место для вставки таблицы: это может быть индекс внутри сегмента (например, тело, заголовок или нижний колонтитул) или конец сегмента. В любом случае необходимо указать идентификатор указанной вкладки.
Чтобы вставить таблицу в конец тела документа, укажите объект EndOfSegmentLocation и оставьте поле segmentId пустым.
Явного метода для удаления таблиц не существует. Чтобы удалить таблицу из документа, обработайте её так же, как и любое другое содержимое: используйте DeleteContentRangeRequest , указав range , охватывающий всю таблицу.
Приведенный ниже пример кода демонстрирует, как вставить таблицу 3x3 в конец пустого документа:
Java
// Insert a table at the end of the body. // (An empty or unspecified segmentId field indicates the document's body.) List<Request> requests = new ArrayList<>(); requests.add( new Request() .setInsertTable( new InsertTableRequest() .setEndOfSegmentLocation( new EndOfSegmentLocation().setTabId(<var>TAB_ID</var>)) .setRows(3) .setColumns(3))); BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests); BatchUpdateDocumentResponse response = docsService.documents().batchUpdate(<var>DOCUMENT_ID</var>, body).execute();
Python
# Insert a table at the end of the body. # (An empty or unspecified segmentId field indicates the document's body.) requests = [{ 'insertTable': { 'rows': 3, 'columns': 3, 'endOfSegmentLocation': { 'segmentId': '', 'tabId': <var>TAB_ID</var> } }, } ] result = service.documents().batchUpdate(documentId=<var>DOCUMENT_ID</var>, body={'requests': requests}).execute()
Приведенный ниже пример кода демонстрирует, как удалить таблицу, указав ее начальный и конечный индексы. Этот пример показывает, как получить эти индексы из содержимого документа.
Java
// Delete a table that was inserted at the start of the body of the first tab. // (The table is the second element in the body: // documentTab.getBody().getContent().get(2).) Document document = docsService.documents().get(<var>DOCUMENT_ID</var>).setIncludeTabsContent(true).execute(); String tabId = document.getTabs().get(0).getTabProperties().getTabId(); DocumentTab documentTab = document.getTabs().get(0).getDocumentTab(); StructuralElement table = documentTab.getBody().getContent().get(2); List<Request> requests = new ArrayList<>(); requests.add( new Request() .setDeleteContentRange( new DeleteContentRangeRequest() .setRange( new Range() .setStartIndex(table.getStartIndex()) .setEndIndex(table.getEndIndex()) .setTabId(tabId)))); BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests); BatchUpdateDocumentResponse response = docsService.documents().batchUpdate(<var>DOCUMENT_ID</var>, body).execute();
Python
# Delete a table that was inserted at the start of the body of the first tab. # (The table is the second element in the body: ['body']['content'][2].) document = service.documents().get(documentId=DOCUMENT_ID, includeTabsContent=True).execute() tab_id = document['tabs'][0]['tabProperties']['tabId'] document_tab = document['tabs'][0]['documentTab'] table = document_tab['body']['content'][2] requests = [{ 'deleteContentRange': { 'range': { 'segmentId': '', 'startIndex': table['startIndex'], 'endIndex': table['endIndex'], 'tabId': tab_id } }, } ] result = service.documents().batchUpdate(documentId=<var>DOCUMENT_ID</var>, body={'requests': requests}).execute()
Вставка и удаление строк
Если ваш документ уже содержит таблицу, API Docs позволяет вставлять и удалять строки таблицы. Используйте InsertTableRowRequest для вставки строк до или после указанной ячейки таблицы, а DeleteTableRowRequest для удаления строки, занимающей указанное место в ячейке.
Приведенный ниже пример кода показывает, как вставить текст в первую ячейку существующей таблицы и добавить строку в таблицу:
Java
List<Request> requests = new ArrayList<>(); requests.add(new Request().setInsertText(new InsertTextRequest() .setText("Hello") .setLocation(new Location().setIndex(5).setTabId(<var>TAB_ID</var>)))); requests.add(new Request().setInsertTableRow(new InsertTableRowRequest() .setTableCellLocation(new TableCellLocation() .setTableStartLocation(new Location() .setIndex(2).setTabId(<var>TAB_ID</var>)) .setRowIndex(1) .setColumnIndex(1)) .setInsertBelow(true))); BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests); BatchUpdateDocumentResponse response = docsService.documents() .batchUpdate(<var>DOCUMENT_ID</var>, body).execute();
Python
requests = [{ 'insertText': { 'location': { 'index': 5, 'tabId': <var>TAB_ID</var> }, 'text': 'Hello' } }, { 'insertTableRow': { 'tableCellLocation': { 'tableStartLocation': { 'index': 2, 'tabId': <var>TAB_ID</var> }, 'rowIndex': 1, 'columnIndex': 1 }, 'insertBelow': 'true' } } ] result = service.documents().batchUpdate(documentId=<var>DOCUMENT_ID</var>, body={'requests': requests}).execute()
Вставка и удаление столбцов
Для вставки столбца в существующую таблицу используйте объект InsertTableColumnRequest . Необходимо указать следующее:
- Ячейка, рядом с которой вы хотите вставить новый столбец.
- С какой стороны (слева или справа) следует вставить новый столбец?
Приведенный ниже пример кода демонстрирует, как вставить столбец в приведенную ранее таблицу 2x2 :
Java
List<Request> requests = new ArrayList<>(); requests.add( new Request() .setInsertTableColumn( new InsertTableColumnRequest() .setTableCellLocation( new TableCellLocation() .setTableStartLocation( new Location().setIndex(2).setTabId(<var>TAB_ID</var>)) .setRowIndex(0) .setColumnIndex(0)) .setInsertRight(true))); BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests); BatchUpdateDocumentResponse response = docsService.documents().batchUpdate(<var>DOCUMENT_ID</var>, body).execute();
Python
requests = [{ 'insertTableColumn': { 'tableCellLocation': { 'tableStartLocation': { 'segmentId': '', 'index': 2, 'tabId': <var>TAB_ID</var> }, 'rowIndex': 0, 'columnIndex': 0 }, 'insertRight': True }, } ] result = service.documents().batchUpdate(documentId=<var>DOCUMENT_ID</var>, body={'requests': requests}).execute()
Для удаления столбца используйте функцию DeleteTableColumnRequest . Необходимо указать местоположение ячейки в целевом столбце, как показано ранее для вставки столбца.
Считывание содержимого из ячеек таблицы
Ячейка таблицы содержит список объектов StructuralElement . Каждый из этих структурных элементов может представлять собой абзац с текстом или другой тип структуры — даже другую таблицу. Для чтения содержимого таблицы можно рекурсивно проверять каждый элемент, как показано в примере кода «Извлечение текста из документа с помощью Docs API» .
Вставка содержимого в ячейки таблицы
Для записи в ячейку таблицы используйте InsertTextRequest , указав location ячейки, которую вы хотите обновить. Индексы таблицы автоматически скорректируются с учетом обновленного текста. То же самое относится и к удалению текста из ячейки с помощью DeleteContentRangeRequest .
Следующий пример кода демонстрирует, как записывать данные в ячейку таблицы:
Java
List<Request> requests = new ArrayList<>(); requests.add(new Request().setInsertText(new InsertTextRequest() .setText("Hello") .setLocation(new Location().setIndex(5).setTabId(<var>TAB_ID</var>)))); BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests); BatchUpdateDocumentResponse response = docsService.documents() .batchUpdate(<var>DOCUMENT_ID</var>, body).execute();
Python
requests = [{ 'insertText': { 'location': { 'index': 5, 'tabId': <var>TAB_ID</var> }, 'text': 'Hello' } }] result = service.documents().batchUpdate(documentId=<var>DOCUMENT_ID</var>, body={'requests': requests}).execute()
Изменение свойств столбца
Метод UpdateTableColumnPropertiesRequest позволяет изменять свойства одного или нескольких столбцов в таблице.
Необходимо указать начальный индекс таблицы, а также объект TableColumnProperties . Чтобы изменить только выбранные столбцы, включите в запрос список номеров столбцов. Чтобы изменить все столбцы в таблице, укажите пустой список.
Приведенный ниже пример кода показывает, как изменить ширину столбцов таблицы, установив ширину всех столбцов на 100 пунктов, а затем ширину первого столбца на 200 пунктов:
Java
List<Request> requests = new ArrayList<>(); requests.add( new Request() .setUpdateTableColumnProperties( new UpdateTableColumnPropertiesRequest() .setTableStartLocation( new Location() .setIndex(2) .setTabId(<var>TAB_ID</var>)) .setColumnIndices(null) .setTableColumnProperties( new TableColumnProperties() .setWidthType("FIXED_WIDTH") .setWidth( new Dimension().setMagnitude(100d).setUnit("PT"))) .setFields("*"))); List<Integer> columnIndices = new ArrayList<>(); columnIndices.add(0); requests.add( new Request() .setUpdateTableColumnProperties( new UpdateTableColumnPropertiesRequest() .setTableStartLocation( new Location() .setIndex(2) .setTabId(<var>TAB_ID</var>)) .setColumnIndices(columnIndices) .setTableColumnProperties( new TableColumnProperties() .setWidthType("FIXED_WIDTH") .setWidth( new Dimension().setMagnitude(200d).setUnit("PT"))) .setFields("*"))); BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests); BatchUpdateDocumentResponse response = docsService.documents().batchUpdate(<var>DOCUMENT_ID</var>, body).execute();
Python
requests = [ { 'updateTableColumnProperties': { 'tableStartLocation': {'index': 2, 'tabId': <var>TAB_ID</var>}, 'columnIndices': [], 'tableColumnProperties': { 'widthType': 'FIXED_WIDTH', 'width': { 'magnitude': 100, 'unit': 'PT' } }, 'fields': '*' } }, { 'updateTableColumnProperties': { 'tableStartLocation': {'index': 2, 'tabId': <var>TAB_ID</var>}, 'columnIndices': [0], 'tableColumnProperties': { 'widthType': 'FIXED_WIDTH', 'width': { 'magnitude': 200, 'unit': 'PT' } }, 'fields': '*' } } ] result = service.documents().batchUpdate(documentId=<var>DOCUMENT_ID</var>, body={'requests': requests}).execute()
Изменить стили строк
Метод UpdateTableRowStyleRequest позволяет изменять стиль одной или нескольких строк в таблице.
Необходимо указать начальный индекс таблицы, а также объект TableRowStyle . Чтобы изменить только выбранные строки, включите в запрос список номеров строк. Чтобы изменить все строки в таблице, укажите пустой список.
В следующем примере кода показано, как установить минимальную высоту третьей строки в таблице:
Java
List<Integer> rowIndices = new ArrayList<>(); rowIndices.add(3); List<Request> requests = new ArrayList<>(); requests.add( new Request() .setUpdateTableRowStyle( new UpdateTableRowStyleRequest() .setTableStartLocation( new Location() .setIndex(2) .setTabId(<var>TAB_ID</var>)) .setRowIndices(rowIndices) .setTableRowStyle( new TableRowStyle() .setMinRowHeight( new Dimension().setMagnitude(18d).setUnit("PT"))) .setFields("*"))); BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests); BatchUpdateDocumentResponse response = docsService.documents().batchUpdate(<var>DOCUMENT_ID</var>, body).execute();
Python
requests = [{ 'updateTableRowStyle': { 'tableStartLocation': {'index': 2, 'tabId': <var>TAB_ID</var>}, 'rowIndices': [3], 'tableRowStyle': { 'minRowHeight': { 'magnitude': 18, 'unit': 'PT' } }, 'fields': '*' }, } ] result = service.documents().batchUpdate(documentId=<var>DOCUMENT_ID</var>, body={'requests': requests}).execute()