はじめに
Google Apps ScriptでGoogleスプレッドシートを帳票テンプレートとして使う場合、写真枠、入力欄、明細欄などのセル番地をコード内に直接書きたくなります。
ただ、B2、D2、B7のようなセル番地が処理本体に散らばると、帳票レイアウトを少し変えただけで修正漏れが起きやすくなります。
このような繰り返し配置は、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.imageCellとslot.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を作っておくと、後からの改良がかなり楽になります。
