+ body = {
+ "name": name,
+ "parents": [folder_id],
+ "mimeType": "application/vnd.google-apps.spreadsheet"
+ }
+
+ spreadsheet = turb.files.create(body=body, fields='id').execute()
+ id = spreadsheet['id']
+
+ # The files.create call gives us the ID for our new sheet, but we
+ # need the URL for it as well. So we get that with the sheets API.
+ spreadsheet = turb.sheets.get(spreadsheetId=id,
+ fields='spreadsheetUrl').execute()
+ url = spreadsheet['spreadsheetUrl']
+
+ # Finally, we want to also allow anyone with the link to the sheet
+ # to be able to edit it.
+ turb.permissions.create(fileId=id,
+ body={'type': 'anyone', 'role': 'writer'},
+ fields='').execute()
+
+ return {
+ 'id': id,
+ 'url': url
+ }
+
+def sheets_create_for_puzzle(turb, puzzle, folder_id):
+ """Creates a new sheet for a puzzle of the given name
+
+ Like sheets_create(), but also copies the puzzle template sheet.
+
+ Here, 'puzzle' is a dict that must have a 'name' key and may optionally
+ have a 'channel_url' or 'url' key.
+ """
+
+ # First create the new spreadsheet
+ spreadsheet = sheets_create(turb, puzzle['name'], folder_id)
+ spreadsheet_id = spreadsheet['id']
+ spreadsheet_url = spreadsheet['url']
+
+ # And fetch the individual "sheets" from the spreadsheet
+ spreadsheet = turb.sheets.get(spreadsheetId=spreadsheet_id,
+ fields='sheets').execute()
+ first_sheet_id = spreadsheet['sheets'][0]['properties']['sheetId']
+
+ # Then, copy some useful sheets over from the Template spreadsheet
+ response = turb.sheets.get(spreadsheetId=PUZZLE_TEMPLATE_ID).execute()
+
+ for sheet in response["sheets"]:
+ if sheet["properties"]["title"] in PUZZLE_TEMPLATE_SHEETS:
+ res = turb.sheets.sheets().copyTo(
+ spreadsheetId=PUZZLE_TEMPLATE_ID,
+ sheetId=sheet["properties"]["sheetId"],
+ body={
+ "destinationSpreadsheetId": spreadsheet_id
+ }).execute()
+ # Rename each copied sheet to match the name from the template
+ sheet_name = sheet["properties"]["title"]
+ # Except for "Text" which we rename to the puzzle name
+ if sheet_name == "Text":
+ sheet_name = puzzle['name']
+ rename_sheet(turb, spreadsheet_id, res['sheetId'], sheet_name)
+
+ # Next, delete the blank sheet made at spreadsheet creation time
+ delete_sheet(turb, spreadsheet_id, first_sheet_id)
+
+ # Insert some useful links into the sheet where expected
+ if 'url' in puzzle:
+ url_link = puzzle['url']
+ url_text = "Original puzzle link"
+ spreadsheet_insert_data(
+ turb, spreadsheet_id, "B1:B1",
+ '=HYPERLINK("{}","{}")'.format(url_link, url_text))
+
+ if 'channel_url' in puzzle:
+ url_link = puzzle['channel_url']
+ url_text = "Slack channel link"
+ spreadsheet_insert_data(
+ turb, spreadsheet_id, "B2:B2",
+ '=HYPERLINK("{}","{}")'.format(url_link, url_text))
+
+ return {
+ 'id': spreadsheet_id,
+ 'url': spreadsheet_url
+ }
+
+def spreadsheet_insert_data(turb, spreadsheet_id, range, text):
+
+ turb.sheets.values().append(
+ spreadsheetId=spreadsheet_id,
+ range=range,
+ valueInputOption='USER_ENTERED',
+ insertDataOption='INSERT_ROWS',
+ body={
+ 'range': range,
+ 'values': [
+ [text]
+ ]
+ }
+ ).execute()
+
+def delete_sheet(turb, spreadsheet_id, sheet_id):
+
+ body = {
+ 'requests': [{
+ 'deleteSheet': {
+ 'sheetId': sheet_id,
+ },
+ }]
+ }
+
+ turb.sheets.batchUpdate(spreadsheetId=spreadsheet_id,
+ body=body
+ ).execute()
+
+def rename_sheet(turb, spreadsheet_id, sheet_id, name):
+
+ body = {
+ 'requests': [{
+ 'updateSheetProperties': {
+ 'properties': {
+ 'sheetId': sheet_id,
+ 'title': name
+ },
+ 'fields': 'title'
+ }
+ }]
+ }
+
+ turb.sheets.batchUpdate(spreadsheetId=spreadsheet_id,
+ body=body
+ ).execute()