What is the fastest way to update a google spreadsheet with a lot of data through the spreadsheet api?

前端 未结 3 1889
我寻月下人不归
我寻月下人不归 2020-12-03 13:19

I am using the Google Spreadsheet API to update a spreadsheet with a lot of data (hundreds of rows and around twenty columns).

I have tested making a batch call to u

3条回答
  •  一个人的身影
    2020-12-03 13:28

    I was able to speed up the batch request provided in the official API http://code.google.com/apis/spreadsheets/data/3.0/developers_guide.html#SendingBatchRequests by skipping the QUERY part before the UPDATE. So this is what they have in the example:

    // Prepare the update
        // getCellEntryMap is what makes the update fast.
        Map cellEntries = getCellEntryMap(ssSvc, cellFeedUrl, cellAddrs);
    
        CellFeed batchRequest = new CellFeed();
        for (CellAddress cellAddr : cellAddrs) {
          URL entryUrl = new URL(cellFeedUrl.toString() + "/" + cellAddr.idString);
          CellEntry batchEntry = new CellEntry(cellEntries.get(cellAddr.idString));
          batchEntry.changeInputValueLocal(cellAddr.idString);
          BatchUtils.setBatchId(batchEntry, cellAddr.idString);
          BatchUtils.setBatchOperationType(batchEntry, BatchOperationType.UPDATE);
          batchRequest.getEntries().add(batchEntry);
        }
      // Submit the update
        Link batchLink = cellFeed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM);
        CellFeed batchResponse = ssSvc.batch(new URL(batchLink.getHref()), batchRequest);
    

    and this is what I changed it to

    CellFeed batchRequest = new CellFeed();
            for (CellInfo cellAddr : cellsInfo) {
                 CellEntry batchEntry = new CellEntry(cellAddr.row, cellAddr.col, cellAddr.idString);
                  batchEntry.setId(String.format("%s/%s", worksheet.getCellFeedUrl().toString(), cellAddr.idString));         
                  BatchUtils.setBatchId(batchEntry, cellAddr.idString);
                  BatchUtils.setBatchOperationType(batchEntry, BatchOperationType.UPDATE);  
                  batchRequest.getEntries().add(batchEntry);
    
    
    
            }
    
            CellFeed cellFeed = ssSvc.getFeed(worksheet.getCellFeedUrl(), CellFeed.class);      
            Link batchLink =  cellFeed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM);
    
            ssSvc.setHeader("If-Match", "*");
            CellFeed batchResponse = ssSvc.batch(new URL(batchLink.getHref()), batchRequest);
            ssSvc.setHeader("If-Match", null);
    

    Notice, the header should be changed to make it work.

提交回复
热议问题