I'm trying to do something which seems simple using office js but I can't get it to work. I am reading a pptx file and inserting the first slide into my presentation with the following:
//insert new slide from pptx file
context.presentation.insertSlidesFromBase64(base64file);
await context.sync();
context.presentation.slides.load();
await context.sync();
//load all the shapes on the new slide
const slide = context.presentation.slides.getItemAt(0);
slide.load();
await context.sync();
After doing this, I want to create these same loaded shapes on a new slide or cut and paste the shapes on to a new slide. I can't see any way to do this. Am I missing something or is this not possible?
I expected there would be a way to clone existing shapes and add them to a different slide but I don't see that is possible. I thought maybe you could add the cloned shapes to the slidecollection of a different slide but that doesn't seem to be possible. What I am trying to achieve is reading in a pptx file with one slide, reading the shapes of that slide and inserting those shapes on the currently selected slide in PowerPoint. The reason for this is that we really want to do is read in multiple PowerPoint files, get all the shapes and put them on one slide, preferably grouping each set of shapes from each selected input PowerPoint file.
Thanks in advance for any assistance.
I've consulted internally at Microsoft and the answer is that there currently isn't any way to copy images in the way that you want. I was hoping that you could just push
image objects to the ShapeCollection.items array; but that won't work. You can never add objects to a collection object that way, because the Office context
object in the JavaScript runtime doesn't know about them unless they are added through an Office.js method. (As you have found, there is no method on the ShapeCollection object to add images.) Since the context
doesn't know about objects that are pushed to the items
array, when context.sync
is called, those objects are not sent from the JavaScript runtime to the open presentation document.
Sorry for the bad news. You can suggest that an API for this scenario be added to Office.js at Microsoft 365 Developer Platform Ideas.