]> git.cworth.org Git - turbot/blob - turbot/sheets.py
Add automatic refreshing of the Google Sheets token
[turbot] / turbot / sheets.py
1 from flask import current_app
2 import pickle
3 import os.path
4 import os
5
6 from google.auth.transport.requests import Request
7 from googleapiclient.discovery import build
8
9 TEMPLATE_SHEET_ID = "1drSoyrE4gM3JaGweDkOybwXWdKPIDTfUmB1gQCYS3Uw"
10 TEMPLATE_SHEET_SHEETS = ["Text", "Grid"]
11
12 turbot_deploy_dir = os.environ.get('TURBOT_DEPLOY_DIR', '.')
13 TOKEN_FILE = "{}/.gsheets-token.pickle".format(turbot_deploy_dir)
14
15 creds = None
16
17 def sheets_create(name):
18     """Create a new sheet with the given name.
19
20     Returns the URL for the spreadsheet.
21     """
22     global creds
23
24     # The token file stores token from last login/refresh
25     if not creds:
26         if os.path.exists(TOKEN_FILE):
27             with open(TOKEN_FILE, 'rb') as token:
28                 creds = pickle.load(token)
29
30     # Refresh credentials if necessary
31     if creds and not creds.valid:
32         creds.refresh(Request())
33
34     # If there are no (valid) credentials available, give up
35     if not creds or not creds.valid:
36         current_app.logger.error("No token found in {}".format(TOKEN_FILE))
37         current_app.logger.error("Try running ./gsheets-authenticate.py")
38         return None
39
40     service = build('sheets', 'v4', credentials=creds)
41     sheets = service.spreadsheets()
42
43     # Create a new spreadsheet
44     spreadsheet_body = {
45         'properties': {
46             'title': name
47         }
48     }
49
50     new_sheet = sheets.create(body=spreadsheet_body).execute()
51     spreadsheet_url = new_sheet["spreadsheetUrl"]
52     spreadsheet_id = new_sheet["spreadsheetId"]
53
54     # Copy some sheets from the Template spreadsheet
55
56     response = sheets.get(spreadsheetId=TEMPLATE_SHEET_ID).execute()
57
58     for sheet in response["sheets"]:
59         if sheet["properties"]["title"] in TEMPLATE_SHEET_SHEETS:
60             sheets.sheets().copyTo(spreadsheetId=TEMPLATE_SHEET_ID,
61                                    sheetId=sheet["properties"]["sheetId"],
62                                    body={
63                                        "destinationSpreadsheetId":
64                                        spreadsheet_id
65                                    }).execute()
66
67     return spreadsheet_url