【GAS】Google Apps Scriptでスライド資料のアジェンダを自動作成する方法

スポンサーリンク
Google Apps Script

各スライドのタイトル部分のテキスト情報を取得し、資料のアジェンダを自動で生成できるスクリプトを作成してみました。

資料の最終形を作成するときにちょっとした時短ができます。(実際は構成→中身の順で考える人が多いと思うので、アジェンダを最後に作る場面は多くないかもですが。。)
誰かの何かしらの参考になれば幸いです。

できること

内容が完成したスライドに対して、スクリプト実行すると、

このようにアジェンダが2ページ目に追加される。

以下作成方法です。

スライドを作成する

Googleスライドで適当にスライド資料を作成します。
例として、表紙の1枚と、タイトルと本文が存在するスライドページ4枚の計5枚作成しました。

↓表紙

↓中身の資料 これを数枚作成

Google Apps Scriptを起動

タブからツール>スクリプトエディタを押下でGoogle Apps Scriptを起動します。

以下コードを記述

スクリプトのコンソール内に以下を記述する。

function myFunction() {
  //アクティブなプレセンテーションシートを取得する
  const Presentation = SlidesApp.getActivePresentation();
 //各スライドのタイトルを取得する
 const slides = Presentation.getSlides();
  //アジェンダ項目のテキスト情報を格納する配列を用意
  var agendaArray = [];

  //ループ処理でページごとの処理を行う
  for (var i = 1; i < slides.length; i++){
    var slide = Presentation.getSlides()[i];
    var shapes = slide.getShapes();
    var setText = '';

    //ループ処理でページ内のテキスト要素ごとの処理を行う
    for (var j = 0; j < shapes.length; j++){
      var shape = slide.getShapes()[j];
      //テキストの中で最大値の情報を配列に格納する
      if(!setText){
        //setTextに格納する
        setText = shape.getText().asString();
      }else{
        var shapeCompare = slide.getShapes()[j-1];
        var shapeNew = shape.getText().getTextStyle().getFontSize();
        var shapePast = shapeCompare.getText().getTextStyle().getFontSize();
        //取得したテキストサイズが前回setTextに格納したテキストサイズよりも大きい場合
        if(shapeNew > shapePast){
          //setTextに格納する
          setText = shape.getText().asString();
        }
      }
    }
    //アジェンダ項目のテキストを配列に格納
    agendaArray.push(setText);
  }

//2ページ目にスライドを挿入する
Presentation.insertSlide(1, SlidesApp.PredefinedLayout.BLANK);
//アジェンダスライドの作成
//2ページ目のスライド情報を取得 
var slide2page = Presentation.getSlides()[1];
//タイトルを挿入する
  //テキストボックス追加
  var shapeTitle = slide2page.insertShape(SlidesApp.ShapeType.TEXT_BOX, 24.75, 35.25, 300, 100);
  var textTitle = shapeTitle.getText();
  //テキストボックスの文字を「アジェンダ」に設定
  textTitle.setText("アジェンダ");
  //フォントをArial(デフォルト)、文字サイズを25に設定
  textTitle.getTextStyle()
    .setFontFamily("Arial")
    .setFontSize(25);

//アジェンダ項目を挿入する
  //テキストボックス追加
  var shapeBody = slide2page.insertShape(SlidesApp.ShapeType.TEXT_BOX, 24.75, 90.75, 300, 100);
  var textBody = shapeBody.getText();
  //アジェンダ項目の整形
  var agendaAfter = agendaArray.join('');
  //整形したテキストを本文テキストとして設定
  textBody.setText(agendaAfter); 
  //フォントをArial(デフォルト)、文字サイズを18に設定
  textBody.getTextStyle()
    .setFontFamily("Arial")
    .setFontSize(18);
}

解説

アジェンダ資料作成のための準備部分

  //ループ処理でページごとの処理を行う
  for (var i = 1; i < slides.length; i++){                          ーー①
    var slide = Presentation.getSlides()[i];
    var shapes = slide.getShapes();
    var setText = '';                                       ーー②

    //ループ処理でページ内のテキスト要素ごとの処理を行う
    for (var j = 0; j < shapes.length; j++){                         ーー③
      var shape = slide.getShapes()[j];
      //テキストの中で最大値の情報を配列に格納する
      if(!setText){                                        ーー④
        //setTextに格納する
        setText = shape.getText().asString();
      }else{                                            ーー⑤
        var shapeCompare = slide.getShapes()[j-1];                     ーー⑥
        var shapeNew = shape.getText().getTextStyle().getFontSize();          ーー⑦
        var shapePast = shapeCompare.getText().getTextStyle().getFontSize();     ーー⑧
        //取得したテキストサイズが前回setTextに格納したテキストサイズよりも大きい場合
        if(shapeNew > shapePast){
          //setTextに格納する
          setText = shape.getText().asString();
        }
      }
    }
    //アジェンダ項目のテキストを配列に格納
    agendaArray.push(setText);
  }

Point①
スライドページごとの処理を行うループ処理部分。
初期化式をvar i = 1のように1としている理由は、表紙を除いた2枚目のスライド以降を対象とするため。

Point②
各スライドページごとのタイトルを配列(agendaArray)に追加するための変数を設定。

Point③
スライドページ内のテキスト要素ごとの処理を行うループ処理部分。
厳密には全てのシェイプ要素に対して処理を行うため、初期化式はvar j = 0のように0としている。

Point④
条件分岐で、各スライドページの中で1つ目のテキスト情報であればsetTextに格納するように記述。
空文字判定の記載の仕方は以下を参照。
[JavaScript]null または空文字判定
https://qiita.com/_Hammer0724/items/3d21ef84813ee82e8252

Point⑤
条件分岐で、各スライドページの中で2つ目以降のテキスト情報である場合の処理部分。

Point⑥
2つ目以降のテキスト情報である場合の処理で、1つ前のテキスト情報との比較を行うため、1つ前の情報をshapeCompareに代入。

Point⑦
対象のテキスト情報のフォントサイズをshapeNewに代入。

Point⑧
⑥のテキスト情報のフォントサイズをshapePastに代入。

アジェンダページ作成部分

//2ページ目にスライドを挿入する
Presentation.insertSlide(1, SlidesApp.PredefinedLayout.BLANK);               ーー①
//アジェンダスライドの作成
//2ページ目のスライド情報を取得 
var slide2page = Presentation.getSlides()[1];
//タイトルを挿入する
  //テキストボックス追加
  var shapeTitle = slide2page.insertShape(SlidesApp.ShapeType.TEXT_BOX, 24.75, 35.25, 300, 100);     ーー②
  var textTitle = shapeTitle.getText();
  //テキストボックスの文字を「アジェンダ」に設定
  textTitle.setText("アジェンダ");
  //フォントをArial(デフォルト)、文字サイズを25に設定
  textTitle.getTextStyle()
    .setFontFamily("Arial")
    .setFontSize(25);

//アジェンダ項目を挿入する
  //テキストボックス追加
  var shapeBody = slide2page.insertShape(SlidesApp.ShapeType.TEXT_BOX, 24.75, 90.75, 300, 100);     ーー③
  var textBody = shapeBody.getText();
  //アジェンダ項目の整形
  var agendaAfter = agendaArray.join('');                                                            ーー④
  //整形したテキストを本文テキストとして設定
  textBody.setText(agendaAfter); 
  //フォントをArial(デフォルト)、文字サイズを18に設定
  textBody.getTextStyle()
    .setFontFamily("Arial")
    .setFontSize(18);

Point①
insertSlideメソッドを使用しスライドを新規作成。
参考:
insertSlide(insertionIndex, predefinedLayout)
https://developers.google.com/apps-script/reference/slides/presentation#insertslideinsertionindex,-predefinedlayout

Point②
insertShapeメソッドを使用し作成したページ内にタイトル用のテキストボックスを追加。
参考:
[Google Apps Script]Google スライドでテキストボックスを追加し、文字装飾を行う
https://www.ka-net.org/blog/?p=10866

Point③
insertShapeメソッドを使用し作成したページ内にアジェンダ項目用のテキストボックスを追加。

Point④
joinメソッドを利用してアジェンダ項目の整形を行う。空文字で連結することで以下のようなBefore Afterになる。

整形前の配列内の要素
[ ‘資料スライド①\n’, ‘資料スライド②\n’, ‘資料スライド③\n’, ‘資料スライド④\n’ ]
joinメソッド利用後の配列内の要素
資料スライド① 資料スライド② 資料スライド③ 資料スライド④

参考:
【JavaScript入門】joinで配列を連結する方法(改行/置換)
https://www.sejuku.net/blog/23137

実行

実行を押下すると、

2ページ目にタイトルが「アジェンダ」、本文に3〜6ページのタイトル情報が記載されているスライドが作成されました。

ちなみに、タイトルの存在するスライドを仮に増やしたとしても問題なく動作します。

終わりに

以上、アジェンダを自動生成する方法でした。
他にも、最後の確認として各ページのフォントサイズ、フォント、位置等を揃えるスクリプトなんかも作れたら実用的かなと思いました。


読んでいただきありがとうございました!

コメント

タイトルとURLをコピーしました