Google Sheets API v4-как вставить строку после последней строки со значением?
Я вставляю данные в электронную таблицу с помощью нового Google Sheets API v4, код работает идеально, и данные, которые он вставляет, хорошо вписываются в лист.
Но как узнать последнюю строку с данными, чтобы добавить данные после этого ?
List<List<Object>> arrData = getData();
ValueRange oRange = new ValueRange();
oRange.setRange("Pedidos!AXXXXXXX"); // I NEED THE NUMBER OF THE LAST ROW
oRange.setValues(arrData);
List<ValueRange> oList = new ArrayList<>();
oList.add(oRange);
BatchUpdateValuesRequest oRequest = new BatchUpdateValuesRequest();
oRequest.setValueInputOption("RAW");
oRequest.setData(oList);
BatchUpdateValuesResponse oResp1 = mService.spreadsheets().values().batchUpdate("ID_SPREADSHEET", oRequest).execute();
Есть какой-то трюк в обозначении A1 для этого ?
Мне нужен эквивалент .getLastRow from Google Apps Script
4 ответов:
API v4 не имеет возможности задать вопрос "какова последняя строка с данными", поскольку это другой стиль API, чем API сценариев приложений. Вы можете сделать вывод о последней строке самостоятельно, запросив данные и подсчитав смещение от первой запрошенной строки до последней возвращенной строки.
Если вы используете функцию добавления и устанавливаете диапазон для всего листа, API найдет последнюю строку и добавит новые данные после нее.
Эта веб-страница объясняет это.
Https://developers.google.com/sheets/api/guides/values#appending_values
Вот пример кода:
Обратите внимание, что ответ сообщит вам, где он был вставлен.String range="Sheet1"; insertData.setValues(rows); AppendValuesResponse response=service.spreadsheets().values() .append(spreadsheetId,range,insertData).setValueInputOption("USER_ENTERED") .execute();
Вы можете использовать AppendCellsRequest для добавления строки. Приведенные ниже методы должны помочь вам. Я не включил метод getRowDataListForCellStrings, поскольку он довольно специфичен для конкретного приложения.
Сначала создайте объект запроса, содержащий AppendCellsRequest:
public BatchUpdateSpreadsheetResponse appendWorksheet(String cellValues) throws SpreadsheetException { AppendCellsRequest appendRequest = new AppendCellsRequest(); appendRequest.setSheetId( mSheet.getProperties().getSheetId() ); appendRequest.setRows( getRowDataListForCellStrings(cellValues) ); appendRequest.setFields("userEnteredValue"); Request req = new Request(); req.setAppendCells( appendRequest ); return executeBatchRequest(req); }Затем вызовите batchUpdate на интерфейсе spreadsheets ():
BatchUpdateSpreadsheetResponse executeBatchRequest(Request request) throws SpreadsheetException { List<Request> requests = new ArrayList<>(); requests.add( request ); BatchUpdateSpreadsheetRequest batchRequest = new BatchUpdateSpreadsheetRequest(); batchRequest.setRequests( requests ); try { return mService.spreadsheets().batchUpdate(mSpreadsheet.getSpreadsheetId(), batchRequest).execute(); } catch (IOException e) { throw new SpreadsheetException(e); } }К сожалению, не существует способа узнать, какие строки были обновлены. Не представляется возможным установить valueInputOption, когда добавление таким образом.
На самом деле есть способ спросить API. Я использую это на своем узле.клиент js (уверен, что это очень похоже)
var sheets = google.sheets('v4'); sheets.spreadsheets.get({ auth: auth, spreadsheetId: 'spreadsheet_id', includeGridData: true }, function (err, response) { if (err) { console.log('The API returned an error: ' + err); } else { var last_row = response.sheets[0].data[0].rowData.length; } });
Comments