csv_to_gsheet 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/exe/csv_to_gsheet +4 -0
  3. data/lib/csv_to_gsheet.rb +145 -0
  4. metadata +76 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ce47d3a095af158bf35b414a9abc65f7a02ee4ceb7a652ab6cd8eb5a6f9fb2a3
4
+ data.tar.gz: b5af8f5a3f226b009871ed8df1231a230c9fda266d428a52ba1fce5c473b6c2b
5
+ SHA512:
6
+ metadata.gz: 3cd1584fb50142befd852323df98b16d6b8114f9a00cbae65559372a86fef16144bb85b1cc08f7531e5568e8ab4e54d718cf8cd230dea2c8ddf27b691560671d
7
+ data.tar.gz: 86790f096701d73221f677529197e455bde9e6e5c8626d4d9903f7a5e6bf8c92357a20823b4c173b8ef36ed665fdb7c90e628017eb5bdfacf796629d384de969
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'csv_to_gsheet'
4
+ CsvToGsheet::Runner.invoke
@@ -0,0 +1,145 @@
1
+ require 'csv'
2
+ require 'google/apis/sheets_v4'
3
+ require 'googleauth'
4
+ require 'googleauth/stores/file_token_store'
5
+ require 'fileutils'
6
+
7
+ Google::Apis::RequestOptions.default.retries = 5
8
+
9
+ module CsvToGsheet
10
+
11
+ OOB_URI = 'urn:ietf:wg:oauth:2.0:oob'.freeze
12
+ APPLICATION_NAME = 'csv_to_gsheet_managed_by_you'.freeze
13
+ CREDENTIALS_PATH = "#{ENV['HOME']}/.csv_to_gsheet_google_api_credentials.json".freeze
14
+
15
+ # The file token.yaml stores the user's access and refresh tokens, and is
16
+ # created automatically when the authorization flow completes for the first
17
+ # time.
18
+ TOKEN_PATH = "#{ENV['HOME']}/.csv_to_gsheet_google_oauth2_token.yaml".freeze
19
+ File.delete(TOKEN_PATH) if File.empty?(TOKEN_PATH)
20
+ SCOPE = Google::Apis::SheetsV4::AUTH_SPREADSHEETS
21
+
22
+ Google::Apis.logger.level = ENV['DEBUG'] != nil ? Logger::DEBUG : Logger::FATAL
23
+
24
+ module Runner
25
+ def self.invoke
26
+ file_path = ARGV[0]
27
+ file_name = file_path.gsub(/.*\//, '')
28
+
29
+ # We clear ARGV here so that the `gets` command later will instead prompt from
30
+ # standard in for the user's code in our `authorize` function
31
+ #
32
+ # See https://stackoverflow.com/questions/2166862/why-is-gets-throwing-an-error-when-arguments-are-passed-to-my-ruby-script
33
+ ARGV.clear
34
+
35
+ # Initialize the API
36
+ service = Google::Apis::SheetsV4::SheetsService.new
37
+ service.client_options.application_name = APPLICATION_NAME
38
+ service.authorization = CsvToGsheet.authorize
39
+
40
+ # Read a spreadsheet
41
+ #
42
+ # # Prints the names and majors of students in a sample spreadsheet:
43
+ # # https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
44
+ # spreadsheet_id = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms'
45
+ # range = 'Class Data!A2:E'
46
+ # response = service.get_spreadsheet_values(spreadsheet_id, range)
47
+ # puts 'Name, Major:'
48
+ # puts 'No data found.' if response.values.empty?
49
+ # response.values.each do |row|
50
+ # # Print columns A and E, which correspond to indices 0 and 4.
51
+ # puts "#{row[0]}, #{row[4]}"
52
+ # end
53
+
54
+ # # Find or create a spreadsheet
55
+ # #
56
+ # preexisting_spreadsheet_id = "19B3KW7Rt1cr0hq6YcKeug96vb5Qxjw1TaNtC578cdQw"
57
+ #
58
+ # spreadsheet = begin
59
+ # service.get_spreadsheet(preexisting_spreadsheet_id)
60
+ # rescue Google::Apis::ClientError => e
61
+ # # handle the case where we don't know what exception was raised
62
+ # raise e if e.status_code != 404
63
+ #
64
+ # # create the spreadsheet here.
65
+ # spreadsheet = {
66
+ # properties: {
67
+ # title: file_name
68
+ # }
69
+ # }
70
+ # spreadsheet = service.create_spreadsheet(spreadsheet,
71
+ # fields: 'spreadsheetId')
72
+ # end
73
+
74
+ # Create a spreadsheet
75
+ #
76
+ spreadsheet = {
77
+ properties: {
78
+ title: file_name
79
+ }
80
+ }
81
+ spreadsheet = service.create_spreadsheet(spreadsheet,
82
+ fields: 'spreadsheetId')
83
+ puts "Spreadsheet ID: #{spreadsheet.spreadsheet_id}"
84
+
85
+ # append to table in spreadsheet
86
+ # _ _
87
+ # A| 1 2
88
+ # B| 3 4
89
+ #
90
+ # =>
91
+ #
92
+ # - -
93
+ # A| 1 2
94
+ # B| 3 4
95
+ # C| 1 2
96
+ # D| 3 4
97
+
98
+ result = begin
99
+ result = service.append_spreadsheet_value(spreadsheet.spreadsheet_id,
100
+ 'A1',
101
+ { values: CSV.parse(File.read(file_path)) },
102
+ value_input_option: 'USER_ENTERED')
103
+ puts "\n\u001b[42;1mUploaded csv successfully to range #{result.updates.updated_range}!\u001b[0m"
104
+
105
+ result
106
+ rescue StandardError => e
107
+ puts "\n\u001b[41;1m. FAIL \u001b[0m"
108
+ puts e.backtrace
109
+ raise e
110
+ end
111
+
112
+ url = "https://docs.google.com/spreadsheets/d/#{spreadsheet.spreadsheet_id}/edit#gid=0&range=#{result.updates.updated_range.gsub(/.*!/, '')}"
113
+ puts "Your Google Sheets spreadsheet: #{url}"
114
+ if RUBY_PLATFORM =~ /darwin/
115
+ `open #{url}`
116
+ end
117
+ end
118
+ end
119
+
120
+ ##
121
+ # Ensure valid credentials, either by restoring from the saved credentials
122
+ # files or intitiating an OAuth2 authorization. If authorization is required,
123
+ # the user's default browser will be launched to approve the request.
124
+ #
125
+ # @return [Google::Auth::UserRefreshCredentials] OAuth2 credentials
126
+ def self.authorize
127
+ client_id = Google::Auth::ClientId.from_file(CREDENTIALS_PATH)
128
+ token_store = Google::Auth::Stores::FileTokenStore.new(file: TOKEN_PATH)
129
+ authorizer = Google::Auth::UserAuthorizer.new(client_id, SCOPE, token_store)
130
+ user_id = 'default'
131
+ credentials = authorizer.get_credentials(user_id)
132
+ if credentials.nil?
133
+ url = authorizer.get_authorization_url(base_url: OOB_URI)
134
+ puts 'Open the following URL in the browser and enter the ' \
135
+ "resulting code after authorization:\n" + url
136
+ code = gets.chomp
137
+ credentials = authorizer.get_and_store_credentials_from_code(
138
+ user_id: user_id, code: code, base_url: OOB_URI
139
+ )
140
+ end
141
+ credentials
142
+ end
143
+
144
+ end
145
+
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: csv_to_gsheet
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Mark Campbell
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-06-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: google-api-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.29'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.29'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.12'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.12'
41
+ description: This is a command line utility that takes a local CSV file, creates a
42
+ new Google Sheet spreadsheet, and then povides a web link to the newly created Google
43
+ Sheet spreadsheet.
44
+ email: me@markcampbell.me
45
+ executables:
46
+ - csv_to_gsheet
47
+ extensions: []
48
+ extra_rdoc_files: []
49
+ files:
50
+ - exe/csv_to_gsheet
51
+ - lib/csv_to_gsheet.rb
52
+ homepage: https://gitlab.com/Nitrodist/csv_to_gsheet
53
+ licenses:
54
+ - LGPL-3.0-or-later
55
+ metadata:
56
+ source_code_uri: https://gitlab.com/Nitrodist/csv_to_gsheet
57
+ post_install_message:
58
+ rdoc_options: []
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements: []
72
+ rubygems_version: 3.0.3
73
+ signing_key:
74
+ specification_version: 4
75
+ summary: Take local CSV files and create Google Sheet spreadsheeets.
76
+ test_files: []