Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
479 lines (442 sloc) 14.5 KB
# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require 'google/apis/drive_v3'
require 'google/apis/slides_v1'
class FileSnippets
def initialize(drive_service, slides_service, sheets_service)
@drive_service = drive_service
@slides_service = slides_service
@sheets_service = sheets_service
end
def drive_service
@drive_service
end
def slides_service
@slides_service
end
def sheets_service
@sheets_service
end
def create_presentation(title = 'Title')
# [START slides_create_presentation]
body = Google::Apis::SlidesV1::Presentation.new
body.title = title
presentation = slides_service.create_presentation(body)
puts "Created presentation with ID: #{presentation.presentation_id}"
# [END slides_create_presentation]
presentation
end
def copy_presentation(presentation_id, copy_title)
# [START slides_copy_presentation]
body = Google::Apis::SlidesV1::Presentation.new
body.title = copy_title
drive_response = drive_service.copy_file(presentation_id, body)
puts drive_response
presentation_copy_id = drive_response.id
# [END slides_copy_presentation]
presentation_copy_id
end
def create_slide(presentation_id, page_id)
# [START slides_create_slide]
body = Google::Apis::SlidesV1::Presentation.new
requests = [{
create_slide: {
object_id_prop: page_id,
insertion_index: '1',
slide_layout_reference: {
predefined_layout: 'TITLE_AND_TWO_COLUMNS'
}
}
}]
# If you wish to populate the slide with elements, add element create requests here,
# using the page_id.
# Execute the request.
req = Google::Apis::SlidesV1::BatchUpdatePresentationRequest.new(requests: requests)
response = slides_service.batch_update_presentation(presentation_id, req)
create_slide_response = response.replies[0].create_slide
puts "Created slide with ID: #{create_slide_response.object_id}"
# [END slides_create_slide]
create_slide_response
end
def create_textbox_with_text(presentation_id, page_id)
# [START slides_create_textbox_with_text]
# Create a new square textbox, using the supplied element ID.
element_id = 'MyTextBox_01'
pt350 = {
magnitude: '350',
unit: 'PT'
}
requests = [
{
create_shape: {
object_id_prop: element_id,
shape_type: 'TEXT_BOX',
element_properties: {
page_object_id: page_id,
size: {
height: pt350,
width: pt350
},
transform: {
scale_x: '1',
scale_y: '1',
translate_x: '350',
translate_y: '100',
unit: 'PT'
}
}
}
},
# Insert text into the box, using the supplied element ID.
{
insert_text: {
object_id_prop: element_id,
insertion_index: 0,
text: 'New Box Text Inserted!'
}
}
]
# Execute the request.
req = Google::Apis::SlidesV1::BatchUpdatePresentationRequest.new(requests: requests)
response = slides_service.batch_update_presentation(
presentation_id,
req
)
create_shape_response = response.replies[0].create_shape
puts "Created textbox with ID: #{create_shape_response.object_id}"
# [END slides_create_textbox_with_text]
response
end
def create_image(presentation_id, page_id)
# [START slides_create_image]
# Create a new image, using the supplied object ID, with content downloaded from image_url.
requests = []
image_id = 'MyImage_01'
emu4M = {
magnitude: '4000000',
unit: 'EMU'
}
requests << {
create_image: {
object_id_prop: image_id,
url: IMAGE_URL,
element_properties: {
page_object_id: page_id,
size: {
height: emu4M,
width: emu4M
},
transform: {
scale_x: '1',
scale_y: '1',
translate_x: '100000',
translate_y: '100000',
unit: 'EMU'
}
}
}
}
# Execute the request.
req = Google::Apis::SlidesV1::BatchUpdatePresentationRequest.new(requests: requests)
response = slides_service.batch_update_presentation(
presentation_id,
req
)
create_image_response = response.replies[0].create_image
puts "Created image with ID: #{create_image_response.object_id}"
# [END slides_create_image]
response
end
def text_merging(template_presentation_id, data_spreadsheet_id)
responses = []
# [START slides_text_merging]
# Use the Sheets API to load data, one record per row.
data_range_notation = 'Customers!A2:M6'
sheets_response = sheets_service.get_spreadsheet_values(
data_spreadsheet_id,
data_range_notation
)
values = sheets_response.values
# For each record, create a new merged presentation.
values.each do |row|
customer_name = row[2] # name in column 3
case_description = row[5] # case description in column 6
total_portfolio = row[11] # total portfolio in column 12
# Duplicate the template presentation using the Drive API.
copy_title = customer_name + ' presentation'
body = Google::Apis::SlidesV1::Presentation.new
body.title = copy_title
drive_response = drive_service.copy_file(template_presentation_id, body)
presentation_copy_id = drive_response.id
# Create the text merge (replace_all_text) requests for this presentation.
requests = [] << {
replace_all_text: {
contains_text: {
text: '{{customer-name}}',
match_case: true
},
replace_text: customer_name
}
} << {
replace_all_text: {
contains_text: {
text: '{{case-description}}',
match_case: true
},
replace_text: case_description
}
} << {
replace_all_text: {
contains_text: {
text: '{{total-portfolio}}',
match_case: true
},
replace_text: total_portfolio
}
}
# Execute the requests for this presentation.
req = Google::Apis::SlidesV1::BatchUpdatePresentationRequest.new(requests: requests)
response = slides_service.batch_update_presentation(
presentation_copy_id,
req
)
# [START_EXCLUDE silent]
responses << response
# [END_EXCLUDE silent]
# Count the total number of replacements made.
num_replacements = 0
response.replies.each do |reply|
num_replacements += reply.replace_all_text.occurrences_changed
end
puts "Created presentation for #{customer_name} with ID: #{presentation_copy_id}"
puts "Replaced #{num_replacements} text instances"
end
# [END slides_text_merging]
responses
end
def image_merging(template_presentation_id, image_url, customer_name)
logo_url = image_url
customer_graphic_url = image_url
# [START slides_image_merging]
# Duplicate the template presentation using the Drive API.
copy_title = customer_name + ' presentation'
body = Google::Apis::SlidesV1::Presentation.new
body.title = copy_title
drive_response = drive_service.copy_file(template_presentation_id, body)
presentation_copy_id = drive_response.id
# Create the image merge (replace_all_shapes_with_image) requests.
requests = [] << {
replace_all_shapes_with_image: {
image_url: logo_url,
replace_method: 'CENTER_INSIDE',
contains_text: {
text: '{{company-logo}}',
match_case: true
}
}
} << {
replace_all_shapes_with_image: {
image_url: customer_graphic_url,
replace_method: 'CENTER_INSIDE',
contains_text: {
text: '{{customer-graphic}}',
match_case: true
}
}
}
# Execute the requests.
req = Google::Apis::SlidesV1::BatchUpdatePresentationRequest.new(requests: requests)
response = slides_service.batch_update_presentation(
presentation_copy_id,
req
)
# Count the number of replacements made.
num_replacements = 0
response.replies.each do |reply|
num_replacements += reply.replace_all_shapes_with_image.occurrences_changed
end
puts "Created presentation for #{customer_name} with ID: #{presentation_copy_id}"
puts "Replaced #{num_replacements} shapes with images"
# [END slides_image_merging]
response
end
def simple_text_replace(presentation_id, shape_id, replacement_text)
# [START slides_simple_text_replace]
# Remove existing text in the shape, then insert new text.
requests = [] << {
delete_text: {
object_id_prop: shape_id,
text_range: {
type: 'ALL'
}
}
} << {
insert_text: {
object_id_prop: shape_id,
insertion_index: 0,
text: replacement_text
}
}
# Execute the requests.
req = Google::Apis::SlidesV1::BatchUpdatePresentationRequest.new(requests: requests)
response = slides_service.batch_update_presentation(
presentation_id,
req
)
puts "Replaced text in shape with ID: #{shape_id}"
# [END slides_simple_text_replace]
response
end
def text_style_update(presentation_id, shape_id)
# [START slides_text_style_update]
# Update the text style so that the first 5 characters are bolded
# and italicized, the next 5 are displayed in blue 14 pt Times
# New Roman font, and the next 5 are hyperlinked.
requests = [] << {
update_text_style: {
object_id_prop: shape_id,
text_range: {
type: 'FIXED_RANGE',
start_index: 0,
end_index: 5
},
style: {
bold: true,
italic: true
},
fields: 'bold,italic'
}
} << {
update_text_style: {
object_id_prop: shape_id,
text_range: {
type: 'FIXED_RANGE',
start_index: 5,
end_index: 10
},
style: {
font_family: 'Times New Roman',
font_size: {
magnitude: 14,
unit: 'PT'
},
foreground_color: {
opaque_color: {
rgb_color: {
blue: 1.0,
green: 0.0,
red: 0.0
}
}
}
},
fields: 'foreground_color,font_family,font_size'
}
} << {
update_text_style: {
object_id_prop: shape_id,
text_range: {
type: 'FIXED_RANGE',
start_index: 10,
end_index: 15
},
style: {
link: {
url: 'www.example.com'
}
},
fields: 'link'
}
}
# Execute the requests.
req = Google::Apis::SlidesV1::BatchUpdatePresentationRequest.new(requests: requests)
response = slides_service.batch_update_presentation(presentation_id, req)
puts "Updated the text style for shape with ID: #{shape_id}"
# [END slides_text_style_update]
response
end
def create_bulleted_text(presentation_id, shape_id)
# [START slides_create_bulleted_text]
# Add arrow-diamond-disc bullets to all text in the shape.
requests = [] << {
create_paragraph_bullets: {
object_id_prop: shape_id,
text_range: {
type: 'ALL'
},
bulletPreset: 'BULLET_ARROW_DIAMOND_DISC'
}
}
# Execute the requests.
req = Google::Apis::SlidesV1::BatchUpdatePresentationRequest.new(requests: requests)
response = slides_service.batch_update_presentation(presentation_id, req)
puts "Added bullets to text in shape with ID: #{shape_id}"
# [END slides_create_bulleted_text]
response
end
def create_sheets_chart(presentation_id, page_id, spreadsheet_id, sheet_chart_id)
# [START slides_create_sheets_chart]
# Embed a Sheets chart (indicated by the spreadsheet_id and sheet_chart_id) onto
# a page in the presentation. Setting the linking mode as "LINKED" allows the
# chart to be refreshed if the Sheets version is updated.
emu4M = {
magnitude: 4000000,
unit: 'EMU'
}
presentation_chart_id = 'my_embedded_chart'
requests = [{
create_sheets_chart: {
object_id_prop: presentation_chart_id,
spreadsheet_id: spreadsheet_id,
chart_id: sheet_chart_id,
linking_mode: 'LINKED',
element_properties: {
page_object_id: page_id,
size: {
height: emu4M,
width: emu4M
},
transform: {
scale_x: 1,
scale_y: 1,
translate_x: 100000,
translate_y: 100000,
unit: 'EMU'
}
}
}
}]
# Execute the request.
req = Google::Apis::SlidesV1::BatchUpdatePresentationRequest.new(requests: requests)
response = slides_service.batch_update_presentation(presentation_id, req)
puts "Added a linked Sheets chart with ID: #{presentation_chart_id}"
# [END slides_create_sheets_chart]
response
end
def refresh_sheets_chart(presentation_id, presentation_chart_id)
# [START slides_refresh_sheets_chart]
# Refresh an existing linked Sheets chart embedded in a presentation.
requests = [{
refresh_sheets_chart: {
object_id_prop: presentation_chart_id
}
}]
# Execute the request.
req = Google::Apis::SlidesV1::BatchUpdatePresentationRequest.new(requests: requests)
response = slides_service.batch_update_presentation(presentation_id, req)
puts "Refreshed a linked Sheets chart with ID: #{presentation_chart_id}"
# [END slides_refresh_sheets_chart]
response
end
end
You can’t perform that action at this time.