Class: GoogleDrive::Spreadsheet
- Includes:
- Util
- Defined in:
- lib/google_drive/spreadsheet.rb
Overview
A spreadsheet.
Use methods in GoogleDrive::Session to get GoogleDrive::Spreadsheet object.
Constant Summary collapse
- SUPPORTED_EXPORT_FORMAT =
Set.new(["xls", "csv", "pdf", "ods", "tsv", "html"])
Constants included from Util
Util::DOCS_BASE_URL, Util::EXT_TO_CONTENT_TYPE
Instance Attribute Summary collapse
-
#worksheets_feed_url ⇒ Object
readonly
URL of worksheet-based feed of the spreadsheet.
Instance Method Summary collapse
-
#add_worksheet(title, max_rows = 100, max_cols = 20) ⇒ Object
Adds a new worksheet to the spreadsheet.
-
#document_feed_entry(params = {}) ⇒ Object
<entry> element of document list feed as Nokogiri::XML::Element.
-
#document_feed_url ⇒ Object
URL of feed used in document list feed API.
- #download_to_io(io, params = {}) ⇒ Object
-
#duplicate(new_title = nil) ⇒ Object
Creates copy of this spreadsheet with the given title.
-
#export_as_file(local_path, format = nil, worksheet_index = nil) ⇒ Object
Exports the spreadsheet in
format
as a local file. -
#export_as_string(format, worksheet_index = nil) ⇒ Object
Exports the spreadsheet in
format
and returns it as String. -
#human_url ⇒ Object
URL which you can open the spreadsheet in a Web browser with.
-
#initialize(session, worksheets_feed_url, title = nil) ⇒ Spreadsheet
constructor
:nodoc:.
- #inspect ⇒ Object
-
#key ⇒ Object
Key of the spreadsheet.
-
#spreadsheet_feed_entry(params = {}) ⇒ Object
<entry> element of spreadsheet feed as Nokogiri::XML::Element.
-
#spreadsheet_feed_url ⇒ Object
Spreadsheet feed URL of the spreadsheet.
-
#tables ⇒ Object
DEPRECATED: Table and Record feeds are deprecated and they will not be available after March 2012.
-
#tables_feed_url ⇒ Object
DEPRECATED: Table and Record feeds are deprecated and they will not be available after March 2012.
-
#title(params = {}) ⇒ Object
Title of the spreadsheet.
-
#worksheet_by_title(title) ⇒ Object
Returns a GoogleDrive::Worksheet with the given title in the spreadsheet.
-
#worksheets ⇒ Object
Returns worksheets of the spreadsheet as array of GoogleDrive::Worksheet.
Methods included from Util
concat_url, encode_query, h, to_v3_url
Methods inherited from File
#acl, #acl_feed_url, #available_content_types, #delete, #download_to_file, #download_to_string, #rename, #resource_id, #resource_type, #update_from_file, #update_from_io, #update_from_string
Constructor Details
#initialize(session, worksheets_feed_url, title = nil) ⇒ Spreadsheet
:nodoc:
25 26 27 28 29 |
# File 'lib/google_drive/spreadsheet.rb', line 25 def initialize(session, worksheets_feed_url, title = nil) #:nodoc: super(session, nil) @worksheets_feed_url = worksheets_feed_url @title = title end |
Instance Attribute Details
#worksheets_feed_url ⇒ Object (readonly)
URL of worksheet-based feed of the spreadsheet.
32 33 34 |
# File 'lib/google_drive/spreadsheet.rb', line 32 def worksheets_feed_url @worksheets_feed_url end |
Instance Method Details
#add_worksheet(title, max_rows = 100, max_cols = 20) ⇒ Object
Adds a new worksheet to the spreadsheet. Returns added GoogleDrive::Worksheet.
200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
# File 'lib/google_drive/spreadsheet.rb', line 200 def add_worksheet(title, max_rows = 100, max_cols = 20) xml = <<-"EOS" <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gs='http://schemas.google.com/spreadsheets/2006'> <title>#{h(title)}</title> <gs:rowCount>#{h(max_rows)}</gs:rowCount> <gs:colCount>#{h(max_cols)}</gs:colCount> </entry> EOS doc = @session.request(:post, @worksheets_feed_url, :data => xml) url = doc.css( "link[rel='http://schemas.google.com/spreadsheets/2006#cellsfeed']")[0]["href"] return Worksheet.new(@session, self, url, title) end |
#document_feed_entry(params = {}) ⇒ Object
<entry> element of document list feed as Nokogiri::XML::Element.
Set params[:reload]
to true to force reloading the feed.
97 98 99 100 101 102 103 |
# File 'lib/google_drive/spreadsheet.rb', line 97 def document_feed_entry(params = {}) if !@document_feed_entry || params[:reload] @document_feed_entry = @session.request(:get, self.document_feed_url, :auth => :writely).css("entry")[0] end return @document_feed_entry end |
#document_feed_url ⇒ Object
URL of feed used in document list feed API.
79 80 81 |
# File 'lib/google_drive/spreadsheet.rb', line 79 def document_feed_url return "https://docs.google.com/feeds/documents/private/full/spreadsheet%3A#{self.key}" end |
#download_to_io(io, params = {}) ⇒ Object
164 165 166 167 168 169 170 |
# File 'lib/google_drive/spreadsheet.rb', line 164 def download_to_io(io, params = {}) # General downloading API doesn't work for spreadsheets because it requires a different # authorization token, and it has a bug that it downloads PDF when text/html is # requested. raise(NotImplementedError, "Use export_as_file or export_as_string instead for GoogleDrive::Spreadsheet.") end |
#duplicate(new_title = nil) ⇒ Object
Creates copy of this spreadsheet with the given title.
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/google_drive/spreadsheet.rb', line 106 def duplicate(new_title = nil) new_title ||= (self.title ? "Copy of " + self.title : "Untitled") header = {"GData-Version" => "3.0", "Content-Type" => "application/atom+xml;charset=utf-8"} xml = <<-"EOS" <entry xmlns='http://www.w3.org/2005/Atom'> <id>#{h(self.document_feed_url)}</id> <title>#{h(new_title)}</title> </entry> EOS doc = @session.request( :post, DOCS_BASE_URL, :data => xml, :header => header, :auth => :writely) ss_url = doc.css( "link[rel='http://schemas.google.com/spreadsheets/2006#worksheetsfeed']")[0]["href"] return Spreadsheet.new(@session, ss_url, new_title) end |
#export_as_file(local_path, format = nil, worksheet_index = nil) ⇒ Object
Exports the spreadsheet in format
as a local file.
format
can be either “xls”, “csv”, “pdf”, “ods”, “tsv” or “html”. If format
is nil, it is guessed from the file name. In format such as “csv”, only the worksheet specified with worksheet_index
is exported.
e.g.
spreadsheet.export_as_file("hoge.ods")
spreadsheet.export_as_file("hoge.csv", nil, 0)
149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/google_drive/spreadsheet.rb', line 149 def export_as_file(local_path, format = nil, worksheet_index = nil) if !format format = ::File.extname(local_path).gsub(/^\./, "") if !SUPPORTED_EXPORT_FORMAT.include?(format) raise(ArgumentError, ("Cannot guess format from the file name: %s\n" + "Specify format argument explicitly.") % local_path) end end open(local_path, "wb") do |f| f.write(export_as_string(format, worksheet_index)) end end |
#export_as_string(format, worksheet_index = nil) ⇒ Object
Exports the spreadsheet in format
and returns it as String.
format
can be either “xls”, “csv”, “pdf”, “ods”, “tsv” or “html”. In format such as “csv”, only the worksheet specified with worksheet_index
is exported.
127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/google_drive/spreadsheet.rb', line 127 def export_as_string(format, worksheet_index = nil) gid_param = worksheet_index ? "&gid=#{worksheet_index}" : "" format_string = "&format=#{format}" if self.human_url.match("edit") url = self.human_url.gsub(/edit/, "export") + gid_param + format_string else url = "https://spreadsheets.google.com/feeds/download/spreadsheets/Export" + "?key=#{key}&exportFormat=#{format}#{gid_param}" end return @session.request(:get, url, :response_type => :raw) end |
#human_url ⇒ Object
URL which you can open the spreadsheet in a Web browser with.
e.g. “spreadsheets.google.com/ccc?key=pz7XtlQC-PYx-jrVMJErTcg”
62 63 64 65 |
# File 'lib/google_drive/spreadsheet.rb', line 62 def human_url # Uses Document feed because Spreadsheet feed returns wrong URL for Apps account. return self.document_feed_entry.css("link[rel='alternate']")[0]["href"] end |
#inspect ⇒ Object
227 228 229 230 231 |
# File 'lib/google_drive/spreadsheet.rb', line 227 def inspect fields = {:worksheets_feed_url => self.worksheets_feed_url} fields[:title] = @title if @title return "\#<%p %s>" % [self.class, fields.map(){ |k, v| "%s=%p" % [k, v] }.join(", ")] end |
#key ⇒ Object
Key of the spreadsheet.
45 46 47 48 49 50 51 52 |
# File 'lib/google_drive/spreadsheet.rb', line 45 def key if !(@worksheets_feed_url =~ %r{^https?://spreadsheets.google.com/feeds/worksheets/(.*)/private/.*$}) raise(GoogleDrive::Error, "Worksheets feed URL is in unknown format: #{@worksheets_feed_url}") end return $1 end |
#spreadsheet_feed_entry(params = {}) ⇒ Object
<entry> element of spreadsheet feed as Nokogiri::XML::Element.
Set params[:reload]
to true to force reloading the feed.
86 87 88 89 90 91 92 |
# File 'lib/google_drive/spreadsheet.rb', line 86 def spreadsheet_feed_entry(params = {}) if !@spreadsheet_feed_entry || params[:reload] @spreadsheet_feed_entry = @session.request(:get, self.spreadsheet_feed_url).css("entry")[0] end return @spreadsheet_feed_entry end |
#spreadsheet_feed_url ⇒ Object
Spreadsheet feed URL of the spreadsheet.
55 56 57 |
# File 'lib/google_drive/spreadsheet.rb', line 55 def spreadsheet_feed_url return "https://spreadsheets.google.com/feeds/spreadsheets/private/full/#{self.key}" end |
#tables ⇒ Object
DEPRECATED: Table and Record feeds are deprecated and they will not be available after March 2012.
Returns list of tables in the spreadsheet.
219 220 221 222 223 224 225 |
# File 'lib/google_drive/spreadsheet.rb', line 219 def tables warn( "DEPRECATED: Google Spreadsheet Table and Record feeds are deprecated and they " + "will not be available after March 2012.") doc = @session.request(:get, self.tables_feed_url) return doc.css("entry").map(){ |e| Table.new(@session, e) }.freeze() end |
#tables_feed_url ⇒ Object
DEPRECATED: Table and Record feeds are deprecated and they will not be available after March 2012.
Tables feed URL of the spreadsheet.
71 72 73 74 75 76 |
# File 'lib/google_drive/spreadsheet.rb', line 71 def tables_feed_url warn( "DEPRECATED: Google Spreadsheet Table and Record feeds are deprecated and they " + "will not be available after March 2012.") return "https://spreadsheets.google.com/feeds/#{self.key}/tables" end |
#title(params = {}) ⇒ Object
Title of the spreadsheet.
Set params[:reload]
to true to force reloading the title.
37 38 39 40 41 42 |
# File 'lib/google_drive/spreadsheet.rb', line 37 def title(params = {}) if !@title || params[:reload] @title = spreadsheet_feed_entry(params).css("title").text end return @title end |
#worksheet_by_title(title) ⇒ Object
Returns a GoogleDrive::Worksheet with the given title in the spreadsheet.
Returns nil if not found. Returns the first one when multiple worksheets with the title are found.
195 196 197 |
# File 'lib/google_drive/spreadsheet.rb', line 195 def worksheet_by_title(title) return self.worksheets.find(){ |ws| ws.title == title } end |
#worksheets ⇒ Object
Returns worksheets of the spreadsheet as array of GoogleDrive::Worksheet.
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
# File 'lib/google_drive/spreadsheet.rb', line 173 def worksheets doc = @session.request(:get, @worksheets_feed_url) if doc.root.name != "feed" raise(GoogleDrive::Error, "%s doesn't look like a worksheets feed URL because its root is not <feed>." % @worksheets_feed_url) end result = [] doc.css("entry").each() do |entry| title = entry.css("title").text updated = Time.parse(entry.css("updated").text) url = entry.css( "link[rel='http://schemas.google.com/spreadsheets/2006#cellsfeed']")[0]["href"] result.push(Worksheet.new(@session, self, url, title, updated)) end return result.freeze() end |