Last active
January 28, 2023 05:44
-
-
Save trapezoid/6096dc0ab59fba3004bf75cd8adff384 to your computer and use it in GitHub Desktop.
GoogleSlideのスピーカーノートに書いた台本を元にタイムコードを埋め込むGAS
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
function onOpen() { | |
SlidesApp.getUi() | |
.createMenu("UpdateTalkTimes") | |
.addItem("Update TalkTime in Notes", `updateTalkTimesAction`) //タイムコードを埋め込む。繰り返し実行可 | |
.addItem("Remove TalkTime in Notes", `removeTalkTimesAction`) //タイムコードを取り除く | |
.addToUi() | |
} | |
function removeTalkTimesAction() { | |
//一部だけリセットしたければその区間を引数に渡す。省略時は全てが対象になる | |
removeTalkTimesAndCalculateTotalTextLength(); | |
} | |
function updateTalkTimesAction() { | |
let ui = SlidesApp.getUi(); | |
let promptResponse = ui.prompt("発表時間の注釈の更新", "発表時間を分で入力して下さい", ui.ButtonSet.OK_CANCEL); | |
let talkMinutes = Number.parseInt(promptResponse.getResponseText()); | |
updateTalkTimes(talkMinutes * 60) | |
} | |
function getActivePresentation(slideStart, slideEnd) | |
{ | |
var slides = SlidesApp.getActivePresentation().getSlides() | |
if (slideStart != undefined) | |
{ | |
return slides.slice(slideStart, slideEnd) | |
} | |
else { | |
return slides; | |
} | |
} | |
function removeTalkTimesAndCalculateTotalTextLength(slideStart, slideEnd) { | |
var totalTextLength = 0; | |
getActivePresentation(slideStart, slideEnd).forEach(slide => { | |
let spekerNoteShape = slide.getNotesPage().getSpeakerNotesShape() | |
let text = spekerNoteShape.getText() | |
text.setText(stripText(text.asString())) | |
totalTextLength += text.asString().length | |
}) | |
return totalTextLength; | |
} | |
function stripText(text) { | |
return text.replace(/\[#\d*:\d*:\d*\-#\d*:\d*:\d*\]\n/gm, "") | |
} | |
function updateTalkTimes(talkTimeInSeconds, slideStart, slideEnd) { | |
var totalTextLength = removeTalkTimesAndCalculateTotalTextLength(slideStart, slideEnd); | |
var elapsedTextLength = 0; | |
getActivePresentation(slideStart, slideEnd).forEach(slide => { | |
let spekerNoteShape = slide.getNotesPage().getSpeakerNotesShape() | |
let text = spekerNoteShape.getText() | |
let startTime = new Date(1000 * talkTimeInSeconds * (elapsedTextLength / totalTextLength)); | |
elapsedTextLength += text.asString().length | |
let endTime = new Date(1000 * talkTimeInSeconds * (elapsedTextLength / totalTextLength)); | |
text.insertText( | |
0, | |
`[#${startTime.getUTCHours().toString().padStart(2,'0')}:${startTime.getUTCMinutes().toString().padStart(2,'0')}:${startTime.getUTCSeconds().toString().padStart(2,'0')}`+ | |
`-#${endTime.getUTCHours().toString().padStart(2,'0')}:${endTime.getUTCMinutes().toString().padStart(2,'0')}:${endTime.getUTCSeconds().toString().padStart(2,'0')}]\n`) | |
}) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment