Как вставить строку после последней строки со значением?

Я вставляю данные в электронную таблицу с новым 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 из Google Apps Script.


person seba123neo    schedule 03.06.2016    source источник
comment
Этот ответ на ваш предыдущий вопрос все еще применяется: запросите значения из таблицы, посмотрите, сколько строк вы фактически получите (пустые конечные строки опущено). Кажется расточительным запрашивать содержимое, когда вам нужен только диапазон данных, но я не видел другого способа с API v4.   -  person    schedule 03.06.2016
comment
спасибо, но мне нужен простой эквивалент .getLastRow из Google Apps Script, это отсутствует функция?   -  person seba123neo    schedule 04.06.2016


Ответы (4)


API v4 не имеет возможности спросить, «какая последняя строка с данными», поскольку это другой стиль API, чем API скриптов приложений. Вы можете вывести последнюю строку самостоятельно, запросив данные и посчитав смещение от первой запрошенной строки до последней возвращенной строки.

person Sam Berlin    schedule 07.06.2016

Если вы используете функцию добавления и устанавливаете диапазон для всего листа, 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();

Обратите внимание, что ответ сообщит вам, где он был вставлен.

person dvc    schedule 09.02.2017
comment
Я знаю, что это произошло через два года, но когда у меня есть пустой столбец, данные добавляются, начиная с последнего столбца с данными. Итак, если у меня есть A1 = ›hello C1 =› world и я выполняю добавление со всем листом в качестве диапазона, он будет добавлен к C2 и далее. - person Healyhatman; 18.02.2019
comment
Хотя это и нежелательно, я думаю, что это работает так, как задумано. Если вы прочитаете пример, показанный в ссылке из моего ответа, вы увидите, что API ищет дискретные таблицы в данных и добавляет их к последней таблице. Таблицы разделены пустыми ячейками, поэтому в вашем случае последняя таблица - c1, поэтому данные добавляются к c2. - person dvc; 19.02.2019

Вы можете использовать AppendCellsRequest для добавления строки. Приведенные ниже методы должны помочь вам. Я не включил метод getRowDataListForCellStrings, поскольку он скорее зависит от приложения.

Сначала создайте объект Request, содержащий 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 при добавлении таким образом.

person PeterU    schedule 03.06.2016
comment
спасибо, но мне нужен простой эквивалент .getLastRow из Google Apps Script, это отсутствует функция? - person seba123neo; 04.06.2016

На самом деле есть способ спросить API. Я использую это на своем клиенте node.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;

    }
  });
person Delneg    schedule 18.07.2016
comment
Вам действительно следует добавить некоторые пояснения, почему этот код должен работать - вы также можете добавлять комментарии в сам код - в его текущей форме он не предоставляет никаких объяснений, которые могли бы помочь остальной части сообщества понять, что вы сделали для решения /ответить на вопрос. - person ishmaelMakitla; 18.07.2016
comment
Он набирает все строки и затем подсчитывает. Если лист слишком длинный, это может быть не так эффективно, как использование метода добавления. - person jleviaguirre; 13.04.2019