在单个请求中用数据清除并填充多张工作表

时间:2018-09-27 16:08:26

标签: java google-sheets-api google-api-java-client

我需要定期清除多张工作表中的数据,然后使用数据重新填充(通过Google Sheets API v4)。为此,我为每个工作表执行2个单独的请求(1个清除和1个更新)。当用户坐在那里等待时,这是一个缓慢的过程。在我看来,每个新请求都会大大增加完成时间。如果我可以将所有这些包装到单个批处理命令请求中,则可能会很有帮助。

我目前正在为每张纸做此事...

service.spreadsheets()
  .values()
  .clear(idSpreadsheet, sheetTitle + "!$A$1:$Y", new ClearValuesRequest())
  .execute();

service.spreadsheets()
  .values()
  .update(idSpreadsheet, range, new ValueRange().setValues(values))
  .setValueInputOption("USER_ENTERED")
  .execute();

我看不到将一堆通用命令包装到单个批处理请求中的方法。我发现DeleteDimensionRequestAppendCellsRequest可以打包成一个批处理,但是我找不到真正的好AppendCellsRequest示例(似乎人们推荐我目前的values().update()方法)。

有人可以推荐一种简化此方法的好方法吗?还是我已经做到了最好的方法?

1 个答案:

答案 0 :(得分:0)

仍然不知道我是否正在执行最佳方法,但是我能够实现在单个批处理请求中用数据清除和填充多张纸的目标。诀窍是不使用clear()方法,而是使用RepeatCellRequest用空白数据覆盖工作表。另外,现在使用AppendCellsRequest代替update()。这两个请求可以包装在批处理请求中。 我用3张纸做的早期测试显示性能提高了25%。效果不佳,但有帮助。

List<Request> requests = new ArrayList<Request>();
for (SheetData mySheet : sheetDatas)
{
    List<List<Object>> values = mySheet.getValues();
    Request clearSheetRequest = new Request()
          .setRepeatCell(new RepeatCellRequest()
            .setRange(new GridRange()
              .setSheetId(mySheet.getSheetId())
            )
            .setFields("*")
            .setCell(new CellData())
          );

    List<RowData> preppedRows = new ArrayList<RowData>();
    for (List<Object> row : values)
    {
    RowData preppedRow = new RowData();
    List<CellData> cells = new ArrayList<CellData>();
    for (Object value : row)
    {
        CellData cell = new CellData();
        ExtendedValue userEnteredValue = new ExtendedValue();
        if (value instanceof String)
        {
            userEnteredValue.setStringValue((String) value);
        }
        else if (value instanceof Double)
        {
            userEnteredValue.setNumberValue((Double) value);
        }
        else if (value instanceof Integer)
        {
            userEnteredValue.setNumberValue(Double.valueOf((Integer) value).doubleValue());
        }
        else if (value instanceof Boolean)
        {
            userEnteredValue.setBoolValue((Boolean) value);
        }
        cell.setUserEnteredValue(userEnteredValue);
        cells.add(cell);
    }
    preppedRow.setValues(cells);
    preppedRows.add(preppedRow);
    }

    Request appendCellsRequest = new Request().setAppendCells(
    new AppendCellsRequest()
        .setSheetId(mySheet.getSheetId())
        .setRows(preppedRows)
        .setFields("*")
        );

    requests.add(clearSheetRequest);
    requests.add(appendCellsRequest);
}

BatchUpdateSpreadsheetRequest batch = new BatchUpdateSpreadsheetRequest().setRequests(requests);
BatchUpdateSpreadsheetResponse batchResponse = service.spreadsheets().batchUpdate(idSpreadsheet, batch).execute();