// 講座スライド用の「講座ツール」メニュー。Googleスライドの「拡張機能」→「Apps Script」にこの1ファイルだけを貼る。 // (onOpen は1つのプロジェクトに1つしか置けないので、ほかの .gs と一緒に貼らない) // - フォントを LINE Seed JP にする:PowerPointを取り込んだ直後に1回だけ押す // - ページ番号を振り直す:スライドを足す・消す・並べ替えたあとに押す function onOpen() { SlidesApp.getUi().createMenu('講座ツール') .addItem('フォントを LINE Seed JP にする', 'setLineSeedWeights') .addItem('ページ番号を振り直す', 'renumberPages') .addToUi(); } // Googleスライドに取り込んだあと、全スライドの文字を LINE Seed JP にし、太さを付け直す。 // 見出し(19pt以上の太字)は ExtraBold 800、ほかの太字は Bold 700、太字でない文字は Regular 400。 // 太字をオフにしてから太さを数値で指定する(太字オンのままだと Bold 700 で表示される)。 // 1回実行すると太字はすべてオフになるので、やり直すときは PowerPoint を取り込み直してから実行する。 function setLineSeedWeights() { const FONT = 'LINE Seed JP'; const pres = SlidesApp.getActivePresentation(); const fix = (text) => { text.getRuns().forEach(run => { if (!run.asString().trim()) return; const st = run.getTextStyle(); const size = st.getFontSize() || 0; const w = st.isBold() ? (size >= 19 ? 800 : 700) : 400; st.setBold(false); st.setFontFamilyAndWeight(FONT, w); }); }; const apply = (el) => { const t = el.getPageElementType(); if (t === SlidesApp.PageElementType.SHAPE) fix(el.asShape().getText()); else if (t === SlidesApp.PageElementType.TABLE) { const tb = el.asTable(); for (let r = 0; r < tb.getNumRows(); r++) for (let c = 0; c < tb.getNumColumns(); c++) { const cell = tb.getCell(r, c); if (cell.getMergeState() === SlidesApp.CellMergeState.MERGED) continue; // 結合セルの左上以外は飛ばす fix(cell.getText()); } } else if (t === SlidesApp.PageElementType.GROUP) el.asGroup().getChildren().forEach(apply); }; pres.getSlides().forEach(s => s.getPageElements().forEach(apply)); } // ---- ページ番号 ---- // 右下のページ番号(「07 / 24」の形の文字)を、いまの並び順どおりに振り直す。書式はそのまま、数字だけを書き換える。 // 「スライドをスキップ」にしたスライドは数えず、番号も書き換えない。 function renumberPages() { const PAT = /^\s*\d{1,3}\s*\/\s*\d{1,3}\s*$/; const pad = (n) => String(n).padStart(2, '0'); const slides = SlidesApp.getActivePresentation().getSlides().filter(s => !s.isSkipped()); const total = slides.length; let changed = 0; const visit = (el, label) => { const t = el.getPageElementType(); if (t === SlidesApp.PageElementType.GROUP) { el.asGroup().getChildren().forEach(c => visit(c, label)); return; } if (t !== SlidesApp.PageElementType.SHAPE) return; const text = el.asShape().getText(); const cur = text.asString().replace(/\n$/, ''); if (!PAT.test(cur) || cur.trim() === label) return; text.replaceAllText(cur.trim(), label); changed++; }; slides.forEach((s, i) => { const label = `${pad(i + 1)} / ${pad(total)}`; s.getPageElements().forEach(el => visit(el, label)); }); SlidesApp.getUi().alert(`ページ番号を${changed}か所直しました(全${total}枚)。`); }