Softex CelwareTech Blog
Google Apps Script2026-05-20

GAS帳票のセル配置をslots配列で管理する方法

写真枠や入力欄のセル番地をGAS処理内に散らばらせず、slots配列に集約して帳票テンプレート変更に強くする実装パターンを解説します。

GASGoogleスプレッドシート帳票PDF出力設計

はじめに

Google Apps ScriptでGoogleスプレッドシートを帳票テンプレートとして使う場合、写真枠、入力欄、明細欄などのセル番地をコード内に直接書きたくなります。

ただ、B2D2B7のようなセル番地が処理本体に散らばると、帳票レイアウトを少し変えただけで修正漏れが起きやすくなります。

このような繰り返し配置は、slots配列としてまとめて定義しておくと扱いやすくなります。

使う場面

  • 1ページに同じ構造の写真枠や明細枠が複数ある
  • 写真1〜6、明細1〜10のような繰り返し配置がある
  • 帳票テンプレートのセル位置を後から調整する可能性がある
  • 複数ページPDFでも同じ配置ルールを使い回したい

写真付き現場報告書作成Webアプリでも、1ページ6枚の写真枠をslotsで管理しています。

設定例

セル配置は、処理本体ではなく設定オブジェクトに集約します。

const REPORT_CONFIG = {
  slots: [
    { imageCell: 'B2', textCells: ['B3', 'B4', 'B5'] },
    { imageCell: 'D2', textCells: ['D3', 'D4', 'D5'] },
    { imageCell: 'B7', textCells: ['B8', 'B9', 'B10'] },
    { imageCell: 'D7', textCells: ['D8', 'D9', 'D10'] },
    { imageCell: 'B12', textCells: ['B13', 'B14', 'B15'] },
    { imageCell: 'D12', textCells: ['D13', 'D14', 'D15'] },
  ],
};

imageCellは写真を表示する起点セル、textCellsはその写真に紐づく入力項目のセルです。

1ページ分を書き込む例

処理側は、slot.imageCellslot.textCellsだけを見ます。

function writeItemsToSheet_(sheet, items) {
  items.forEach(function(item, index) {
    const slot = REPORT_CONFIG.slots[index];
    if (!slot) return;

    setImageFormulaIntoCell_(sheet, item.imageUrl, slot.imageCell);

    slot.textCells.forEach(function(cellA1, valueIndex) {
      setCellOrMergedValue_(sheet, cellA1, item.values[valueIndex] || '');
    });
  });
}

写真の表示にはIMAGE関数、結合セルへの書き込みには結合セルの左上セルに安全に値を入れる方法を組み合わせると安定します。

複数ページで使う例

複数ページPDFでも、同じslotsを使い回せます。

function writePagedItems_(sheets, items) {
  const itemsPerPage = REPORT_CONFIG.slots.length;

  items.forEach(function(item, index) {
    const pageIndex = Math.floor(index / itemsPerPage);
    const slotIndex = index % itemsPerPage;
    const sheet = sheets[pageIndex];
    const slot = REPORT_CONFIG.slots[slotIndex];

    setImageFormulaIntoCell_(sheet, item.imageUrl, slot.imageCell);
    slot.textCells.forEach(function(cellA1, valueIndex) {
      setCellOrMergedValue_(sheet, cellA1, item.values[valueIndex] || '');
    });
  });
}

pageIndexで何ページ目か、slotIndexでページ内の何枠目かを決めます。この考え方は、テンプレートシートを複製して複数ページPDFを作る方法でも使えます。

NG例

処理本体にセル番地が散らばる形は避けます。

sheet.getRange('B2').setFormula(image1);
sheet.getRange('B3').setValue(value1);
sheet.getRange('D2').setFormula(image2);
sheet.getRange('D3').setValue(value2);

この書き方だと、テンプレート変更時に修正箇所を探しにくくなります。

チェックリスト

  • セル番地を設定オブジェクトに集約しているか
  • 処理本体にセル番地が散らばっていないか
  • 写真枠と入力欄の関係が配列で見えるか
  • 複数ページ時も同じslotsを再利用しているか
  • 記事やREADMEにセル配置表を載せているか

関連記事

まとめ

帳票テンプレートのセル配置は、処理本体ではなくslots配列へ集約しておくと、レイアウト変更や複数ページ化に強くなります。

写真付き報告書や点検票のように同じ枠が並ぶ帳票では、最初にslotsを作っておくと、後からの改良がかなり楽になります。

この技術で業務改善しませんか?

Excel VBA・GAS・Webアプリで業務の自動化ツールを開発しています。 「こんなことできる?」というご相談だけでもお気軽にどうぞ。

無料相談はこちら →