Advertisement
Guest User

Untitled

a guest
Oct 15th, 2016
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.96 KB | None | 0 0
  1. '''
  2. For instructions on how to run: https://developers.google.com/sheets/quickstart/python
  3.  
  4. pip install --upgrade google-api-python-client
  5. '''
  6.  
  7. from __future__ import print_function
  8. import httplib2
  9. import os
  10.  
  11. from apiclient import discovery,errors
  12. import oauth2client
  13. from oauth2client import client
  14. from oauth2client import tools
  15.  
  16. try:
  17. import argparse
  18. flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
  19. except ImportError:
  20. flags = None
  21.  
  22. # If modifying these scopes, delete your previously saved credentials
  23. # at ~/.credentials/sheets.googleapis.com-python-quickstart.json
  24. SCOPES = 'https://www.googleapis.com/auth/spreadsheets'
  25. CLIENT_SECRET_FILE = 'client_secret.json'
  26. APPLICATION_NAME = 'EU4 Spreadsheet'
  27.  
  28.  
  29. def get_credentials():
  30. """Gets valid user credentials from storage.
  31.  
  32. If nothing has been stored, or if the stored credentials are invalid,
  33. the OAuth2 flow is completed to obtain the new credentials.
  34.  
  35. Returns:
  36. Credentials, the obtained credential.
  37. """
  38. home_dir = os.path.expanduser('~')
  39. credential_dir = os.path.join(home_dir, '.credentials')
  40. if not os.path.exists(credential_dir):
  41. os.makedirs(credential_dir)
  42. credential_path = os.path.join(credential_dir,
  43. 'sheets.googleapis.com-python-quickstart.json')
  44.  
  45. store = oauth2client.file.Storage(credential_path)
  46. credentials = store.get()
  47. if not credentials or credentials.invalid:
  48. flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
  49. flow.user_agent = APPLICATION_NAME
  50. if flags:
  51. credentials = tools.run_flow(flow, store, flags)
  52. else: # Needed only for compatibility with Python 2.6
  53. credentials = tools.run(flow, store)
  54. print('Storing credentials to ' + credential_path)
  55. return credentials
  56.  
  57. def get_cellrange(name, rowlength, rowstart=1, columnlength=1, columnstart=1):
  58. '''Currently does not support rowlength>25'''
  59. cellrange = name+'!A{}:'.format(rowstart)
  60. cellrange += chr(65+rowlength) + str(rowstart+columnlength-1)
  61. return cellrange
  62.  
  63. class Sheet:
  64. def __init__(self, SheetProperties):
  65. self.json = SheetProperties
  66. self.Id = SheetProperties['properties']['sheetId']
  67. self.title = SheetProperties['properties']['title']
  68. self.index = SheetProperties['properties']['index']
  69. self.Type = SheetProperties['properties']['sheetType']
  70. self.gridProperties = SheetProperties['properties']['gridProperties']
  71.  
  72. class Spreadsheet:
  73. def __init__(self, spreadsheetId):
  74. self.ssId=spreadsheetId
  75.  
  76. credentials = get_credentials()
  77. http = credentials.authorize(httplib2.Http())
  78. discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?'
  79. 'version=v4')
  80. self.service = discovery.build('sheets', 'v4', http=http,
  81. discoveryServiceUrl=discoveryUrl)
  82. self.sheets = {sheet['properties']['title']:Sheet(sheet) for sheet in self.service.spreadsheets().get(
  83. spreadsheetId=self.ssId, includeGridData=True).execute()['sheets']}
  84. self.batch = {"valueInputOption": "USER_ENTERED", "data": []}
  85.  
  86. def batchUpdate(self, values, cellrange, majorDimension='ROWS'):
  87. self.batch['data'].append({'range':cellrange, 'majorDimension':majorDimension, 'values':values})
  88.  
  89. def batchExecute(self):
  90. resp = self.service.spreadsheets().values().batchUpdate(spreadsheetId=self.ssId,
  91. body=self.batch).execute()
  92. self.batch = {"valueInputOption": "USER_ENTERED","data": []}
  93. return resp
  94.  
  95. def get_sheet(self, title):
  96. return self.sheets.get(title)
  97.  
  98. def get_sheet_values(self, cellrange):
  99. response=self.service.spreadsheets().values().get(
  100. spreadsheetId=self.ssId, range=cellrange).execute()
  101. return response.get('values', [])
  102.  
  103. def add_sheet(self, title, num_rows=4515, num_columns=26, rgb=(0,0,0)):
  104. r,g,b = rgb
  105. request_body = {'requests':[{'addSheet':{'properties':{
  106. 'title':title, 'gridProperties':{
  107. 'rowCount':num_rows, 'columnCount':num_columns},
  108. 'tabColor':{
  109. 'red':r, 'green':g, 'blue':b}}}}]}
  110. try:
  111. response = self.service.spreadsheets().batchUpdate(spreadsheetId=self.ssId,
  112. body=request_body).execute()
  113. sheet = Sheet(response['replies'][0]['addSheet'])
  114. self.sheets[sheet.title]=sheet
  115. return sheet
  116. except errors.HttpError as err:
  117. print(err)
  118.  
  119. def clear_values(self, title):
  120. '''Preserves formatting'''
  121. request_body = {'requests': [{'updateCells': {
  122. 'range': {'sheetId': self.get_sheet(title).Id},
  123. 'fields': 'userEnteredValue'}}]}
  124. self.service.spreadsheets().batchUpdate(spreadsheetId=self.ssId,
  125. body=request_body).execute()
  126.  
  127. def append_values(self, values, cellrange, inptOption='USER_ENTERED'):
  128. '''cellrange specifies sheet and range'''
  129. request_body = {'range':cellrange, 'majorDimension':'ROWS', 'values':values}
  130. self.service.spreadsheets().values().append(spreadsheetId=self.ssId,
  131. range=cellrange,
  132. body=request_body,
  133. valueInputOption=inptOption).execute()
  134.  
  135. def copy_sheet_to(self, sheet, target_ssId):
  136. request_body={"destinationSpreadsheetId": target_ssId}
  137. self.service.spreadsheets().sheets().copyTo(spreadsheetId=self.ssId,
  138. sheetId=sheet.Id,
  139. body=request_body).execute()
  140.  
  141. def delete_sheet(self, sheet):
  142. request_body = {"requests": [{
  143. "deleteSheet": {
  144. "sheetId": sheet.Id}}]}
  145. self.service.spreadsheets().batchUpdate(spreadsheetId=self.ssId,
  146. body=request_body).execute()
  147.  
  148. def main():
  149. '''Clears all non-protected sheets (graphs and formatting is preserved).'''
  150. from settings import SPREADSHEET_ID
  151.  
  152. ss=Spreadsheet(SPREADSHEET_ID)
  153. if input("Clear all values of spreadsheet '%s'? (y/n) " % ss.ssId).lower() == 'y':
  154. for title in ss.sheets.keys():
  155. try:
  156. ss.clear_values(title)
  157. except errors.HttpError as err:
  158. print("Did not clear protected sheet '%s'." % title)
  159.  
  160.  
  161. if __name__ == '__main__':
  162. from settings import SPREADSHEET_ID
  163.  
  164. ss=Spreadsheet(SPREADSHEET_ID)
  165. #main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement