2017-08-16 103 views
0

我们使用Google表格作为Data Studio和其他BI产品(Tableau,Domo)的数据源。我们使用Google Drive API创建新工作表,并将MIME类型设置为将CSV文件自动转换为工作表。这一切都很好。但是,当我们通过Drive API覆盖具有较新数据的现有工作表时,它将删除原始工作表并创建一个新工作表(不是工作表本身,而是工作表中唯一的工作表)。这会中断与Data Studio的数据源的连接(它需要工作表ID保持不变)。我们如何使用Google Sheets API做同样的事情?这是战略吗?用新数据覆盖Google表格

  1. 截断现有工作表(batchClear)中的数据。
  2. 将新数据写入以单元格0,0(batchUpdate)开始的现有工作表并在循环中一次写入X行(不通过Sheets API上传文件...)。

新数据具有相同的标题,但可能有较少的行,所以只是覆盖而不清除将不起作用。但是如果有一种方法可以作为一个batchUpdate来完成,请告诉我。

回答

0

回答了我自己的问题。在一次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() 
+0

这是假设你知道你要覆盖板的ID,但是这是很容易从电子表格属性发现。 – cbo3