2

谷歌文档页面说

Sheets API v4 确实提供了一个 AppendCells 请求,该请求可与电子表格.batchUpdate 方法一起使用,以将一行数据附加到工作表(如果需要,同时更新单元格属性和格式)。

这确实适用于添加新行,即使创建 RowData 有效负载很乏味。但是,这不允许设置 ValueInputOption。

谷歌还说

但是,通常更容易确定要添加的行的 A1 表示法,然后发出电子表格.values.update 请求以覆盖该行。在这种情况下,指定行中的任何数据都将被覆盖。

现在这适用于更新现有行上的数据 - 包括 ValueInputOption。但是,当我使用它来追加新行(即提供下一行的范围)时,服务器会返回 503 错误。我一定有一个技巧吗?

4

2 回答 2

3

正如评论者所建议的那样,我应该在我的问题中发布代码。但是,我将它作为这个答案的一部分发布 - 这显然是一个次优的解决方案,但符合我的目的。

这是我最终得到的代码(省略了 OAuth 和服务实例化)

 Public Function AddRows(Values As Object()()) As Boolean

        Try

            'Create dummy rows value payload
            Dim cell2add As New CellData
            Dim cellval As New ExtendedValue
            cellval.NumberValue = 0
            cell2add.UserEnteredValue = cellval
            Dim data2add As New RowData
            data2add.Values = {cell2add}

            Dim rowdataList As New List(Of RowData)
            For i = 0 To UBound(Values)
                rowdataList.Add(data2add)
            Next

            'Add a request to append to the sheet's data (expand grid)
            Dim appendRequest As New AppendCellsRequest
            appendRequest.SheetId = SheetID
            appendRequest.Rows = rowdataList.ToArray           
            appendRequest.Fields = "*"
            Dim request As New Request
            request.AppendCells = appendRequest

            'Execute the request
            Dim bRequest As New BatchUpdateSpreadsheetRequest
            bRequest.Requests = {request}
            Dim bResponse As BatchUpdateSpreadsheetResponse = Service.Spreadsheets.BatchUpdate(bRequest, DataBaseName).Execute()

            'Now update the newly added rows with data
            Dim index As Integer = GetRowCount() - Values.Length + 2 'GetRowCount() calls the service to get sheet metadata and returns the rows of data (excluding the headers)
            Dim vals As New ValueRange
            vals.Values = Values
            Dim urequest As SpreadsheetsResource.ValuesResource.UpdateRequest =
                Service.Spreadsheets.Values.Update(vals, DataBaseName, Name & "!A" & index)
            urequest.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED
            Dim response As UpdateValuesResponse = urequest.Execute
            Return response.UpdatedRows = Values.Length

        Catch ex As Exception
            Trace.WriteLine(Now.ToLongTimeString & ":" & ex.Message)
            Return False
        End Try

    End Function

简而言之,我调用 AppendCells 来扩展“网格”的大小,然后更新由此创建的空白行中的值。如果您尝试更新新行的值,服务器将返回“服务不可用”错误。当我尝试更新现有行中的值 (values.batchUpdate) 并在同一请求中添加新行时,我发现了这个问题。在那种情况下,错误消息提到了“超出网格”的更新。

于 2016-06-06T17:06:46.170 回答
1

没有用于通过电子表格.values 集合(支持 A1 表示法和 ValueInputOption 的集合)追加行的 API。我们正在内部将其作为功能请求进行跟踪,并可能会增加支持。同时,追加行的唯一方法是通过 batchUpdate 方法(但是,如果您不需要 CellData 对象提供的额外功能,例如格式化,那么按照您的说法,这样做很乏味)。

于 2016-06-07T18:56:09.303 回答