Очистить и заполнить несколько листов данными в одном запросе - PullRequest
0 голосов
/ 27 сентября 2018

Мне нужно периодически очищать данные на нескольких листах и ​​заново заполнять их данными (через 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()).

Кто-нибудь может порекомендовать хороший способ упорядочить это?Или я уже делаю это наилучшим образом?

1 Ответ

0 голосов
/ 03 октября 2018

До сих пор не знаю, делаю ли я это ЛУЧШИМ способом, но я смог достичь своей цели - очистить и заполнить несколько листов данными в одном пакетном запросе.Хитрость заключалась в том, чтобы не использовать метод 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();
...