csv_to_gsheet 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/exe/csv_to_gsheet +4 -0
- data/lib/csv_to_gsheet.rb +145 -0
- metadata +76 -0
checksums.yaml
ADDED
@@ -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
|
data/exe/csv_to_gsheet
ADDED
@@ -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: []
|