複数のスライドに含まれるページたちを
一つのスライドに集約したくて書いたコードです
HTML Serviceで フロントのUIを作って
コピー元スライドのページたちを
基盤スライドの末尾に追加していきます
Gemini や ChatGPT と対話しながら SlidesApp で実装しました
処理はあまり速くないので
スライドの数が多い場合は6分の実行時間制限にぶつかりますが
複数回に分けて実行することで回避可能
Code.gs
function doGet() {
return HtmlService.createHtmlOutputFromFile('index');
}
// URLからスライドID抽出(例:open?id=xxxxx or d/xxxxx/)
function extractId(url) {
const match = url.match(/[-\w]{25,}/);
if (!match) throw new Error("URLからIDを抽出できません: " + url);
return match[0];
}
// フロントから呼ばれる統合処理
function mergePresentations(baseSlideUrl, urlText) {
const basePresentationId = extractId(baseSlideUrl);
const slideUrls = urlText.split(/\r?\n/).map(s => s.trim()).filter(Boolean);
const basePresentation = SlidesApp.openById(basePresentationId);
const baseSlideCount = basePresentation.getSlides().length;
slideUrls.forEach((url, i) => {
const sourcePresentationId = extractId(url);
// 各元スライドから全ページ取得し、baseへ追加
const srcPresentation = SlidesApp.openById(sourcePresentationId);
const srcSlides = srcPresentation.getSlides();
srcSlides.forEach(srcSlide => {
basePresentation.appendSlide(srcSlide);
});
});
return 'https://docs.google.com/presentation/d/' + basePresentationId + '/edit';
}
index.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<style>
body { font-family: sans-serif; }
label { font-weight: bold; }
textarea, input[type="text"] { width: 98%; }
button { margin-top: 10px; padding: 6px 20px; }
</style>
</head>
<body>
<h3>スライド統合アプリ</h3>
<label>基盤スライドのURL:</label><br>
<input type="text" id="baseSlideUrl"><br><br>
<label>コピー元スライドのURL一覧(1行1URL):</label><br>
<textarea id="slideUrls" rows="6" placeholder="https://docs.google.com/presentation/d/~"></textarea><br>
<button onclick="submitMerge()">実行</button>
<div id="result" style="margin-top:15px;"></div>
<script>
function submitMerge() {
const baseUrl = document.getElementById('baseSlideUrl').value.trim();
const urlText = document.getElementById('slideUrls').value.trim();
if (!baseUrl || !urlText) {
document.getElementById('result').innerHTML = "両方入力してください。";
return;
}
document.getElementById('result').innerHTML = '統合中...しばらくお待ちください。';
google.script.run
.withSuccessHandler(function(url) {
document.getElementById('result').innerHTML =
'統合完了!<a href="' + url + '" target="_blank">統合スライドを開く</a>';
})
.withFailureHandler(function(e) {
document.getElementById('result').innerHTML =
'エラー:' + (e.message || e);
})
.mergePresentations(baseUrl, urlText);
}
</script>
</body>
</html>
Tips
UIを作らずにコードだけで実行する場合
統合したい SLIDE_ID を配列に入れて
mergePresentations() を実行すると
統合用のスライドが自動作成されます
統合用のスライドが自動作成されます
function mergePresentations() {
// 統合したいGoogleスライドのIDリスト
const presentationIds = [
'SLIDE_ID', // スライド1のID
'SLIDE_ID', // スライド2のID
'SLIDE_ID' // スライド3のID
];
// 新しいプレゼンテーションを作成
const mergedPresentation = SlidesApp.create('統合スライド');
const mergedSlides = mergedPresentation.getSlides();
// 最初の空スライドを削除
if (mergedSlides.length > 0) {
mergedSlides[0].remove();
}
// 各プレゼンテーションの全スライドを追加
presentationIds.forEach(id => {
const srcPresentation = SlidesApp.openById(id);
const srcSlides = srcPresentation.getSlides();
srcSlides.forEach(srcSlide => {
mergedPresentation.appendSlide(srcSlide);
});
});
Logger.log('統合完了!URL: https://docs.google.com/presentation/d/' + mergedPresentation.getId() + '/edit');
}