
【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も何かに使うかもしれないなと思って残してあります。
スライドのレイアウトを取得
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の要素数だけスライドを追加する。
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人の名前を差し込んで行きます。
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の方が高いです。翻訳を仕事にしている方、ぜひ使ってみてください。