見出し画像

【GAS】Google Apps Script 活用事例 Google Slides スライドにスプレッドシートの内容を挿入するスクリプト

最近、調査業務で競合企業の特徴をスプレッドシートにまとめる機会がありました。あくまでスプレッドシートは、表計算ソフトなので、一つのセルに長文を書き込んだりすると見にくいんですよね。そこでスライドにまとめたいなぁと思いました。

しかし、スライドの自動化に関しては、あまり実践する機会がありませんでした。今回は、そこまで量もなかったので、手作業で行ったのですが次回からGASでえいと出来るようになるといいなと思います。

サンプル スライドの内容を取得

まずは、基本のおさらい。僕もすっかり忘れていました。過去記事を見て、復習しました。スライドの内容を取得します。

getShapesで取得すると、テキストボックスごとに内容が取得されるため、どこまでが、どのページか分かりにくいなと感じたため、ページ数をカウントする変数を用意しています。

function getSlidesContents(){

 const presentation = SlidesApp.getActivePresentation();  
 const slides       = presentation.getSlides();

 let page = 1;

 for(const slide of slides){
   const shapes = slide.getShapes();

   for(const shape of shapes){
     const info = {
       text :      shape.getText().asString(),
       objectId:   shape.getObjectId()
     }
   console.log('page : ', page, ' text : ', info.text);

   }
   page += 1;
 }
}

サンプルの出力結果

※このスクリプトでは、オブジェクトIDも何かに使うかもしれないなと思って残してあります。

スクリーンショット 2021-02-26 7.40.40

スライドのレイアウトを取得

スクリーンショット 2021-02-25 21.33.11

function getLayoutsName() {
 const presentation = SlidesApp.getActivePresentation();
 const layouts      = presentation.getLayouts();
 const array        = ['タイトル大と本文', 'タイトル中のみ', 'タイトル小と本文', '2カラム', 'タイトル位置 上', '左カラム', '本文大', '2カラムとアイキャッチ画像', '説明小 位置下', '数字大', '空白'];
 let count          = 0;

 console.log(layouts.length);

 for(const layout of layouts){
   const layoutName = layout.getLayoutName();
   console.log(layoutName, array[[count]]);

   count += 1;
 }
}

左上から順に配列で取得しているようです。返ってくる値だけだと、わかりにくいため、補足用の配列も一緒に、for文で回して出力しています。

サンプル arrayの要素数だけスライドを追加する。

スクリーンショット 2021-02-25 22.49.44

function appendSlides(){
 const presentation = SlidesApp.getActivePresentation();
 console.log('Google Slidesの名前: ', presentation.getName());

 //配列の要素数だけ、スライドを複製する。
 //今回は、10枚で、1枚目のスライドの通りに複製される
 const targetSlide = presentation.getSlides()[0];
 const array       = ['タイトル大と本文', 'タイトル中のみ', 'タイトル小と本文', '2カラム', 'タイトル位置 上', '左カラム', '本文大', '2カラムとアイキャッチ画像', '説明小 位置下', '数字大'];


//最終的には、arrayをスプレッドシートの行だったり、列に置き換えれば良い
 for(let i = 0; i < array.length; i++){
   
   //{title}をarrayの要素で差し替えする
   //スプレッドシートの値とかで差し替えも可能
   const newSlide = presentation.appendSlide(targetSlide);
   newSlide.replaceAllText('{title}', array[i]);
   
   console.log(i);
 }
}

1次元配列をスプレッドシートから取得する場合 サンプル

function getSheetInfo_(row, column){
 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 const sheet       = spreadsheet.getSheetByName('シート31');
 const array       = sheet.getRange(row, column, sheet.getLastRow()).getValues().flat();
 console.log(array);

 return array

}

for文の復習

どちらを i と j に置くかは、シートの構成によって変わります。

const headerRow = values[0];
let message     = '';


//headerRowが、列方向の繰り返し
for(let i = 2; i < headerRow.length; i++){
  let subject    = headerRow[i];
  message       += '\n' + subject + '\n\n';
  
  //valuesが、行方向の繰り返し
  for(let j = 1; j < values.length; j++){
    
    const name     = values[j][1];
    const score    = values[j][i];
    message       += name + ' ' + score + ' 点' + '\n';
    console.log('i = %s の時、headerRow[%s] = %s  j = %s の時、 values[j][1] = %s 点数は、 %s 点', i, i, headerRow[i], j, name, score);
    
  }//for
}//for_i

サンプルスクリプト

手元にイイ感じの2次元配列があったので、挙動を確認してみました。今回は掃除当番表の行数だけスライドを複製し、1ページのスライドに4人の名前を差し込んで行きます。

スクリーンショット 2021-02-26 15.41.55

スクリーンショット 2021-02-26 15.48.02

スクリーンショット 2021-02-26 15.49.09

function appendSlides(){

 const id           = '****************';
 const presentation = SlidesApp.openById(id);
 console.log('Google Slidesの名前: ', presentation.getName());

 const targetSlide = presentation.getSlides()[0];
 const values      = getSheetContents_();
 const headerRow   = values[0];
 
 //スライドを増やしたい枚数
 for(let i = 0; i < values.length; i++){
   const newSlide  = presentation.appendSlide(targetSlide);
   
   //列数 名前を挿入する
   for(let j = 0; j < headerRow.length; j++){
     const targetWords = '{' + 'people' + j + '}';
     console.log(targetWords);

     if(j === 0){
       newSlide.replaceAllText('{title}', values[i][0]);
     }else{
       newSlide.replaceAllText(targetWords, values[i][j]);
     }
   }
 }//for_j
}//end


function getSheetContents_(){
 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 const sheet       = spreadsheet.getSheetByName('掃除当番表');
 const values      = sheet.getDataRange().getDisplayValues();

 console.log(values);

 return values
 
}

今回のスクリプトでは、スライドの一番後ろに追加していますが、位置を指定したい場合は、insertSlide()を使えばいいようです。

insertSlide(位置, スライド)

スライドの位置を指定して新規作成する場合

const presentation = SlidesApp.getActivePresentation();
const layout       = presentation.getLayouts()[10]; 

//[1]の位置に空白スライドを追加([1] = 2枚目)
presentation.insertSlide(1, layout);

既存のスライドを複製し、位置も指定したい場合

//コピーしたい対象の既存スライドを取得
const presentation = SlidesApp.getActivePresentation();
const targetSlide  = presentation.getSlides()[0];

//スライドをコピーして追加
presentation.insertSlide(2, targetSlide);

過去のGoogle Slidesの自動化

スライド内の全てのテキストを取得して、英語に翻訳するスクリプトです。今現在の精度では、文章だと正確な翻訳を期待出来ませんが、単語などは、かなり正確に翻訳可能です。

ちなみに、文章の翻訳精度で言えば、DeepLの方が高いです。翻訳を仕事にしている方、ぜひ使ってみてください。

Google Documentの自動化関連記事もあります。

こういう自動化カッコいいなぁ

スプレッドシートの内容を、ドキュメントに差し込みする場合は、こちらの過去記事を参考にしてください。


この記事が参加している募集

#最近の学び

181,034件

この記事が気に入ったらサポートをしてみませんか?