masuTomo’s blog

競技プログラミングの勉強メモです.主にPythonを使用します.数学の記事も書くかもしれません.

GASでGoogleスライド内のテキストデータを取得する

たくさんのGoogleスライドからテキストデータだけを抜き出してスプレッドシート上の一覧にするGASを作ったのでここに公開します.

背景

  • 研修講師として,参加者にGoogleスライドの雛形を配布(講師と共有設定されている)
  • その研修において,参加者がGoogleスライドに書き込みを行う
  • 研修実施後に,参加者がGoogleスライドにどのようなことを書き込みしているか確認したい

という状況において,書き込み内容を一覧化するGASコードを書きました.

イメージ

配布したGoogleスライドのイメージ
Googleスライドのテキストを一覧化したスプレッドシートのイメージ

コード

function main(){

    // フォルダの指定
    const folderId= 'Goolgeスライドが格納されているフォルダのID';
  
   //フォルダ内のすべてのファイルを取得
    const folder = DriveApp.getFolderById(folderId);
  
    //ファイルタイプを指定(MINEタイプ)
    const filetype = "application/vnd.google-apps.presentation"; //スライドを指定
    const files = folder.getFilesByType(filetype);
  
  
    //抜き出したテキストデータを転記するためのスプレッドシートを指定
    var sss = SpreadsheetApp.openById('スプレッドシートのID').getSheetByName("シート1");
  
    //何行目のデータか
    //スプレッドシートに書き込む行数
    let rowCnt = 1;
    //各ファイル(スライド)ごとにテキストデータを抜き出す
    while(files.hasNext()){
      
      let file = files.next();
      let fileURL = file.getUrl(); // ファイルURL
  
      var presentation = SlidesApp.openByUrl(fileURL);
      var slides = presentation.getSlides();
      //slidesの1枚目(インデックス0)を指定する
      //getpageElements()でページ要素のリストを取得
      var elements = slides[0].getPageElements();
      //テキストデータが格納されているオブジェクトごとに列をわけてスプレッドシートに書き込む
      var colCnt = 0;
  
      //各スライドのオブジェクトの数だけ繰り返す
      for(let i = 0; i < elements.length; i++){
        //オブジェクトがグループ化されている場合は,直接テキストデータが抜き出せない
        if (elements[i].getPageElementType() == SlidesApp.PageElementType.GROUP){
          //getChildrenでグループ化されているオブジェクトの中身のオブジェクトを取り出す
          var children = elements[i].asGroup().getChildren();
          for (let j = 0; j < children.length; j++){
              var tmpTxt = children[j].asShape().getText().asString();
              var tmpCell = sss.getRange(rowCnt, i+1+colCnt);
              tmpCell.setValue(tmpTxt);
              colCnt++;
          }
        //ページエレメントタイプがSHAPEの場合はテキストデータを直接抜き出せる
        }else if(elements[i].getPageElementType() == SlidesApp.PageElementType.SHAPE){
            var tmpTxt = elements[i].asShape().getText().asString();
            var tmpCell = sss.getRange(rowCnt, i+1+colCnt);
            tmpCell.setValue(tmpTxt);
            colCnt++;
        }
      }
      rowCnt++;
    }
  }

Javascriptがあまりわかっていないので,varとletの使い分けがおかしいかもしれません.