GASからGoogleスライドを操作する方法

# はじめに
この記事は「[Ateam LifeDesign Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ateam-life-design)」で完走賞を狙って25記事書いているうちの15日目の記事です。今年も完走目指して頑張るぞ！

今日はGASからGoogleスライドを操作する方法についてみていきます。

# GASからGoogleスライドを操作する方法
GASからGoogleスライドを操作するためには[Slides](https://developers.google.com/apps-script/reference/slides/slide?hl=ja)クラスを使います。

# サンプル

いくつかサンプルコードをあげながら操作についてみていきましょう。

## 新しいスライドを作成する
新しいGoogleスライドを作成するには、以下のようなコードを使用します。

```javascript
function createNewSlide() {
  var presentation = SlidesApp.create('新しいスライド'); // 新しいプレゼンテーションを作成
  var slide = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK); // レイアウトを指定して新しいスライドを追加
  slide.insertTextBox('Hello, Slide!'); // テキストを挿入
}
```

## 既存のスライドを開く
GoogleスライドのIDを使用して既存のスライドを開く方法です。

```javascript
function editSlideText() {
  var presentationId = 'スライドのIDを入力';
  var presentation = SlidesApp.openById(presentationId); // スライドを開く
}
```

## スライドのテキストを変更する
既存のスライドを開いてテキストを変更します。今回は1枚目のスライドの最初のテキスト要素を変更します。

```javascript
function editSlideText() {
  var presentationId = 'スライドのIDを入力';
  var presentation = SlidesApp.openById(presentationId); // スライドを開く

  var slides = presentation.getSlides();
  var slide = slides[0]; // 1番目のスライドを取得

  var shapes = slide.getShapes();
  var text = shapes[0].getText(); // 最初のテキスト要素を取得

  text.setText('新しいテキスト'); // テキストを変更
}
```

## 新しいスライドを挿入する
既存のGoogleスライドに新しいスライドを挿入します。今回は2枚めのスライドを追加します。

```javascript
function insertNewSlide() {
  var presentationId = 'スライドのIDを入力';
  var presentation = SlidesApp.openById(presentationId); // スライドを開く

  var slides = presentation.getSlides();
  var index = 1; // 2番目の位置に新しいスライドを挿入

  presentation.insertSlide(index, SlidesApp.PredefinedLayout.TITLE_AND_BODY); // 特定の位置に新しいスライドを挿入
}

```

# 作るもの

これらのサンプルを踏まえて、クライアントへの資料の自動作成を簡易的に実現しようと思います。
- スプレッドシートのA列目にクライアント名がリストとして記載されている
    - <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/fde4c5c3-4ab5-a72b-eda3-96467f58d7c7.png" width="400px">

- 資料のテンプレートはGoogleスライドで用意されている
    - 1枚目のスライドの2つ目のオブジェクトにクライアント名をいれる
        - ![スクリーンショット 2023-12-11 22.12.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/dd0c5460-8338-d726-a324-4faa9e0643c2.png)

    - 新たに作られたファイル名は`'顧客向け資料_' + クライアント名`という名前で保存する


# GASを書いていく

```javascript
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet  = spreadsheet.getActiveSheet();
  var lastRow = sheet.getLastRow(); // 最終行を取得
```
ここではスプレッドシートの情報を取得しています。今回何行目までデータがあるかは不明という前提なので`getLastRow()`でデータが入っている最終行までを見ていくことにします。

```javascript
  const presentationId = 'テンプレートとなるGoogleスライドのID';
  var presentation = SlidesApp.openById(presentationId);
```

テンプレートとなるGoogleスライドのIDを指定して、`SlidesApp.openById`を使ってテンプレートファイルを開きます。

```javascript
  for (var i = 1; i <= lastRow; i++) {
    var customerName = sheet.getRange('A' + i).getValue();
    
    // スライドの処理が入る
  }
```
A列目にクライアント名が入っているため1行ずつ見て行って、各クライアントごとに処理を行っていきます。

```javascript
    var newPresentation = SlidesApp.create('顧客向け資料_' + customerName);
    var deleteSlide = newPresentation.getSlides()[0]; // 1枚目のスライドを取得
    deleteSlide.remove(); // 1枚目のスライドを削除
```

`SlidesApp.create`をつかって新規のGoogleスライドを作成します。このときファイル名は`'顧客向け資料_' + customerName`で指定します。
また新規でGoogleスライドを作成すると1枚目のスライドがデフォルで作成されるため削除の処理をします。具体的には`newPresentation.getSlides()[0]`で1枚目のスライドを取得し`.remove()`関数を呼び出すことで削除を行います。

```javascript
    // テンプレートのスライドを取得し、新しいスライドにコピー
    var slides = presentation.getSlides();
    for (var j = 0; j < slides.length; j++) {
      newPresentation.appendSlide(slides[j]);
    }
```

続いてテンプレートとなるGoogleスライドから`getSlides()`で各スライドを取得し1つずつループさせながら新しいGoogleスライドに`appendSlide`を使ってコピーを生成していきます。

```javascript
    var topSlide = newPresentation.getSlides()[0]; 
    var shapes = topSlide.getShapes();
    var text = shapes[1].getText(); 

    text.setText(customerName + '御中'); // 顧客名を挿入

    newPresentation.saveAndClose();
```

そしてコピーが完了したら今回クライアント名を入れたい1枚目のスライドを`newPresentation.getSlides()[0]`を呼び出すことで取得します。そのスライド内にある図形を`getShapes()`で抜き出して2つ目の図形のテキストにクライアント名を`setText`をつかって入れます。そして最後に`saveAndClose()`をつかって編集したスライドの保存を行います。GASからスライドを操作した結果を反映するには`saveAndClose()`メソッドが必ず必要になるので忘れないようにしましょう。

# 完成品がこちら

## GASのコード

```javascript
function generateSlidesFromTemplate() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet  = spreadsheet.getActiveSheet();
  var lastRow = sheet.getLastRow(); // 最終行を取得

  const presentationId = 'テンプレートとなるGoogleスライドのID';
  var presentation = SlidesApp.openById(presentationId);

  for (var i = 1; i <= lastRow; i++) {
    var customerName = sheet.getRange('A' + i).getValue();

    // 新しいGoogleスライドを作成
    var newPresentation = SlidesApp.create('顧客向け資料_' + customerName);
    var deleteSlide = newPresentation.getSlides()[0]; // 1枚目のスライドを取得
    deleteSlide.remove(); // 1枚目のスライドを削除
   
    // テンプレートのスライドを取得し、新しいスライドにコピー
    var slides = presentation.getSlides();
    for (var j = 0; j < slides.length; j++) {
      newPresentation.appendSlide(slides[j]);
    }

    var topSlide = newPresentation.getSlides()[0]; 
    var shapes = topSlide.getShapes();
    var text = shapes[1].getText(); 

    text.setText(customerName + '御中'); // 顧客名を挿入

    newPresentation.saveAndClose();
  }
}
```

## 実行結果
![スクリーンショット 2023-12-11 22.33.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/07a8ce13-398f-4d50-1644-5ee732c80c13.png)

テンプレートを元に株式会社Aのための資料が作成できました。同様のものが株式会社B、株式会社Cについても作成されていました！

# 最後に
今日はGASからGoogleスライドを操作する方法についてサンプルコードを添えて見ていきました。Googleスライドは弊社内でもクライアント向けの資料でよく活用しているので今回のようにクライアント名を動的に入れたり、内部の数字をシートに記録した値によって書き換えたりといったことは、実務でも活用できそうです！