【问题标题】:Clear and populate multiple sheets with data in a single request在单个请求中使用数据清除和填充多个工作表
【发布时间】:2019-03-03 14:39:42
【问题描述】:

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

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

【问题讨论】:

  • 使用 Google API 资源管理器确定单个 batchUpdate 调用所需的请求组合以执行您想要的操作,然后使用 Java 客户端库方法重现所需的参数。

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


【解决方案1】:

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

【讨论】:

  • 如果您只想清除值(根据您的问题代码),您可以使用values().batchClear 在 1 个请求中清除所有需要的工作表的值范围。或者,在上面的clearSheetRequest 中指定适当的字段(即fields: "userEnteredValue")以限制其范围——这可能会提高性能。你也可以使用BatchUpdateValuesRequest,因为你知道values的大小
猜你喜欢
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多