Skip to content

Commit 4773bc7

Browse files
committed
Added datadrig improvemnts
2 parents 82e3e83 + 8a51fd0 commit 4773bc7

3 files changed

Lines changed: 42 additions & 26 deletions

File tree

pygsheets/datarange.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ def range(self):
118118
"""Range in format A1:C5"""
119119
return format_addr(self._start_addr) + ':' + format_addr(self._end_addr)
120120

121+
@property
122+
def worksheet(self):
123+
return self._worksheet
124+
121125
def link(self, update=True):
122126
"""link the dstarange so that all propertis are synced right after setting them
123127
@@ -211,8 +215,12 @@ def __eq__(self, other):
211215
return self.start_addr == other.start_addr and self.end_addr == other.end_addr and self.name == other.name
212216

213217
def __repr__(self):
214-
return '<%s %s %s protected:%s>' % (self.__class__.__name__,
215-
str(self._name), str(self.range), self._protected)
218+
range_str = self.range
219+
if self.worksheet:
220+
range_str = str(self.range)
221+
protected_str = " protected" if self._protected else ""
222+
223+
return '<%s %s %s%s>' % (self.__class__.__name__, str(self._name), range_str, protected_str)
216224

217225

218226
class ProtectedRange(object):

pygsheets/spreadsheet.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import warnings
1212

1313
from .worksheet import Worksheet
14+
from .datarange import DataRange
1415
from .exceptions import (WorksheetNotFound, RequestError,
1516
InvalidArgumentValue, InvalidUser)
1617
from .custom_types import *
@@ -34,7 +35,7 @@ def __init__(self, client, jsonsheet=None, id=None):
3435
self._jsonsheet = jsonsheet
3536
self._id = id
3637
self._title = ''
37-
self.named_ranges = []
38+
self._named_ranges = []
3839
self.update_properties(jsonsheet)
3940
self._permissions = dict()
4041
self.batch_mode = False
@@ -54,6 +55,12 @@ def sheet1(self):
5455
"""Shortcut property for getting the first worksheet."""
5556
return self.worksheet()
5657

58+
@property
59+
def named_ranges(self):
60+
"""All named ranges in thi spreadsheet"""
61+
return [DataRange(namedjson=x, name=x['name'], worksheet=self.worksheet('id', x['range'].get('sheetId', 0)))
62+
for x in self._named_ranges]
63+
5764
@property
5865
def defaultformat(self):
5966
""" deafault cell format"""
@@ -86,7 +93,7 @@ def update_properties(self, jsonsheet=None, fetch_sheets=True):
8693
self._title = self._jsonsheet['properties']['title']
8794
self._defaultFormat = self._jsonsheet['properties']['defaultFormat']
8895
self.client.spreadsheetId = self._id
89-
self.named_ranges = self._jsonsheet.get('namedRanges', [])
96+
self._named_ranges = self._jsonsheet.get('namedRanges', [])
9097

9198
def _fetch_sheets(self, jsonsheet=None):
9299
"""update sheets list"""

pygsheets/worksheet.py

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,6 @@ def update_row(self, index, values, col_offset=0):
456456
"""
457457
if type(values[0]) is not list:
458458
values = [values]
459-
# colrange = format_addr((row_offset, index), 'label') + ":" + format_addr((row_offset+len(values[0])-1,
460459
colrange = format_addr((index, col_offset+1), 'label') + ':' + format_addr((index+len(values)-1,
461460
col_offset+len(values[0])), 'label')
462461
self.update_cells(crange=colrange, values=values, majordim='ROWS')
@@ -558,8 +557,7 @@ def insert_rows(self, row, number=1, values=None, inherit=False):
558557
self.update_row(row+1, values)
559558

560559
def clear(self, start='A1', end=None):
561-
"""
562-
clears the worksheet by default, if range given then clears range
560+
"""clears the worksheet by default, if range given then clears range
563561
564562
:param start: topright cell address
565563
:param end: bottom left cell of range
@@ -571,11 +569,12 @@ def clear(self, start='A1', end=None):
571569
self.client.sh_batch_clear(self.spreadsheet.id, body)
572570

573571
def adjust_column_width(self, start, end=None, pixel_size=100):
574-
"""
575-
Adjust the width of one or more columns
572+
"""Adjust the width of one or more columns
573+
576574
:param start: index of the column to be resized
577575
:param end: index of the end column that will be resized
578576
:param pixel_size: width in pixels
577+
579578
"""
580579
if end is None or end <= start:
581580
end = start + 1
@@ -598,11 +597,12 @@ def adjust_column_width(self, start, end=None, pixel_size=100):
598597
self.client.sh_batch_update(self.spreadsheet.id, request, batch=self.spreadsheet.batch_mode)
599598

600599
def adjust_row_height(self, start, end=None, pixel_size=100):
601-
"""
602-
Adjust the height of one or more rows
600+
"""Adjust the height of one or more rows
601+
603602
:param start: index of the row to be resized
604603
:param end: index of the end row that will be resized
605604
:param pixel_size: height in pixels
605+
606606
"""
607607
if end is None or end <= start:
608608
end = start + 1
@@ -673,6 +673,8 @@ def create_named_range(self, name, start, end):
673673
:param end: bottom right cell adress
674674
675675
"""
676+
start = format_addr(start, 'tuple')
677+
end = format_addr(end, 'tuple')
676678
request = {"addNamedRange": {
677679
"namedRange": {
678680
"name": name,
@@ -685,42 +687,43 @@ def create_named_range(self, name, start, end):
685687
}
686688
}}}
687689
self.client.sh_batch_update(self.spreadsheet.id, request, batch=self.spreadsheet.batch_mode)
688-
self.spreadsheet.named_ranges.append(request['addNamedRange']['namedRange'])
689690
return DataRange(start, end, self, name)
690691

691692
def get_named_ranges(self, name=''):
692693
"""
693694
get a named range given name
694-
:param name: Name of the named range to be retrived
695-
:return: :class: DataRange
695+
696+
:param name: Name of the named range to be retrived, if omitted all ranges are retrived
697+
:return: :class:`DataRange`
698+
696699
"""
697700
if name == '':
698701
self.spreadsheet.update_properties()
699-
nrange = [DataRange(namedjson=x, name=x['name'], worksheet=self) for x in self.spreadsheet.named_ranges if
700-
x['range'].get('sheetId', 0) == self.id]
702+
nrange = [x for x in self.spreadsheet.named_ranges if x.worksheet.id == self.id]
701703
return nrange
702704
else:
703-
nrange = [x for x in self.spreadsheet.named_ranges if x['name'] == name and x['range'].get('sheetId', 0) == self.id]
705+
nrange = [x for x in self.spreadsheet.named_ranges if x.name == name and x.worksheet.id == self.id]
704706
if len(nrange) == 0:
705707
self.spreadsheet.update_properties()
706-
nrange = [x for x in self.spreadsheet.named_ranges if
707-
x['name'] == name and x['range'].get('sheetId', 0) == self.id]
708+
nrange = [x for x in self.spreadsheet.named_ranges if x.name == name and x.worksheet.id == self.id]
708709
if len(nrange) == 0:
709710
raise RangeNotFound(name)
710-
return DataRange(namedjson=nrange[0], name=nrange[0]['name'], worksheet=self)
711+
return nrange[0]
711712

712713
def delete_named_range(self, name, range_id=''):
713-
"""
714-
delete a named range
714+
"""delete a named range
715+
715716
:param name: name of named range to be deleted
716717
:param range_id: id of the named range
718+
717719
"""
718720
if not range_id:
719721
range_id = self.get_named_ranges(name=name).name_id
720722
request = {'deleteNamedRange': {
721723
"namedRangeId": range_id,
722724
}}
723725
self.client.sh_batch_update(self.spreadsheet.id, request, batch=self.spreadsheet.batch_mode)
726+
self.spreadsheet._named_ranges = [x for x in self.spreadsheet._named_ranges if x["namedRangeId"] != range_id]
724727

725728
def set_dataframe(self, df, start, copy_index=False, copy_head=True, fit=False, escape_formulae=False, nan='NaN'):
726729
"""
@@ -733,7 +736,6 @@ def set_dataframe(self, df, start, copy_index=False, copy_head=True, fit=False,
733736
:param fit: should the worksheet should be resized to fit the dataframe
734737
:param escape_formulae: If any value starts with an equals sign =, it will be
735738
prefixed with a apostrophe ', to avoid being interpreted as a formula.
736-
737739
:param nan: value to replace NaN with
738740
"""
739741
start = format_addr(start, 'tuple')
@@ -835,10 +837,9 @@ def export(self, fformat=ExportType.CSV, filename=None):
835837
raise InvalidArgumentValue("fformat should be of ExportType Enum")
836838

837839
def copy_to(self, spreadsheet_id):
838-
"""
839-
copy the worksheet to specified spreadsheet
840-
:param spreadsheet_id: id to the spreadsheet to copy
840+
"""copy the worksheet to specified spreadsheet
841841
842+
:param spreadsheet_id: id of the spreadsheet to copy
842843
"""
843844
self.client.sh_copy_worksheet(self.spreadsheet.id, self.id, spreadsheet_id)
844845

0 commit comments

Comments
 (0)