java - 在单个请求中使用数据清除和填充多个工作表
问题描述
我需要定期清除多个工作表中的数据并用数据重新填充它们(通过 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();
我看不到将一堆通用命令包装到单个批处理请求中的方法。我看到了DeleteDimensionRequest
,AppendCellsRequest
可以打包成一个批次,但我真的找不到一个很好的AppendCellsRequest
例子(而且似乎人们还是推荐我目前的values().update()
方法)。
谁能推荐一个简化这个的好方法?还是我已经以最好的方式做到了?
解决方案
仍然不知道我是否以最好的方式这样做,但我能够完成我的目标,即在单个批处理请求中清除和填充多张工作表的数据。诀窍是不使用该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();
推荐阅读
- python - 为什么 MNLogit 返回 `classes_num - 1` 参数以及如何获取它们?
- c++ - 向量擦除()迭代器超出范围
- php - 数组未合并
- django - 我想知道,“类别”如何知道要访问哪个模型
- python - 避免嵌套循环python中的重复
- pyspark - pycharm 未提供所有 pyspark 建议
- r - R中的UNION ALL或INTERSECT ALL等价物?
- c - 使用C语言在vi/vim中打开文件
- python-3.x - 有没有办法指定端口范围 nmap3 扫描?
- python - 计算平均跑步速度的平均值(使用两个不同的 pandas dfs)