GASでスプレッドシートのデータから
Googleスライドを自動生成する方法
テンプレートのスライドを複製し、replaceAllText()(プレゼン内の文字列を一括置換するメソッド)でスプレッドシートの値を差し込むだけで、資料や月次レポートを量産できます。PDF化してGmail送信、定期トリガー実行まで解説します。
Table of Contents
どんな場面で使えるのか
スプレッドシートに溜まったデータを、そのまま見栄えの良い資料にしたい場面は多くあります。GASのSlidesApp(スライドを操作するGASの組み込みサービス)を使えば、こうした資料作成を丸ごと自動化できます。
月次レポート
売上や実績データを毎月同じレイアウトのスライドに差し込み、PDFで配信する
顧客ごとの提案資料
1行1社のデータから、宛名や金額を差し替えた提案書を一括生成する
表彰・証明書
名簿の氏名や日付をテンプレートに流し込み、人数分のスライドを量産する
定例の共有資料
案件一覧や進捗表を表として差し込み、会議用スライドを自動更新する
テンプレートとプレースホルダの準備
まず、ひな形になるGoogleスライドを1つ作ります。差し替えたい箇所には{{name}}や{{amount}}のような「プレースホルダ」(あとで置き換える目印の文字列)をテキストとして書いておきます。
プレースホルダの名前は、スプレッドシートの見出し行(1行目)と同じにしておくと後のコードが簡単になります。例えば見出しがnameなら、スライド側は{{name}}にします。プレゼンのIDは、URLの/presentation/d/●●●/editの●●●部分です。
1行1スライドで量産する基本コード
テンプレートの1枚目をひな形として、データの行数だけduplicate()(スライドを複製するメソッド)で複製し、各スライドで見出し名のプレースホルダを行の値に置き換えます。テンプレートを汚さないよう、最初にmakeCopy()でコピーを作ってから編集するのがポイントです。
function generateSlidesFromSheet() {
// テンプレートのプレゼンID(1枚目をひな形として使う)
const TEMPLATE_ID = 'ここにテンプレートのプレゼンIDを貼る';
const sheet = SpreadsheetApp.getActive().getSheetByName('データ');
const data = sheet.getDataRange().getValues();
const header = data[0]; // 例: ["name", "company", "amount"]
const rows = data.slice(1);
// テンプレートを直接編集しないよう、まずコピーを作る
const stamp = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyyMMdd');
const copy = DriveApp.getFileById(TEMPLATE_ID).makeCopy('生成資料 ' + stamp);
const deck = SlidesApp.openById(copy.getId());
const template = deck.getSlides()[0]; // 1枚目をひな形にする
rows.forEach((row) => {
const slide = template.duplicate(); // ひな形を複製
header.forEach((col, i) => {
// テンプレート内の {{name}} などを行の値に置換
slide.replaceAllText('{{' + col + '}}', String(row[i]));
});
});
template.remove(); // ひな形スライドは最後に削除
deck.saveAndClose(); // 変更を確定
Logger.log('生成URL: ' + deck.getUrl());
}replaceAllText()はスライド内のすべての一致テキストを置き換えます。最後にsaveAndClose()を呼ばないと変更が反映されないことがあるため、必ず実行します。
明細データを表として差し込む
文字の置換だけでなく、案件一覧や明細のような表データもスライドに差し込めます。insertTable()で空の表を挿入し、スプレッドシートの2次元配列をセルに流し込みます。
function insertTableToSlide() {
const deck = SlidesApp.openById('プレゼンID');
const slide = deck.getSlides()[1]; // 表を入れたいスライド
const sheet = SpreadsheetApp.getActive().getSheetByName('明細');
const values = sheet.getDataRange().getValues(); // 2次元配列
const numRows = values.length;
const numCols = values[0].length;
// 空の表を挿入し、セルにスプレッドシートの値を流し込む
const table = slide.insertTable(numRows, numCols);
for (let r = 0; r < numRows; r++) {
for (let c = 0; c < numCols; c++) {
table.getCell(r, c).getText().setText(String(values[r][c]));
}
}
deck.saveAndClose();
}行数・列数はデータに合わせて自動で決まるため、明細の件数が月ごとに変わっても同じコードで対応できます。表の位置やサイズはtable.setLeft()などで後から調整できます。
PDF化してGmailで自動送信する
生成したスライドは、そのままPDFにしてメール添付できます。getAs(MimeType.PDF)でPDFのBlob(ファイルの中身を表すデータ)を取り出し、GmailApp.sendEmail()の添付ファイルに渡します。
function sendDeckAsPdf() {
const deck = SlidesApp.openById('プレゼンID');
deck.saveAndClose(); // 送る前に必ず保存を確定
// Driveファイルとして開き直し、PDFのBlobを取得
const pdf = DriveApp.getFileById(deck.getId()).getAs(MimeType.PDF);
const monthLabel = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy年M月');
pdf.setName(monthLabel + ' レポート.pdf');
GmailApp.sendEmail(
'report@example.com',
monthLabel + ' の月次レポート',
'PDFを添付します。ご確認ください。',
{ attachments: [pdf] }
);
}PDF化の前に必ずsaveAndClose()で変更を確定してください。保存前にPDF化すると、差し込み前の状態が出力されてしまいます。
毎月の定期トリガーで自動化する
月次レポートのように毎月同じ資料を作る場合は、時間主導トリガーで生成から送信までを自動化します。onMonthDay(1)で毎月1日に実行するよう設定できます。二重登録を防ぐため、作成前に同名トリガーを掃除しておきます。
function createMonthlyTrigger() {
// 二重登録を防ぐため、同名トリガーを一度掃除してから作る
ScriptApp.getProjectTriggers().forEach((t) => {
if (t.getHandlerFunction() === 'monthlyReportJob') {
ScriptApp.deleteTrigger(t);
}
});
ScriptApp.newTrigger('monthlyReportJob')
.timeBased()
.onMonthDay(1) // 毎月1日
.atHour(7) // 朝7時台に実行
.create();
}
function monthlyReportJob() {
generateSlidesFromSheet(); // スライドを生成
sendDeckAsPdf(); // PDF化して送信
}実務での注意点
1. テンプレートは必ずコピーして使う
テンプレートを直接編集すると、プレースホルダが実データに置き換わってひな形が壊れます。makeCopy()でコピーを作り、そのコピーを編集する流れを徹底しましょう。
2. 大量生成は実行時間制限に注意
スライドの複製や置換は1枚ずつ処理されるため、数百枚規模になるとGASの6分の実行時間制限に達することがあります。生成件数を分割するか、対象を絞る設計が安全です。
3. 生成ファイルが増え続けないようにする
毎回コピーを作るとDriveにファイルが溜まります。PDF送信だけが目的なら、送信後にsetTrashed(true)でコピーをゴミ箱に移すか、保管用フォルダにまとめる運用にしましょう。
まとめ
GASのSlidesAppを使えば、スプレッドシートのデータをGoogleスライドに差し込んで資料を自動生成できます。テンプレートの複製・replaceAllText()での置換・insertTable()での表差し込みを組み合わせ、PDF送信と定期トリガーまでつなげれば、月次レポートや提案資料の作成を人手ゼロで回せます。まずは1枚のテンプレートと数行のデータから試してみてください。
よくある質問
SlidesApp(スライドを扱うGASの組み込みサービス)を使います。SlidesApp.openById()で既存のプレゼンを開き、getSlides()でスライド一覧を取得し、各スライドのreplaceAllText()やinsertTable()で中身を編集します。新規作成はSlidesApp.create()です。
テンプレートとなるスライドを1枚用意し、データの行数だけそのスライドをduplicate()で複製します。複製したスライドごとにreplaceAllText()でプレースホルダ(例: {{name}})を各行の値に置き換えると、1行1スライドの資料が量産できます。
DriveApp.getFileById(テンプレートID).makeCopy()で先にコピーを作り、そのコピーのIDをSlidesApp.openById()に渡して編集します。こうすればテンプレート本体は元のまま残り、毎回きれいな状態から生成できます。
できます。deck.saveAndClose()で変更を確定したあと、DriveApp.getFileById(deck.getId()).getAs(MimeType.PDF)でPDFのBlobを取得し、GmailApp.sendEmail()のattachmentsに渡します。月次レポートを自動でPDF配信する運用に向いています。
できます。ScriptApp.newTriggerの時間主導トリガーで、毎月1日などに生成関数を実行するよう設定します。前月分のデータを集計してスライド化し、PDFにして関係者へ送るところまで自動化できます。