Нужно вставить строку в таблицу Google в указанном месте - PullRequest
4 голосов
/ 06 февраля 2012

Я использую python для обновления электронной таблицы Google. Библиотека Python Google для электронных таблиц позволяет вставлять строку в таблицу с помощью API InsertRow.

Вот пример:

gd_client.InsertRow(myDict, spreadSheetKey, workSheetKey)

myDictionary - это словарь, который вы вставляете, spreadsheetKey - это ключ для вашей электронной таблицы, а worksheetKey - это ключ для вашей рабочей таблицы. Тем не менее, я хотел бы вставить в определенную строку в середине моей таблицы. Этот API вставляется только в конце.

Кто-нибудь знает, есть ли способ сделать это?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 06 февраля 2012

Самый простой способ - это иметь два листа в одной электронной таблице.Один из них - это необработанные данные, которые вставляются извне, а второй - это расчетные данные (сортировка, функции ...), основанные на этих необработанных данных.

Например, если вы хотите, чтобы данныебыть отсортированным по второму столбцу, вы можете поместить во второй лист:

=EXPAND(SORT(Sheet1!A:D,2,1))

Это разделение также хорошо, как если вы хотите обновить данные извне.Это будет конфликтовать с операциями, которые могут выполняться с вашими данными, например с добавлением вычисляемых столбцов в строки данных.

1 голос
/ 22 января 2013

Как * вставить строку * в середину электронной таблицы Google через API / OAuth ..... трудным путем. (Я предполагаю, что нет простого способа, потому что есть запрос на добавление функции в API).

          Pattern cellRefPattern = Pattern.compile("R(\\[?)([-0-9]+)\\]?C(\\[?)([-0-9]*)\\]?");
              worksheet.setRowCount(worksheet.getRowCount()+1);
              worksheet.update();
              CellFeed batchRequest = new CellFeed();
              for (AppCell cellAddr : cellAddresses.values()) {

                  // create a copy of the cell to replace
                  CellEntry batchEntry = new CellEntry(cellAddr.row, cellAddr.col, cellAddr.reference);

                  String updateReference = cellAddr.inputValue; 

                  if(updateReference.startsWith("=")) {
                      String removeReferenceBug = updateReference.replace( (CharSequence) "C:R", (CharSequence) "C[0]:R");
                      Matcher referenceMatcher = cellRefPattern.matcher(removeReferenceBug);
                      StringBuffer restultBuffer = new StringBuffer();
                      while (referenceMatcher.find()) {
                          try {
                              if(referenceMatcher.group(1).equals("[")) {
                                  int rowOffset = Integer.parseInt(referenceMatcher.group(2));
                                  int topRowOfSpan;
                                  int bottomRowOfSpan;                                
                                  int incSize = 1;
                                  if(rowOffset > 0) {
                                      topRowOfSpan = cellAddr.row;
                                      bottomRowOfSpan = cellAddr.row + rowOffset;
                                  } else {
                                      topRowOfSpan = cellAddr.row + rowOffset;
                                      bottomRowOfSpan = cellAddr.row ;      
                                      incSize = -1;
                                  }                               
                                  //System.out.println("move down: reference:"+cellAddr.reference+" topRowOfSpan:"+topRowOfSpan+
                                    //    " insertLocationRow:"+insertLocationRow+" bottomRowOfSpan:"+bottomRowOfSpan);
                                  if(topRowOfSpan <= insertLocationRow && bottomRowOfSpan > insertLocationRow) rowOffset += incSize;
                                  if(referenceMatcher.group(3).equals("[")) {
                                      referenceMatcher.appendReplacement(restultBuffer, "R["+rowOffset+"]C["+referenceMatcher.group(4)+"]");                                      

                                  } else {
                                      int colOffset = 0;                                          
                                      String col = referenceMatcher.group(4);                                         
                                      if(col != null && "".equals(col) == false) {
                                          colOffset = Integer.parseInt(col) - cellAddr.col;
                                      }                                       
                                      referenceMatcher.appendReplacement(restultBuffer, "R["+rowOffset+"]C["+colOffset+"]");                                                                              
                                  }                                   
                              } else {
                                  int absoluteRow = Integer.parseInt(referenceMatcher.group(2));
                                  if(absoluteRow >= insertLocationRow ) absoluteRow ++;
                                  if(referenceMatcher.group(3).equals("[")) {
                                      referenceMatcher.appendReplacement(restultBuffer, "R"+absoluteRow+"C["+referenceMatcher.group(4)+"]");                                                                                                              
                                  } else {
                                      referenceMatcher.appendReplacement(restultBuffer, "R"+absoluteRow+"C"+referenceMatcher.group(4));                                                                                                                                                   
                                  }

                              }
                          } catch(NumberFormatException nfe) {}
                      }
                      referenceMatcher.appendTail(restultBuffer);
                      updateReference = restultBuffer.toString();                                                                         

                  }


                  batchEntry.setId(String.format("%s/%s", worksheet.getCellFeedUrl().toString(), cellAddr.reference));              
                  batchEntry.changeInputValueLocal(updateReference);
                  BatchUtils.setBatchId(batchEntry, cellAddr.reference);
                  BatchUtils.setBatchOperationType(batchEntry, BatchOperationType.UPDATE);

                  // add the copy to the batch list
                  batchRequest.getEntries().add(batchEntry);
              }


              // Submit the update
              Link batchLink = cellFeed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM);
              service.setHeader("If-Match", "*");
              CellFeed batchResponse = service.batch(new URL(batchLink.getHref()), batchRequest);
              service.setHeader("If-Match", null);

Модифицированная версия https://developers.google.com/google-apps/spreadsheets/#updating_multiple_cells_with_a_batch_request

Проблема: не проверять строки в формулах

AppCell содержит: строку, столбец и ссылку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...