Como trabalhar com tabelas

A API Google Docs permite editar o conteúdo de tabelas. As operações que podem ser executadas incluem:

  • Inserir e excluir linhas, colunas ou tabelas inteiras.
  • Inserir conteúdo nas células da tabela.
  • Ler o conteúdo das células da tabela.
  • Modifique as propriedades das colunas e o estilo das linhas.

As tabelas nos Documentos Google são representadas como um tipo de StructuralElement no documento. Cada tabela contém uma lista de linhas de tabela, em que cada linha contém uma lista de células da tabela. Como acontece com todos os elementos estruturais, a tabela tem índices inicial e final, indicando a posição dela no documento. Consulte a estrutura para mais informações sobre indexação. As propriedades da tabela incluem muitos elementos de estilo, como larguras e padding da coluna.

O fragmento JSON a seguir mostra uma tabela 2x2 simples com a maioria dos detalhes removida:

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

Inserção e exclusão de tabelas

Para adicionar uma nova tabela a um documento, use InsertTableRequest. É necessário especificar o seguinte ao inserir uma tabela:

  • As dimensões de tabela em linhas e colunas.
  • O local para inserir a nova tabela: pode ser um índice dentro de um segmento ou o fim de um segmento.

Não há um método explícito para excluir tabelas. Para excluir uma tabela de um documento, trate-a como faria com qualquer outro conteúdo: use DeleteContentRangeRequest, especificando um intervalo que cubra a tabela inteira.

O exemplo a seguir insere uma tabela 3x3 no final de um documento vazio:

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()

O exemplo correspondente mostra como excluir a tabela inserida 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()

Como você exclui uma tabela como conteúdo comum, especificando os índices de início e fim, precisa conseguir esses índices de algum lugar. O exemplo mostra uma maneira de extrair esses índices do conteúdo do documento.

Como inserir e excluir linhas

Se o documento já tiver uma tabela, você poderá usar a API Google Docs para inserir e excluir linhas de uma tabela. Use InsertTableRowRequest para inserir linhas acima ou abaixo de uma célula específica da tabela e DeleteTableRowRequest para remover uma linha que abranja a célula especificada.

O exemplo a seguir insere texto na primeira célula de uma tabela e adiciona uma linha da tabela.

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()

Como inserir e excluir colunas

Para inserir uma coluna em uma tabela, use InsertTableColumnRequest. Você deve especificar o seguinte:

  • Uma célula ao lado onde você quer inserir uma nova coluna.
  • Em qual lado (esquerda ou direita) inserir a nova coluna

O exemplo a seguir mostra como inserir uma coluna na tabela 2x2 mostrada anteriormente:

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 excluir uma coluna, use DeleteTableColumnRequest. Especifique a localização da célula em uma coluna de destino, como mostrado anteriormente para inserir uma coluna.

Como ler o conteúdo das células da tabela

Uma célula de tabela contém uma lista de elementos estruturais. Cada um desses elementos pode ser um parágrafo com texto ou outro tipo de estrutura, ou até mesmo outra tabela. Para ler o conteúdo da tabela, você pode inspecionar cada elemento de maneira recursiva, conforme mostrado em Extrair texto.

Como inserir conteúdo em células da tabela

Para gravar em uma célula da tabela, use um InsertTextRequest em um índice da célula que você quer atualizar. Os índices da tabela se ajustam para dar conta do texto atualizado. O mesmo se aplica à exclusão do texto da célula com DeleteContentRangeRequest.

Como modificar as propriedades da coluna

Com UpdateTableColumnPropertiesRequest, é possível modificar as propriedades de uma ou mais colunas em uma tabela.

Forneça o índice inicial da tabela com um objeto TableColumnProperties. Para modificar somente as colunas selecionadas, inclua uma lista de números de coluna na solicitação. Para modificar todas as colunas na tabela, forneça uma lista vazia.

O exemplo a seguir atualiza as larguras das colunas de uma tabela, configurando todas as colunas para 100 pts de largura e, em seguida, a largura da primeira coluna como 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()

Como modificar estilos de linhas

Com UpdateTableRowsStyleRequest, é possível modificar o estilo de uma ou mais linhas em uma tabela.

Forneça o índice inicial da tabela com um objeto TableRowStyle. Para modificar apenas as linhas selecionadas, inclua uma lista de números de linha na solicitação. Para modificar todas as linhas da tabela, forneça uma lista vazia.

O exemplo a seguir define a altura mínima da linha 3 de uma tabela:

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()