GASでGoogleスライドに自動で目次を作成するスクリプト

# GAS｜Googleスライド２ページ目に目次を作成

この記事では、Googleスライドの2ページ目に目次を自動生成する Google Apps Script (GAS) を紹介します。スライドのタイトルとURLを一覧にし、リンク付きの目次を生成します。

## スクリプトの概要

このスクリプトは以下の機能を提供します：

- 3ページ目以降のスライドを対象に、それぞれのスライドのタイトルとURLを取得
- 目次を2ページ目に挿入し、タイトルとリンクを表示
- スライドの数に応じてフォントサイズを自動調整

## 手順

### 1. Google スライドに対する権限の設定
Google Apps Script で Google スライドにアクセスするためには、スライドのID（`PRESENTATION_ID`）をスクリプトプロパティに保存しておく必要があります。

```javascript
PropertiesService.getScriptProperties().setProperty("PRESENTATION_ID", "your-presentation-id-here");
```
### 2. スクリプトのコード
以下は、Googleスライド２ページ目に目次を生成するスクリプトです。
```
/**
 * 🔧役割｜Googleスライド２ページ目に目次を生成
 * 💡トリガー｜手動
*/

function generateSlideIndexPage() {
  const presId = PropertiesService.getScriptProperties().getProperty("PRESENTATION_ID"); // プレゼンテーションIDを設定
  const pres = SlidesApp.openById(presId);
  const slides = pres.getSlides();

  // スライドのタイトルとURLのペアを格納する配列
  const slideData = [];

  // 各スライドの最初のシェイプを取得してタイトルとURLを生成（3ページ目以降を対象）
  for (let i = 2; i < slides.length; i++) { // 3ページ目以降から処理
    const slide = slides[i];
    const shapes = slide.getShapes();
    const slideId = slide.getObjectId();
    
    // スライドのURLを生成
    const slideUrl = 'https://docs.google.com/presentation/d/' + presId + '/edit#slide=id.' + slideId;
    
    // タイトルシェイプを取得（最初のシェイプ）
    let titleTxt = 'No title found'; // デフォルトメッセージ
    
    if (shapes.length > 0) {
      const firstShape = shapes[0];
      
      // シェイプがテキストを持っているか確認
      if (firstShape.getText()) {
        titleTxt = firstShape.getText().asString();
      }
    }

    // タイトルとURLのペアを配列に追加
    slideData.push({
      title: titleTxt,
      url: slideUrl
    });
  }
  
  // 新しいスライドを2ページ目に挿入（インデックス1）
  const newSlide = pres.insertSlide(1, SlidesApp.PredefinedLayout.TITLE_AND_BODY);
  
  // 新しいスライドのシェイプを取得（タイトルと本文用）
  const titleShape = newSlide.getPlaceholder(SlidesApp.PlaceholderType.TITLE);
  const bodyShape = newSlide.getPlaceholder(SlidesApp.PlaceholderType.BODY);

  // タイトルシェイプが存在する場合は「目次」をタイトルとして書き込む
  if (titleShape) {
    const titleFontSize = 25;
    titleShape.asShape().getText().setText("目次")
    .getTextStyle().setFontSize(titleFontSize);
  }

  // 本文シェイプが存在する場合は目次の内容を書き込む
  if (bodyShape) {
    const textRange = bodyShape.asShape().getText();
    textRange.setText(''); // 既存のテキストをクリア

    // スライド数に基づいてフォントサイズを調整
    let fontSize = 14; // デフォルトのフォントサイズ
    if (slideData.length > 10) {
      fontSize = 12; // スライド数が多い場合はフォントサイズを小さくする
    }
    if (slideData.length > 20) {
      fontSize = 10; // さらに多い場合はさらに小さくする
    }

    // 目次を生成し、タイトルにURLをハイパーリンクとして設定
    for (let i = 0; i < slideData.length; i++) {
      const slideItem = slideData[i];
      const title = slideItem.title;
      const url = slideItem.url;

      // タイトルを書き込み、URLをリンクとして設定
      const newText = textRange.appendText(title);

      // テキストにリンクを設定
      newText.getTextStyle().setLinkUrl(url);

      // フォントサイズを設定
      newText.getTextStyle().setFontSize(fontSize);
    }
  } else {
    Logger.log('目次を書き込むための本文シェイプが見つかりません。');
  }

  Logger.log('新しいスライドに目次が作成されました。');
}

```

### 3. スクリプトの実行方法

- Google Apps Script エディタでスクリプトを貼り付けて保存します。
- プレゼンテーションのIDをスクリプトプロパティに設定します。
- 実行ボタンを押すか、トリガーを設定してスクリプトを手動で実行します。

### 4. 注意点

- 目次は、スライドの3ページ目以降のタイトルを対象に生成されます。
- タイトルが設定されていないスライドの場合、デフォルトメッセージ（`No title found`）が表示されます。
- スライド数が増えると、目次のフォントサイズが自動的に小さくなります。

### おわりに

Google スライドの目次を自動的に作成することで、プレゼンテーションの整理やナビゲーションがしやすくなります。ぜひ、このスクリプトを活用して効率的なプレゼン資料作成を行ってください！