csv_to_gsheet 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []