用新数据覆盖谷歌表

时间:2017-08-16 14:22:26

标签: google-sheets-api

我们使用Google表格作为Data Studio和其他BI产品(Tableau,Domo)的数据源。我们使用Google Drive API创建新工作表,并设置mime类型以自动将CSV文件转换为工作表。一切正常。但是,当我们通过Drive API覆盖包含较新数据的现有工作表时,它会删除原始工作表并创建一个新工作表(不是工作表本身,而是工作表中唯一的工作表)。这打破了与Data Studio数据源的连接(它需要工作表ID保持不变)。我们如何使用Google表格API执行相同的操作?这是策略吗?

  1. 截断现有工作表中的数据(batchClear)。
  2. 将新数据写入从单元格0,0(batchUpdate)开始的现有工作表,并在循环中一次写入X行(不通过表格API上传文件......)。
  3. 新数据具有相同的标题但可能包含更少的行,因此只需覆盖而不清除将无效。但如果有一种方法可以作为一个批量更新,请告诉我。

1 个答案:

答案 0 :(得分:1)

回答了我自己的问题。在一个batchRequest调用中用新数据覆盖工作表很容易。您只需要发送一个UpdateSheetPropertiesRequest来标识工作表并设置新的列和行计数。与具有新数据的UpdateCellsRequest一起批处理。这里有一些很常见的代码:

// read CSV file into memory as list of RowData records
def numCols, numRows, rows
(numCols, numRows, rows) = makeRows(url)
// overwrite sheet with data
def requests = []
// update sheet properties
requests << new Request()
  .setUpdateSheetProperties(new UpdateSheetPropertiesRequest()
    .setFields('gridProperties(rowCount,columnCount)')
    .setProperties(new SheetProperties()
      .setSheetId(sheetId)
      .setGridProperties(new GridProperties()
        .setColumnCount(numCols)
        .setRowCount(numRows))))
// overwrite sheet data
requests << new Request()
  .setUpdateCells(new UpdateCellsRequest()
    .setStart(new GridCoordinate()
      .setColumnIndex(0)
      .setRowIndex(0)
      .setSheetId(sheetId))
    .setRows(rows)
    .setFields('*'))
// batch those requests
def body = new BatchUpdateSpreadsheetRequest()
  .setRequests(requests)
def resp = sheets.spreadsheets()
                 .batchUpdate(id, body)
                 .execute()