Created
March 22, 2023 21:53
-
-
Save ethanabrooks/886de3a2fc999cee6d0ccc0956cc6b53 to your computer and use it in GitHub Desktop.
Inserts slides from another PowerPoint file into the current presentation.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Insert slides from other presentation | |
description: Inserts slides from another PowerPoint file into the current presentation. | |
host: POWERPOINT | |
api_set: {} | |
script: | |
content: > | |
$("#insert-all-slides").click(() => tryCatch(insertAllSlides)); | |
$("#insert-after-target-slide").click(() => | |
tryCatch(insertAfterSelectedSlide)); | |
$("#file").change(() => tryCatch(storeFileAsBase64)); | |
let chosenFileBase64; | |
async function storeFileAsBase64() { | |
const reader = new FileReader(); | |
reader.onload = async (event) => { | |
// Remove the metadata before the Base64-encoded string. | |
const startIndex = reader.result.toString().indexOf("base64,"); | |
const copyBase64 = reader.result.toString().substr(startIndex + 7); | |
chosenFileBase64 = copyBase64; | |
}; | |
// Read in the file and store a Base64-encoded copy as the reader.result | |
// property. This also triggers the onload event. | |
const myFile = document.getElementById("file") as HTMLInputElement; | |
reader.readAsDataURL(myFile.files[0]); | |
} | |
async function insertAllSlides() { | |
await PowerPoint.run(async function(context) { | |
context.presentation.insertSlidesFromBase64(chosenFileBase64); | |
await context.sync(); | |
}); | |
} | |
async function insertAfterSelectedSlide() { | |
await PowerPoint.run(async function(context) { | |
const selectedSlideID = await getSelectedSlideID(); | |
context.presentation.insertSlidesFromBase64(chosenFileBase64, { | |
formatting: PowerPoint.InsertSlideFormatting.useDestinationTheme, | |
targetSlideId: selectedSlideID + "#" | |
}); | |
await context.sync(); | |
}); | |
} | |
function getSelectedSlideID() { | |
// Wrap a call of one of the Common APIs in a Promise-returning | |
// function, so that it can be easily called within a run() function | |
// of an application-specific API. | |
return new OfficeExtension.Promise<string>(function(resolve, reject) { | |
Office.context.document.getSelectedDataAsync(Office.CoercionType.SlideRange, function(asyncResult) { | |
try { | |
if (asyncResult.status === Office.AsyncResultStatus.Failed) { | |
reject(console.error(asyncResult.error.message)); | |
} else { | |
const result = asyncResult.value as any; | |
resolve(result.slides[0].id); | |
} | |
} catch (error) { | |
reject(console.log(error)); | |
} | |
}); | |
}); | |
} | |
/** Default helper for invoking an action and handling errors. */ | |
async function tryCatch(callback) { | |
try { | |
await callback(); | |
} catch (error) { | |
// Note: In a production add-in, you'd want to notify the user through your add-in's UI. | |
console.error(error); | |
} | |
} | |
language: typescript | |
template: | |
content: "<html>\n\n<head>\n\t<style>\n\t\th1 {\n\t\t\tcolor: blue;\n\t\t\tfont-family: Arial;\n\t\t}\n\n\t\tp {\n\t\t\tcolor: green;\n\t\t\tfont-family: Verdana;\n\t\t}\n\t</style>\n</head>\n\n<body>\n\t<h1>Script Lab</h1>\n\t<p>This is a sample task pane for Script Lab in PowerPoint.</p>\n</body>\n\n</html>" | |
language: html | |
style: | |
content: |- | |
section.samples { | |
margin-top: 20px; | |
} | |
section.samples .ms-Button, section.setup .ms-Button { | |
display: block; | |
margin-bottom: 5px; | |
margin-left: 20px; | |
min-width: 80px; | |
} | |
language: css | |
libraries: | | |
https://appsforoffice.microsoft.com/lib/1/hosted/office.js | |
@types/office-js | |
[email protected]/dist/css/fabric.min.css | |
[email protected]/dist/css/fabric.components.min.css | |
[email protected]/client/core.min.js | |
@types/core-js | |
[email protected] | |
@types/[email protected] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment