diff --git a/service.go b/service.go index 64990b5..bdd3fd7 100644 --- a/service.go +++ b/service.go @@ -190,6 +190,16 @@ func (s *Service) DeleteSheet(spreadsheet *Spreadsheet, sheetID uint) (err error return } +// Sort sorts cells in the sheet +func (s *Service) SortRange(sheet *Sheet, fromCol int, toCol int, fromRow int, toRow int, sortCols ...SortColumn) (err error) { + r, err := newUpdateRequest(sheet.Spreadsheet) + if err != nil { + return + } + err = r.SortRange(sheet, fromCol, toCol, fromRow, toRow, sortCols...).Do() + return +} + // SyncSheet updates sheet func (s *Service) SyncSheet(sheet *Sheet) (err error) { if sheet.newMaxRow > sheet.Properties.GridProperties.RowCount || diff --git a/sheet.go b/sheet.go index 386d887..900789b 100644 --- a/sheet.go +++ b/sheet.go @@ -150,6 +150,21 @@ func (sheet *Sheet) DeleteColumns(start, end int) (err error) { return } +// Sorting order +const SortOrderAscending = "ASCENDING" +const SortOrderDescending = "DESCENDING" + +type SortColumn struct { + Index int + Order string +} + +// Sort sorts cells in the sheet +func (sheet *Sheet) Sort(fromCol int, toCol int, fromRow int, toRow int, sortCols ...SortColumn) (err error) { + err = sheet.Spreadsheet.service.SortRange(sheet, fromCol, toCol, fromRow, toRow, sortCols...) + return +} + // Synchronize reflects the changes of the sheet. func (sheet *Sheet) Synchronize() (err error) { err = sheet.Spreadsheet.service.SyncSheet(sheet) diff --git a/update_request.go b/update_request.go index e5d00a5..6dbc7b6 100644 --- a/update_request.go +++ b/update_request.go @@ -298,8 +298,28 @@ func (r *updateRequest) DeleteConditionalFormatRule() { } -func (r *updateRequest) SortRange() { +func (r *updateRequest) SortRange(sheet *Sheet, fromCol int, toCol int, fromRow int, toRow int, sortCols ...SortColumn) (ret *updateRequest) { + sortSpecs := make([]map[string]interface{}, len(sortCols)) + for _, sc := range sortCols { + sortSpecs = append(sortSpecs, map[string]interface{}{ + "sortOrder": sc.Order, + "dimensionIndex": sc.Index, + }) + } + r.body["requests"] = append(r.body["requests"], map[string]interface{}{ + "sortRange": map[string]interface{}{ + "range": map[string]interface{}{ + "sheetId": sheet.Properties.ID, + "startRowIndex": fromRow, + "endRowIndex": toRow, + "startColumnIndex": fromCol, + "endColumnIndex": toCol, + }, + "sortSpecs": sortSpecs, + }, + }) + return r } func (r *updateRequest) SetDataValidation() {