GASでスプレッドシートに
交互の背景色(バンディング)を設定する方法

表を1行おきに色分けする「バンディング」applyRowBanding()を使えば、手作業で塗るより速く、行が増減しても崩れない見やすい表をコードで作れます。テーマ配色・色の自作・ヘッダー行の色分け・重複防止まで解説します。

|対象: GAS / スプレッドシート / 書式設定

Table of Contents

バンディングとは(条件付き書式との違い)

バンディング(banding)とは、表の行を1行おきに色分けして縞模様にする機能です。行が多い表でも視線が横にずれにくく、格段に読みやすくなります。スプレッドシートの「表示形式 › 交互の背景色」に相当する機能を、GASではRange.applyRowBanding()の1行で設定できます。

似た見た目は条件付き書式(MOD関数など)でも作れますが、記述が複雑です。単純な縞模様ならバンディングが最短で、行の増減にも自動で追従します。値に応じた色分けなど複雑な条件は条件付き書式、と使い分けるのがおすすめです。

バンディングが得意

1行おきの単純な縞模様。行が増減しても自動で追従する。設定も削除もコードが短い

条件付き書式が得意

「金額がマイナスなら赤」など、セルの値に応じた色分け。カラースケールなど複雑な表現

applyRowBandingで縞模様を付ける基本

まずは一番シンプルな形です。色分けしたい範囲(Range)に対してapplyRowBanding()を呼ぶだけで、標準テーマの縞模様が付きます。何度実行してもエラーにならないよう、先に既存のバンディングを削除しておくのがコツです。

function applyBanding() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("売上データ");
  const range = sheet.getDataRange(); // 値が入っている範囲全体

  // 既存のバンディングがあれば消してから付け直す(重複エラー対策)
  range.getBandings().forEach((banding) => banding.remove());

  // これだけで1行おきの縞模様が付く
  range.applyRowBanding();
}

getDataRange()は値が入っている範囲を自動で返すため、行数を数える必要がありません。まずはこの形で挙動を確認しましょう。

テーマ(BandingTheme)で配色を選ぶ

SpreadsheetApp.BandingThemeには、あらかじめ用意された配色(テーマ)があります。第2引数をtrueにするとヘッダー行が濃い色になり、見出しと本体を区別できます。

function applyThemeBanding() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("売上データ");
  const range = sheet.getDataRange();

  range.getBandings().forEach((b) => b.remove());

  // 第1引数: テーマ, 第2引数: ヘッダー行を濃い色にするか, 第3引数: フッター行を付けるか
  range.applyRowBanding(SpreadsheetApp.BandingTheme.BLUE, true, false);
}

// 使えるテーマの例:
// LIGHT_GREY / GREY / BROWN / LIGHT_GREEN / GREEN /
// CYAN / BLUE / TEAL / ORANGE / INDIGO / PINK / YELLOW

色を自分で指定する

テーマの色が好みに合わないときは、applyRowBanding()が返すBandingオブジェクトに対して色を上書きします。奇数行・偶数行・ヘッダー行をそれぞれ16進数のカラーコードで指定できます。コーポレートカラーに合わせた表を作りたいときに便利です。

function applyCustomBanding() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("売上データ");
  const range = sheet.getDataRange();

  range.getBandings().forEach((b) => b.remove());

  // applyRowBanding は Banding オブジェクトを返す
  const banding = range.applyRowBanding();

  banding
    .setHeaderRowColor("#37474f") // ヘッダー行(濃紺グレー)
    .setFirstRowColor("#ffffff")  // 奇数行(白)
    .setSecondRowColor("#eceff1"); // 偶数行(薄いグレー)
}

ヘッダー行・フッター行を色分けする

合計行がある集計表では、フッター行(最終行)も色分けすると数字が締まって見えます。applyRowBanding()の第3引数をtrueにすると最終行がフッター扱いになり、setFooterRowColor()で色を指定できます。

function applyHeaderFooterBanding() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("月次集計");
  const range = sheet.getDataRange();

  range.getBandings().forEach((b) => b.remove());

  // ヘッダーもフッターも付ける(合計行がある表に便利)
  const banding = range.applyRowBanding(
    SpreadsheetApp.BandingTheme.TEAL,
    true, // 1行目をヘッダー扱い
    true  // 最終行をフッター扱い
  );

  // フッター(合計行)だけ別の色にする
  banding.setFooterRowColor("#004d40");
}

列方向(縦の縞模様)にする

項目が横に並ぶ表では、列ごとに色を変える縦の縞模様が読みやすい場合があります。その場合はapplyColumnBanding()を使います。引数の考え方は行方向とほぼ同じで、第2引数で先頭列をヘッダー扱いにできます。

function applyColumnBanding() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("担当表");
  const range = sheet.getDataRange();

  range.getBandings().forEach((b) => b.remove());

  // 列方向(縦の縞模様)。第2引数で先頭列をヘッダー扱いにできる
  range.applyColumnBanding(SpreadsheetApp.BandingTheme.LIGHT_GREEN, true, false);
}

行が増えるシートで貼り直す・重複を防ぐ

フォーム回答やログのように行が増え続けるシートでは、設定済みの範囲より外に増えた行に縞模様が付きません。そこでgetLastRow()で最新の最終行を取り直し、既存バンディングを削除してから付け直します。getBandings()で既存を消してから適用する流れにしておけば、重複によるエラーも防げます。定期トリガーで毎日回すと運用が楽になります。

function refreshBandingForLog() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("受付ログ");
  const lastRow = sheet.getLastRow();
  const lastCol = sheet.getLastColumn();
  if (lastRow < 2) return; // ヘッダーだけなら何もしない

  // 現在データが入っている範囲を取り直す
  const range = sheet.getRange(1, 1, lastRow, lastCol);

  // 既存バンディングをすべて削除してから最新範囲に付け直す
  sheet.getBandings().forEach((b) => b.remove());
  range.applyRowBanding(SpreadsheetApp.BandingTheme.LIGHT_GREY, true, false);
}

// 毎日1回、行が増えたシートの縞模様を貼り直すトリガー
function createBandingTrigger() {
  ScriptApp.newTrigger("refreshBandingForLog")
    .timeBased()
    .everyDays(1)
    .atHour(6)
    .create();
}

実務での注意点

1. 範囲が重なると applyRowBanding はエラーになる

すでにバンディングがある範囲と重なる形で適用しようとするとエラーになります。実行前に必ずgetBandings()で既存を取得し、remove()で削除する「消してから付ける」形にしておきましょう。

2. セルの背景色(setBackground)とは別物

バンディングはセルの背景色とは独立したレイヤーです。値に応じた個別の色付けが必要な場合は、バンディングではなくsetBackground()や条件付き書式を併用します。両者を重ねると意図しない見た目になることがあるので注意します。

3. カラーコードは #RRGGBB 形式で指定する

setFirstRowColorなどの色指定は"#eceff1"のような16進数カラーコードで渡します。奇数行と偶数行のコントラストを付けすぎると逆に読みにくくなるため、薄い色同士で差をつけるのがコツです。

まとめ

GASのバンディングは、applyRowBanding()の1行で見やすい縞模様の表を作れる手軽な機能です。テーマで手早く配色し、必要ならsetFirstRowColor()などで色を自作、ヘッダー・フッターの色分けや列方向にも対応できます。行が増えるシートでは「既存を消してから付け直す」定期処理にしておけば、常にきれいな見た目を保てます。

よくある質問

バンディングは「1行おきに色を変える」ことに特化した専用機能で、applyRowBanding()の1行で設定できます。行が増減しても縞模様が自動で追従します。条件付き書式(newConditionalFormatRule)はMOD関数などを使えば同じ見た目を作れますが、記述が複雑になります。単純な縞模様ならバンディング、値に応じた色分けなど複雑な条件なら条件付き書式が向いています。

同じ範囲や重なる範囲にすでにバンディングが設定されていると、applyRowBanding()はエラーになります。設定し直す前に、range.getBandings()で既存のバンディングを取得し、それぞれremove()で削除してから適用してください。この「消してから付ける」パターンにしておくと、何度実行しても安全です。

できます。applyRowBanding()が返すBandingオブジェクトに対して、setFirstRowColor()(奇数行)、setSecondRowColor()(偶数行)、setHeaderRowColor()(ヘッダー行)で16進数のカラーコードを指定します。テーマ(SpreadsheetApp.BandingTheme)をそのまま使うか、テーマを適用した後で個別に色を上書きするかのどちらでも設定できます。

設定した範囲の中であれば自動で追従します。ただし範囲の外に新しい行が増えた場合は縞模様が付きません。フォームやログで行が増え続けるシートでは、getLastRow()で最終行を取得し直し、既存バンディングを削除してから最新の範囲に付け直す関数を定期トリガーで回すのが確実です。

できます。applyRowBanding()の代わりにapplyColumnBanding()を使うと、列ごとに交互の色が付きます。引数の指定方法はほぼ同じで、テーマ・先頭列をヘッダー扱いにするか・末尾列をフッター扱いにするかを渡せます。項目が横に並ぶ集計表などで見やすくなります。

GAS開発・業務Webシステムを
相談する。

見やすい帳票・ダッシュボードの整形から、フォーム連携・帳票出力・Gmail自動化まで、日々の業務を自動化するGAS開発をご相談いただけます。

GAS Webシステム開発を見る