首页 > 解决方案 > 在单个请求中使用数据清除和填充多个工作表

问题描述

我需要定期清除多个工作表中的数据并用数据重新填充它们(通过 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()方法)。

谁能推荐一个简化这个的好方法?还是我已经以最好的方式做到了?

标签: javagoogle-sheets-apigoogle-api-java-client

解决方案


仍然不知道我是否以最好的方式这样做,但我能够完成我的目标,即在单个批处理请求中清除和填充多张工作表的数据。诀窍是不使用该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();

推荐阅读