Naomi's notebook

Naomi's notebook

GASで自己紹介スライド

Google Formでなんらかの情報を記入するとGoogleスプレッドシートにその結果を出力することができますね. その情報をまとめたスライドを自動で生成するようなスクリプトをGASで書いたのでメモしておきます.

スプレッドシートの情報読み込み

スプレッドシートから情報を読み込み,学籍番号(8カラム目)でソートします.これは調べれば簡単でした.

 let spread_sheet = SpreadsheetApp.openById("id")
 let sheet = spread_sheet.getActiveSheet()
 let range = sheet.getRange(2,2,sheet.getLastRow()-1,sheet.getLastColumn()-1)
 let profiles = range.getValues()
 profiles.sort(function(a,b){//番号の逆順でソート->番号順にスライドができます.
  if(a[7] < b[7]) return +1;
  if(a[7] > b[7]) return -1;
  return 0;
 })

スライドの作成

今回はデザインが楽に作れるように,1枚目にタイトル,2枚目にテンプレートを手で作り,2枚目のスライドをコピーしてその値を変更することで各ページを作っていきます.

あまり調べてもスライドをいじっている人がいなかったので,ここからは公式ドキュメント

developers.google.com とにらめっこして作りました.

どうやら,

Presentation
└──Slide
      ├──Shape
      ├──Image
      └──.....

という構造になっているようです.textなどは全てShapeとして取得できます.

どの要素がどの番号のShapesなのかは,少しずつ番号をずらすなどして調べました.(なんらかの法則があるんですかね?)スライドをduplicateしてもshapesの順番は保持されるっぽいので,この番号を用いて要素を編集し,文字を書き換えることにしました.

//スライドの作成
 let presentation = SlidesApp.openById("id")
 Logger.log(presentation.getName())
 //最初の2ページ以外を削除
 let oldslides=presentation.getSlides()
 for(let i=2;i<oldslides.length;i++){
   oldslides[i].remove()
 }
 let template=oldslides[1]
 template.getImages()[0].remove()
 for(let i=0;i<profiles.length;i++){
   //新しいページの作成
   let newslide=template.duplicate()
   let shapes=newslide.getShapes()
   shapes[5].getText().setText(profiles[i][0]);
   shapes[4].getText().setText(profiles[i][2]);
   shapes[15].getText().setText(profiles[i][3]);
   shapes[13].getText().setText(profiles[i][4]);
   shapes[14].getText().setText(profiles[i][5]);//Twitter ID
   shapes[14].setLinkUrl("https://twitter.com/"+profiles[i][5])
   //画像
   var url = profiles[i][1]
   var eqPos = url.indexOf("=")
   var id = url.substring(eqPos+1)
   var img = DriveApp.getFileById(id).getBlob()
   newslide.insertImage(img,25,125,200,200)
 }
 //テンプレの削除
  template.remove()

このようなスライドができます. 文字数が多すぎるとスライドに入りきりませんが,今回は見栄えの良い文字数までフォームの方で文字数制限をすることでなんとかしました.

結果

この関数を実行すると,以下のようなスライドが入力した人数の枚数生成されます. f:id:Naomi_Lilienthal:20200919201403p:plain