Apps Scriptリファレンス: Apps Script Reference |障害・課題追跡: IssueTracker |Google Workspace: Status Dashboard - Summary

2025年6月8日日曜日

複数のGoogleスライドのページを一つのスライドにまとめたい


複数のスライドに含まれるページたちを

一つのスライドに集約したくて書いたコードです


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');
}





Latest post

スプレッドシートの空白セルを直前の値で埋めたい

A列の空白セルに直前の値を入れたくて書いたコードです スプレッドシートに以下のようなBeforeの表があるとき (A列に空白セルがある) Before 1 A B 2 エリア 都市 3 東京 新宿 4 渋谷 5 池袋 6 神奈川 横浜 7 川崎 8 相模原 9 千葉 千葉 10 ...