🧑‍🔬

毎週の研究進捗スライドを「半」自動で生成する

2021/09/04に公開

動機と前置き

私の所属する研究室では,毎週1回研究室MTGがあり進捗を報告します.進捗報告に使用するスライドを毎週作成するわけですが,これをなんとか楽にできないものかと考えました.

元々スライド作成には,シンプルな操作性が好きで Googleスライド を愛用していました.そこで Google Apps Script を使って自動化をさせようと思います.

タイトルには「半」自動と書いてあります.以下で示しますが,ここでは最低限の実装しかしません.「進捗報告なら最低限これは言わなきゃだめだ!」という内容を記入漏れしないようにテンプレート化させています.それ以外に報告すべきことがあればそこは手で作成してください.それでもかなりスライド作成の時間は削減することができると思います!

この記事に向いていない人

「ぼ,ぼくGoogleのサービスなんて使ったことないよ〜〜〜!!」っていう人.

上記のように,今回はGoogleスライドを使います.(pptx派,keynote派のみなさんすみません)
これから示す実装を手がけていただくと,以下のような流れでスライドが作成できます.

Google Form で内容を入力 -> 結果をGoogleスプレッドシート反映 -> コード実行 -> スライド作成

実装

コードを書く前に

Google スライドのテンプレートを作成する

まずはGoogleスライドでテンプレートを作成します.(下の画像参照)

画像にあるように,GoogleFormで入力した内容を反映させたい箇所を {概要01} のように書きます.{}の中身は自分でわかればなんでも良いですが,GoogleFormの結果が保存されるスプレッドシートと言葉を合わせる必要があるので長すぎるものは不向きかもしれません.画像には他にもテンプレートがありますが,最後に紹介程度に留めます.1ページできれば何ページでも作れる!!

Google Form を作成する

続いて回答内容を入力するGoogle Form を作成します.(画像参照)

前章で作ったテンプレートに反映させる内容を記入するためのフォームです.

回答が保存されるスプレッドシートをいじる

Google Form の回答閲覧画面から回答が保存されているスプレッドシートを開きます.

スプレッドシートの1行目は最初の状態だとフォームの質問内容になっていると思うので,スライドに書いた{hoge}hogeに対応するように修正する必要があります.

ここまでで,コードを書く前の準備は終了です. ☕️

コードを書こう

お使いのGoogleアカウントでGASを使う準備を済ませてください.(ここら辺が参考?)

コード

関数の準備

GASを開くとデフォルトで関数の雛形が準備してあると思います.ここでは generateSlidesFromSpreadsheetという名前の関数にすることにします.

function generateSlidesFromSpreadsheet() 
{
}

回答保存スプレッドシートの読み込み

続いて,回答が保存されているスプレッドシートを読み込みます.以降,2次元配列の容量でスプレッドシートのセルを指定していきます.

var sheet_beforemtg = SpreadsheetApp.openByUrl('スプレッドシートのリンク').getSheetByName('シートの名前');

var datarange_beforemtg = sheet_beforemtg.getDataRange().getValues();

スプレッドシートのリンクシートの名前の確認方法は以下の画像を参考にしてください.

2行目の変数datarange_beforemtgは,スプレッドの内容を取得しています.この変数をconsole.log(datarange_beforemtg)で見てみるとスプレッドシートの中身が取得できているのが確認できます.

スライドの読み込み

序盤で準備したスライドを読み込みます.

var slide = SlidesApp.openByUrl('スライドのリンク');
var template_beforemtg = slide.getSlides()[1];

スライドのリンクはスプレッドシートと同様の方法で確認できます.2つ目の変数template_beforemtgではテンプレートページが何ページ目にあるか指定しています.スライドのページ数を配列として考えると,

スライド1枚目 -> 0
スライド2枚目 -> 1
.
.
.
スライドn枚目 -> n-1

となるので注意してください.私のテンプレートスライドは全体の2ページ目にあるので[1]を指定しています.

内容の更新

以下のfor文でスライドの内容を更新します.それぞれの役割をコメントアウトで記述します.

for(var i=1;i<datarange_beforemtg.length;i++)
{
    // 書き換えた後のスライドを用意
  var newpage = slide.appendSlide(template_beforemtg);
  for(var j=0;j<datarange_beforemtg[0].length;j++)
  {
      //新しいページにある{hoge}の中身を置き換えている
    newpage.replaceAllText('{'+datarange_beforemtg[0][j]+'}', datarange_beforemtg[i][j]);
  }
}

appendSlideについて詳しく調べたい方は公式refをご覧ください.

実装はここまでです.お疲れ様でした. ☕️

まとめ

上記で細かく説明してきたコード(以下に記載)を実行してみましょう.

function generateSlidesFromSpreadsheet() {

  var sheet_beforemtg = SpreadsheetApp.openByUrl('スプレッドシートのリンク').getSheetByName('シートの名前');
  var datarange_beforemtg = sheet_beforemtg.getDataRange().getValues();


  //スライドの読み込み
  var slide = SlidesApp.openByUrl('スライドのリンク');
  var template_beforemtg = slide.getSlides()[1];

  //前回の連絡会対応に関するfor文
  for(var i=1;i<datarange_beforemtg.length;i++)
  {
    var newpage = slide.appendSlide(template_beforemtg);
    for(var j=0;j<datarange_beforemtg[0].length;j++)
    {
      newpage.replaceAllText('{'+datarange_beforemtg[0][j]+'}', datarange_beforemtg[i][j]);
    }
  }
}

実行後にGoogleスライドを確認すると,新しいスライドが作成されて以下のように反映されていることが確認できます.

最後に

いかがでしたでしょうか.「楽をしたい」だけの動機で実装しました.自分の力で自分を楽させてあげましょう(?)
この記法を理解すれば,複数ページのスライドを一度に作成することもできます.

複数ページについて実装したものをGitHubにあげているのでそちらもご覧ください.(リンク)

Discussion