0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【GAS】スプレッドシートから日めくり献立カレンダーを生成する

Last updated at Posted at 2024-12-03

1. やりたいこと

こんな献立表を読み込んで

image.png

こんなスライドたちを生成する(スライドのテンプレートは手動で作る)
image.png

2. 準備

テンプレートスライドの作成

テンプレートになるスライドを作成しておく
今回はこんな感じ

image.png

スプレッドシートの読み込み

献立表スプレッドシートにAppsScriptを追加して書いていく
シート名を指定して、献立が書いてあるシートを取得する(ここでは'menu')

  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadSheet.getSheetByName('menu');

献立リストの取得

B2からH4セルに書かれている献立を取得する

  var range = sheet.getRange('B2:H4');
  var menulist = range.getValues();

とれた中身はこうなる

menulist
[ [ 'トースト、アボカド、ゆで卵、フルーツサラダ',
    'ギリシャヨーグルト、グラノーラ、ブルーベリー',
    'オートミール、バナナ、ナッツ',
    'トースト、ピーナッツバター、リンゴスライス',
    'スムージー(ほうれん草、マンゴー、ヨーグルト)',
    'フレンチトースト、ベリーソース、紅茶',
    'トマトとチーズのオムレツ、トースト' ],
  [ '鶏むね肉のグリルと玄米、野菜スープ',
    'サンドイッチ(ターキーとチーズ)、ミネストローネ',
    'スパゲッティ・ボロネーゼ、サラダ',
    '鮭の塩焼き、ご飯、きんぴらごぼう',
    '鶏胸肉のサラダ、全粒粉パン',
    'ビーフシチュー、バゲット',
    '天ぷらそば、ほうれん草のおひたし' ],
  [ 'サーモンの照り焼き、ほうれん草のおひたし、味噌汁',
    '豚しゃぶサラダ、ご飯、豆腐とわかめの味噌汁',
    'チキンカレー、サラダ、ナン',
    'きのこリゾット、野菜スープ',
    '焼き餃子、野菜炒め、中華スープ',
    '寿司(巻き寿司や握り寿司)、お吸い物',
    '豚の角煮、ご飯、味噌汁' ] ]

B1からH1の日付も取得しておく

  var range = sheet.getRange('B1:H1');
  var datelist = range.getValues();

こちらの中身はこうなる

datelist
[ [ '2024/12/01',
    '2024/12/02',
    '2024/12/03',
    '2024/12/04',
    '2024/12/05',
    '2024/12/06',
    '2024/12/07' ] ]

プレゼンテーションの読み込み

スライドを触っていく
スプレッドシートからの操作なので、IDを指定して開く必要がある

プレゼンテーションのURL https://docs.google.com/presentation/d/xxxxx/edit の xxxxx がIDになる

  const presentationId = 'xxxxxx';
  const presentation = SlidesApp.openById(presentationId);

テンプレートスライドの取得

getSlides()でスライドのリストを取得し、1枚目のテンプレートスライドを取り出す

  const slides = presentation.getSlides();
  const templateSlide = slides[0];

3. まず1枚だけ生成してみる

テンプレートスライドのコピー

スライドを編集するためにコピーする
(スライドオブジェクト).duplicate()でスライドを複製できる

duplicate()は複製されたスライドオブジェクトを返してくれる

  var slide = templateSlide.duplicate();

参考: duplicate() | Class Slide | Apps Script | Google for Developers

テキストボックスに書き込む

テキストボックスはシェイプオブジェクトに分類されるらしい

(スライドオブジェクト).getShapes()でスライド上のシェイプを取得できる

  var shapes = slide.getShapes();

shapesのどの要素が各テキストボックスがにあたるか分からないので、シェイプがもっているテキストで判定する

(シェイプオブジェクト).getText().asString()でテキスト文字列を取得でき、getText().setText()でテキストを書き込める
一致判定のため改行コードを削除しておくことに気を付ける

  for (i=0; i<shapes.length; i++) {
    var text = shapes[i].getText();
    switch (text.asString().replace('\n','')) {
      case 'YYYY/MM/DD':
        text.setText('2024/12/01');
        break;
      case 'あさごはんのメニュー':
        text.setText('トースト、アボカド、ゆで卵、フルーツサラダ');
        break;
      case 'ひるごはんのメニュー':
        text.setText('鶏むね肉のグリルと玄米、野菜スープ');
        break;
      case 'ゆうごはんのメニュー':
        text.setText('サーモンの照り焼き、ほうれん草のおひたし、味噌汁');
        break;
    }
  }

実行するとこのようになスライドが生成される

image.png

4. 1週間分ループさせる

3.の操作をループさせて、日付の個数分スライドができるようにする

  for (i=0; i<datelist[0].length; i++) {

    var slide = templateSlide.duplicate();
    var shapes = slide.getShapes();

    var date = datelist[0][i];
    var asa_gohan  = menulist[0][i];
    var hiru_gohan = menulist[1][i];
    var yuu_gohan  = menulist[2][i];

    for (j=0; j<shapes.length; j++) {
      var text = shapes[j].getText();
      switch (text.asString().replace('\n',''))
      {
        case 'YYYY/MM/DD':
          text.setText(date);
          break;
        case 'あさごはんのメニュー':
          text.setText(asa_gohan);
          break;
        case 'ひるごはんのメニュー':
          text.setText(hiru_gohan);
          break;
        case 'ゆうごはんのメニュー':
          text.setText(yuu_gohan);
          break;
      }
    }
  }

一週間分の献立表スライドが生成される
image.png

順々に一枚目のスライドをコピーしていくので、日付が降順に生成されてしまう。昇順に並べたい場合はループを逆向きにするなど対応が必要

5. まとめ

全体としては以下のようなスクリプトになる

function myFunction() {
  
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadSheet.getSheetByName('menu');

  var range = sheet.getRange('B2:H4');
  var menulist = range.getValues();
  var range = sheet.getRange('B1:H1');
  var datelist = range.getValues();

  const presentationId = 'xxxxx';
  const presentation = SlidesApp.openById(presentationId);
  const slides = presentation.getSlides();
  const templateSlide = slides[0];

  for (i=0; i<datelist[0].length; i++) {

    var slide = templateSlide.duplicate();
    var shapes = slide.getShapes();

    var date = datelist[0][i];
    var asa_gohan  = menulist[0][i];
    var hiru_gohan = menulist[1][i];
    var yuu_gohan  = menulist[2][i];

    for (j=0; j<shapes.length; j++) {
      var text = shapes[j].getText();
      switch (text.asString().replace('\n',''))
      {
        case 'YYYY/MM/DD':
          text.setText(date);
          break;
        case 'あさごはんのメニュー':
          text.setText(asa_gohan);
          break;
        case 'ひるごはんのメニュー':
          text.setText(hiru_gohan);
          break;
        case 'ゆうごはんのメニュー':
          text.setText(yuu_gohan);
          break;
      }
    }
  }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?