通过电子表格api更新包含大量数据的Google电子表格的最快方法是什么?

Dan*_*iel 5 google-api google-spreadsheet-api

我使用Google Spreadsheet API更新包含大量数据的电子表格(数百行和大约20列).

我已经测试了批量调用以更新2500个单元格.该呼叫大约需要40秒才能完成,请求大约为1mb,响应大约为2mb.

有没有办法让它更快地运作?

小智 11

通过在UPDATE之前跳过QUERY部分,我能够加快官方API http://code.google.com/apis/spreadsheets/data/3.0/developers_guide.html#SendingBatchRequests中提供的批处理请求.这就是他们在示例中所拥有的:

// 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);
Run Code Online (Sandbox Code Playgroud)

这就是我改变它的原因

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);
Run Code Online (Sandbox Code Playgroud)

请注意,应更改标题以使其正常工作.


Sim*_*got 1

如果您要更新整行,您可以尝试使用基于列表的提要:

http://code.google.com/intl/fr-FR/apis/spreadsheets/data/3.0/developers_guide.html#UpdatingListRows

它将允许您更新值(而不是公式)。

如果您仍然遇到性能问题,您应该切换到关系数据库服务器或谷歌数据存储之类的东西(如果您正在使用谷歌应用程序引擎)