-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsheets.rb
More file actions
136 lines (115 loc) · 3.94 KB
/
sheets.rb
File metadata and controls
136 lines (115 loc) · 3.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
require "google/apis/sheets_v4"
require "googleauth"
require "googleauth/stores/file_token_store"
require "fileutils"
require "faker"
class GoogleSheets
OOB_URI = "urn:ietf:wg:oauth:2.0:oob".freeze
APPLICATION_NAME = "My Google Sheets Application".freeze
CREDENTIALS_PATH = "credentials.json".freeze
# The file token.yaml stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
TOKEN_PATH = "token.yaml".freeze
SCOPE = Google::Apis::SheetsV4::AUTH_SPREADSHEETS
def initialize
# Initialize the API
@service = Google::Apis::SheetsV4::SheetsService.new
@service.client_options.application_name = APPLICATION_NAME
@service.authorization = authorize
end
def service
@service
end
##
# Ensure valid credentials, either by restoring from the saved credentials
# files or intitiating an OAuth2 authorization. If authorization is required,
# the user's default browser will be launched to approve the request.
#
# @return [Google::Auth::UserRefreshCredentials] OAuth2 credentials
def authorize
client_id = Google::Auth::ClientId.from_file CREDENTIALS_PATH
token_store = Google::Auth::Stores::FileTokenStore.new file: TOKEN_PATH
authorizer = Google::Auth::UserAuthorizer.new client_id, SCOPE, token_store
user_id = "default"
credentials = authorizer.get_credentials user_id
if credentials.nil?
url = authorizer.get_authorization_url base_url: OOB_URI
puts "Open the following URL in the browser and enter the " \
"resulting code after authorization:\n" + url
code = gets
credentials = authorizer.get_and_store_credentials_from_code(
user_id: user_id, code: code, base_url: OOB_URI
)
end
credentials
end
def read_values( spreadsheet_id, range )
service.get_spreadsheet_values spreadsheet_id, range
end
def print_values( spreadsheet_id, range )
response = read_values spreadsheet_id, range
if response.values.nil?
puts "No data found."
else
response.values.each do |row|
puts row.join( "\t" )
end
end
end
def create_spreadsheet( name, sheets = ['Sheet1'] )
spreadsheet = {
properties: {
title: name
},
sheets: sheets.collect { |sheet| {properties: {title: sheet}} }
}
spreadsheet = service.create_spreadsheet(spreadsheet,
fields: 'spreadsheetId')
puts "Spreadsheet ID: #{spreadsheet.spreadsheet_id}"
spreadsheet.spreadsheet_id
end
def update_values( spreadsheet_id, range, values )
data = [
{
range: range,
values: values
}
]
value_range_object = Google::Apis::SheetsV4::ValueRange.new(range: range,
values: values)
result = service.update_spreadsheet_value(spreadsheet_id,
range,
value_range_object,
value_input_option: "USER_ENTERED" )
puts "#{result.updated_cells} cells updated."
result
end
end
if __FILE__ == $0
# spreadsheet_id = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"
# range = "Class Data!A2:E"
# sheets = GoogleSheets.new
# sheets.print_values spreadsheet_id, range
sheets = GoogleSheets.new
conf = {}
if File.exists? "sheet.json"
conf = JSON.parse( File.read( "sheet.json" ) )
end
sheet = conf["sheet"]
if sheet.nil?
sheet = sheets.create_spreadsheet( "Roster", ["People", "Projects"] )
conf["sheet"] = sheet
File.open("sheet.json","w") do |f|
f.write(JSON.pretty_generate(conf))
end
end
values = [
[ 'ID', 'Name', 'Address' ]
]
20.times do |id|
values << [id+1, Faker::Name.name, Faker::Address.city]
end
sheets.update_values sheet, "People!A1:C", values
sheets.print_values sheet, "People!A1:C"
end