GASでスプレッドシートのデータから
Googleスライドを自動生成する方法

テンプレートのスライドを複製し、replaceAllText()(プレゼン内の文字列を一括置換するメソッド)でスプレッドシートの値を差し込むだけで、資料や月次レポートを量産できます。PDF化してGmail送信、定期トリガー実行まで解説します。

|対象: GAS / Googleスライド / SlidesApp

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にして関係者へ送るところまで自動化できます。

資料作成の自動化を
相談する。

月次レポートや提案資料の自動生成、PDF配信、帳票出力など、日々の資料作成を自動化するGAS開発をご相談いただけます。

GAS開発の対応範囲を見る