Trabaja con tablas

La API de Documentos de Google te permite editar el contenido de las tablas. Las operaciones que puedes realizar incluyen las siguientes:

  • Inserta y borra filas, columnas o tablas enteras.
  • Inserta contenido en las celdas de la tabla.
  • Leer el contenido de las celdas de la tabla
  • Modifica las propiedades de las columnas y el estilo de las filas.

Las tablas en Documentos de Google se representan como un tipo de StructuralElement en el documento. Cada tabla contiene una lista de filas de la tabla, en la que cada una contiene una lista de celdas de la tabla. Al igual que con todos los elementos estructurales, la tabla tiene índices de inicio y fin, que indican la posición de la tabla en el documento. Consulta la estructura para obtener más información sobre la indexación. Las propiedades de las tablas incluyen muchos elementos de estilo, como el ancho de las columnas y el relleno.

En el siguiente fragmento de JSON, se muestra una tabla simple de 2 × 2 sin la mayoría de los detalles:

"table": {
    "columns": 2,
    "rows": 2,
    "tableRows": [
        { "tableCells": [
                {
                    "content": [ { "paragraph": { ...  }, } ],
                },
                {
                    "content": [ { "paragraph": { ... }, } ],
                }
            ],
        },
        {
            "tableCells": [
                {
                    "content": [ { "paragraph": { ... }, } ],
                },
                {
                    "content": [ { "paragraph": { ... }, } ],
                }
            ],
        }
    ]
}

Insertar y borrar tablas

Para agregar una tabla nueva a un documento, usa InsertTableRequest. Cuando insertas una tabla, debes especificar lo siguiente:

  • Las dimensiones de la tabla en filas y columnas
  • La ubicación en la que se insertará la tabla nueva: puede ser un índice dentro de un segmento o puede ser el final de un segmento.

No hay un método explícito para borrar tablas. Para borrar una tabla de un documento, trátala como a cualquier otro contenido: usa DeleteContentRangeRequest y especifica un rango que abarque toda la tabla.

En el siguiente ejemplo, se inserta una tabla de 3 x 3 al final de un documento vacío:

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())
                .setRows(3)
                .setColumns(3)));

BatchUpdateDocumentRequest body =
    new BatchUpdateDocumentRequest().setRequests(requests);
BatchUpdateDocumentResponse response =
    docsService.documents().batchUpdate(DOCUMENT_ID, 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': ''
          }
      },
  }
  ]

  result = service.documents().batchUpdate(documentId=DOCUMENT_ID, body={'requests': requests}).execute()

En este ejemplo correspondiente, se muestra cómo borrar la tabla insertada anteriormente:

Java

// Delete a table that was inserted at the start of the body.
// (The table is the second element in the body:
//  document.getBody().getContent().get(2).)

Document document = docsService.documents().get(DOCUMENT_ID).execute();
StructuralElement table = document.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()))));

BatchUpdateDocumentRequest body =
    new BatchUpdateDocumentRequest().setRequests(requests);
BatchUpdateDocumentResponse response =
    docsService.documents().batchUpdate(DOCUMENT_ID, body).execute();

Python

  # Delete a table that was inserted at the start of the body.
  # (The table is the second element in the body: ['body']['content'][2].)

  document = service.documents().get(documentId=DOCUMENT_ID).execute()
  table = document['body']['content'][2]

  requests = [{
      'deleteContentRange': {
        'range': {
          'segmentId': '',
          'startIndex': table['startIndex'],
          'endIndex':   table['endIndex']
        }
      },
  }
  ]

  result = service.documents().batchUpdate(documentId=DOCUMENT_ID, body={'requests': requests}).execute()

Debido a que borras una tabla como contenido común (mediante la especificación de índices de inicio y fin), debes obtener estos índices de algún lugar. En el ejemplo, se muestra una forma de extraer estos índices del contenido del documento.

Cómo insertar y borrar filas

Si tu documento ya contiene una tabla, la API de Documentos de Google te permite insertar y borrar filas de tablas. Usa InsertTableRowRequest para insertar filas encima o debajo de una celda de tabla especificada y DeleteTableRowRequest para quitar una fila que abarque la ubicación de celda especificada.

En el siguiente ejemplo, se inserta texto en la primera celda de una tabla y se agrega una fila de tabla.

Java

List<Request> requests = new ArrayList<>();
requests.add(new Request().setInsertText(new InsertTextRequest()
        .setText("Hello")
        .setLocation(new Location().setIndex(5))));
requests.add(new Request().setInsertTableRow(new InsertTableRowRequest()
        .setTableCellLocation(new TableCellLocation()
                .setTableStartLocation(new Location()
                        .setIndex(2))
                .setRowIndex(1)
                .setColumnIndex(1))
        .setInsertBelow(true)));

BatchUpdateDocumentRequest body =
    new BatchUpdateDocumentRequest().setRequests(requests);
BatchUpdateDocumentResponse response = docsService.documents()
        .batchUpdate(DOCUMENT_ID, body).execute();

Python

  requests = [{
        'insertText': {
          'location': {
            'index': 5
          },
          'text': 'Hello'
      }
    },
    {
      'insertTableRow': {
          'tableCellLocation': {
              'tableStartLocation': {
                      'index': 2
              },
              'rowIndex': 1,
              'columnIndex': 1
          },
          'insertBelow': 'true'
      }
    }
  ]

  result = service.documents().batchUpdate(documentId=DOCUMENT_ID, body={'requests': requests}).execute()

Cómo insertar y borrar columnas

Para insertar una columna en una tabla existente, usa InsertTableColumnRequest. Debes especificar lo siguiente:

  • Una celda junto a la que deseas insertar una nueva columna.
  • En qué lado (izquierda o derecha) se insertará la columna nueva.

El siguiente ejemplo muestra cómo puedes insertar una columna en la tabla 2x2 que se mostró antes:

Java

List<Request> requests = new ArrayList<>();
requests.add(
    new Request()
        .setInsertTableColumn(
            new InsertTableColumnRequest()
                .setTableCellLocation(
                    new TableCellLocation()
                        .setTableStartLocation(
                            new Location().setIndex(2))
                        .setRowIndex(0)
                        .setColumnIndex(0))
                .setInsertRight(true)));

BatchUpdateDocumentRequest body =
    new BatchUpdateDocumentRequest().setRequests(requests);
BatchUpdateDocumentResponse response =
    docsService.documents().batchUpdate(DOCUMENT_ID, body).execute();

Python

  requests = [{
      'insertTableColumn': {
        'tableCellLocation': {
          'tableStartLocation': {
            'segmentId': '',
            'index': 2
          },
          'rowIndex': 0,
          'columnIndex': 0
        },
        'insertRight': True
      },
  }
  ]

  result = service.documents().batchUpdate(documentId=DOCUMENT_ID, body={'requests': requests}).execute()

Para borrar una columna, usa DeleteTableColumnRequest. Debes especificar la ubicación de la celda dentro de una columna de destino como se mostró antes para insertar una columna.

Cómo leer el contenido de las celdas de una tabla

Una celda de una tabla contiene una lista de elementos estructurales; cada uno de estos elementos puede ser un párrafo con texto o algún otro tipo de estructura, o incluso otra tabla. Para leer el contenido de la tabla, puedes inspeccionar de manera recurrente cada elemento, como se muestra en Extraer texto.

Cómo insertar contenido en las celdas de una tabla

Para escribir en una celda de la tabla, usa una InsertTextRequest a un índice dentro de la celda que deseas actualizar. Los índices de la tabla se ajustan según el texto actualizado. Lo mismo se aplica para borrar el texto de una celda con DeleteContentRangeRequest.

Modifica las propiedades de las columnas

UpdateTableColumnPropertiesRequest te permite modificar las propiedades de una o más columnas en una tabla.

Debes proporcionar el índice inicial de la tabla, junto con un objeto TableColumnProperties. Para modificar solo las columnas seleccionadas, incluye una lista de números de columna en la solicitud. Para modificar todas las columnas de la tabla, proporciona una lista vacía.

En el siguiente ejemplo, se actualizan los anchos de las columnas de una tabla, se configuran todas las columnas con 100 pts de ancho y, luego, el ancho de la primera columna en 200 pt:

Java

List<Request> requests = new ArrayList<>();
requests.add(
    new Request()
        .setUpdateTableColumnProperties(
            new UpdateTableColumnPropertiesRequest()
                .setTableStartLocation(new Location().setIndex(2))
                .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))
                .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(DOCUMENT_ID, body).execute();

Python

  requests = [{
    'updateTableColumnProperties': {
      'tableStartLocation': {'index': 2},
      'columnIndices': [],
      'tableColumnProperties': {
        'widthType': 'FIXED_WIDTH',
        'width': {
          'magnitude': 100,
          'unit': 'PT'
        }
      },
      'fields': '*'
    },
    'updateTableColumnProperties': {
      'tableStartLocation': {'index': 2},
      'columnIndices': [0],
      'tableColumnProperties': {
        'widthType': 'FIXED_WIDTH',
        'width': {
          'magnitude': 200,
          'unit': 'PT'
        }
      },
      'fields': '*'
    },
  }
  ]

  result = service.documents().batchUpdate(documentId=DOCUMENT_ID, body={'requests': requests}).execute()

Cómo modificar los estilos de las filas

UpdateTableRowsStyleRequest te permite modificar el diseño de una o más filas de una tabla.

Debes proporcionar el índice inicial de la tabla, junto con un objeto TableRowStyle. Para modificar solo las filas seleccionadas, incluye una lista de números de fila en la solicitud. Para modificar todas las filas de la tabla, proporciona una lista vacía.

En el siguiente ejemplo, se establece la altura mínima de la fila 3 de una tabla:

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))
                .setRowIndices(rowIndices)
                .setTableRowStyle(
                    new TableRowStyle()
                        .setMinRowHeight(
                            new Dimension().setMagnitude(18d).setUnit("PT")))
                .setFields("*")));

BatchUpdateDocumentRequest body =
    new BatchUpdateDocumentRequest().setRequests(requests);
BatchUpdateDocumentResponse response =
    docsService.documents().batchUpdate(DOCUMENT_ID, body).execute();

Python

  requests = [{
      'updateTableRowStyle': {
          'tableStartLocation': {'index': 2},
          'rowIndices': [3],
          'tableRowStyle': {
              'minRowHeight': {
                'magnitude': 18,
                'unit': 'PT'
              }
          },
          'fields': '*'
      },
  }
  ]

  result = service.documents().batchUpdate(documentId=DOCUMENT_ID, body={'requests': requests}).execute()