I'm attempting to write a google apps script that takes the slide titles of every slide (as they are in the master slides) and put them in a nicely formatted table of contents on slide 2.
It doesn't necessarily have to be done with apps script, but this is the best way I could think of.
function readPageElementIds(presentationId, pageId) {
var response = Slides.Presentations.get(
presentationId);
Logger.log(response.slides)
for (var i = 0; i < response.slides.length; i++) {
var slide = response.slides[i].pageElements;
for (var j = 0; j < slide.length; j++) {
if (slide[j].shape) {
var texts = slide[j].shape.text.textElements;
for (var k = 0; k < texts.length; k++) {
if (texts[k].autoText) {
Logger.log(texts[k].autoText.content);
}
}
}
}
}
}
Yes that's a lot of for loops, I have no idea how to do this.
That's fairly close. Things you're missing:
You're iterating on all of the shapes, not just the titles. For that, filter on the shape.placeholder.type
property. You only want to look at shapes with TITLE
and CENTERED_TITLE
placeholder types.
autoText
text elements are relatively rare. Most of your text will be in TextRun
text elements
This code would work:
function readPageElementIds(presentationId, pageId) {
var response = Slides.Presentations.get(
presentationId);
Logger.log(response.slides)
for (var i = 0; i < response.slides.length; i++) {
var slide = response.slides[i].pageElements;
for (var j = 0; j < slide.length; j++) {
if (slide[j].shape && slide[j].shape.placeholder
&& (slide[j].shape.placeholder.type == 'TITLE'
|| slide[j].shape.placeholder.type == 'CENTERED_TITLE')) {
var texts = slide[j].shape.text.textElements;
var shapeText = "";
for (var k = 0; k < texts.length; k++) {
if (texts[k].autoText) {
shapeText += texts[k].autoText.content;
}
if (texts[k].textRun) {
shapeText += texts[k].textRun.content;
}
}
Logger.log(shapeText);
}
}
}
}