GASでスプレッドシートの
見出し行・列を固定(フリーズ)する方法

行数の多い表を下にスクロールすると、見出し行が消えて「この列は何のデータだっけ?」と迷子になります。見出し行の固定(フリーズ=スクロールしても上部の行を貼り付けておく機能)を使えば解決します。GASのsetFrozenRows()を使えば、メニュー操作なしでコードから固定でき、複数シートへの一括適用やテンプレート作成の自動化にも組み込めます。行・列の固定を実装コードで解説します。

|対象: GAS / スプレッドシート / 見出し固定

Table of Contents

行の固定(フリーズ)とは

行の固定(フリーズ)とは、スプレッドシート上部の行を画面に貼り付けて、下にスクロールしても常に見えるようにする機能です。見出し行を固定しておくと、100行目を見ていても各列が何のデータかが一目でわかります。手動ではメニューの「表示 → 固定」で設定しますが、GASからはsetFrozenRows()で同じことをコードで行えます。

固定は行(上部)と列(左端)の両方でき、それぞれ独立しています。大切なのは、これは表示上の設定だという点です。セルの値や行番号は変わらないので、データの読み書きや並べ替えには影響しません。

見出しが常に見える

何行スクロールしても列の意味を見失わない

メニュー操作が不要

テンプレート複製時などにコードで自動設定できる

行と列を独立して固定

上部の見出し行と左端の見出し列を組み合わせられる

データには非干渉

値・数式・行番号は変わらず表示だけが変わる

見出し行を固定する(setFrozenRows)

行を固定するのはSheet.setFrozenRows(行数)です。引数は「固定する行番号」ではなく「上から何行を固定するか」という行数である点に注意してください。見出しが1行ならsetFrozenRows(1)です。

function freezeHeaderRow() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("売上一覧");

  // 上から1行目までを固定する(引数は「固定する行数」)
  // これで下にスクロールしても見出し行が常に見える
  sheet.setFrozenRows(1);
}

見出しが「大分類・小分類」のように2段組みならsetFrozenRows(2)のように行数を増やします。設定できる上限はそのシートの行数までで、極端に大きい値を指定するとエラーになります。

見出し列を固定する(setFrozenColumns)

左端の列を固定するのはSheet.setFrozenColumns(列数)です。横に長い表で、右へスクロールしても品名や氏名などのキー列を見えたままにできます。行と列は独立して働くので、両方を呼べば左上のブロックが交差して固定されます。

function freezeFirstColumn() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("売上一覧");

  // 左からA列(1列)を固定する
  // 横に長い表で、右へスクロールしても品名や氏名が見える
  sheet.setFrozenColumns(1);

  // 行と列は独立して固定できる。両方呼べば左上が交差して固定される
  sheet.setFrozenRows(1);   // 見出し行
  sheet.setFrozenColumns(1); // 見出し列
}

縦にも横にも大きい表(月別の実績を横に並べた集計表など)では、上部の見出し行と左端の項目列を両方固定すると、どこを見ていても「どの項目・どの月か」を見失わずに済みます。

現在の固定状態を調べる(getFrozenRows)

いま何行・何列が固定されているかはgetFrozenRows()getFrozenColumns()で取得できます。固定がなければ0が返ります。

function checkFrozen() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("売上一覧");

  // 現在いくつ固定されているかを取得する
  const rows = sheet.getFrozenRows();       // 例: 1
  const cols = sheet.getFrozenColumns();    // 例: 0

  Logger.log("固定行数: " + rows);   // 固定なしなら 0
  Logger.log("固定列数: " + cols);

  // すでに固定済みかどうかで処理を分けたいときに使える
  if (sheet.getFrozenRows() === 0) {
    sheet.setFrozenRows(1);
  }
}

「まだ固定されていなければ固定する」という判定を入れておくと、定期処理で何度実行しても余計な書き込みが発生せず、無駄が減ります。

固定を解除する(0を指定)

固定を外すにはsetFrozenRows(0)を呼びます。列はsetFrozenColumns(0)です。0は「固定する行(列)が0個」という意味なので、すべての固定が外れます。

function unfreezeAll() {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("売上一覧");

  // 0 を指定すると固定が解除される
  sheet.setFrozenRows(0);    // 行の固定を解除
  sheet.setFrozenColumns(0); // 列の固定を解除
}

レイアウトを作り直すときに、いったん固定をリセットしてから設定し直すと、意図しない固定が残るのを防げます。

複数シートにまとめて見出しを固定する

月別・部門別にシートが分かれているブックでは、getSheets()で全シートを取り出し、ループで一括固定すると手作業がなくなります。空シートのスキップと、固定済みシートを触らない判定を入れておくと安全です。

// すべてのシートの1行目をまとめて固定する
function freezeHeaderOnAllSheets() {
  const ss = SpreadsheetApp.getActive();
  const sheets = ss.getSheets();

  sheets.forEach((sheet) => {
    // データが1行もない空シートは固定しても意味がないのでスキップ
    if (sheet.getLastRow() < 1) return;

    // すでに固定済みなら触らない(無駄な書き込みを避ける)
    if (sheet.getFrozenRows() === 0) {
      sheet.setFrozenRows(1);
    }
  });
}

新しいシートを追加するたびに手動で固定するのは忘れがちです。この関数をカスタムメニューや定期トリガーから呼べるようにしておくと、見た目の統一を自動で保てます。

テンプレート作成と実務での注意点

固定がもっとも活きるのは、テンプレートを複製して新しいシートを作る自動化です。複製したシートに対して見出し行・列を固定し、ついでに見出しを太字にしておけば、すぐ使える状態でシートが用意されます。

// テンプレートを複製して、見出しを整えつつ固定まで自動化する
function createMonthlySheet() {
  const ss = SpreadsheetApp.getActive();
  const template = ss.getSheetByName("テンプレート");

  // 当月のシート名(例: 2026-07)
  const name = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy-MM");
  if (ss.getSheetByName(name)) return; // 二重作成を防ぐ

  // テンプレートを複製してリネーム
  const sheet = template.copyTo(ss).setName(name);

  // 見出し行を1行、見出し列を1列固定してすぐ使える状態にする
  sheet.setFrozenRows(1);
  sheet.setFrozenColumns(1);

  // 見出し行を目立たせる(任意)
  sheet.getRange("1:1").setFontWeight("bold").setBackground("#F0F0F0");
}

1. 引数は「行番号」ではなく「行数」

もっとも間違えやすいのがここです。setFrozenRows(1)は「1行目という位置」ではなく「上から1行分を固定」の意味です。2行固定したいならsetFrozenRows(2)です。

2. 固定はシート単位

固定の設定はSheet(タブ)ごとに持ちます。スプレッドシート全体に一度で設定する方法はないので、複数シートに適用したいときは前章のようにループで回します。

3. 見出し固定と並べ替え・フィルタは好相性

見出し行を固定しておくと、データを並べ替えても見出しは動きません。フィルタと組み合わせれば、大きな表でも「見出しを見ながら絞り込む」操作が快適になります。固定は表示だけの設定なので、これらの機能と競合しません。

まとめ

見出しの固定は、setFrozenRows(行数) で行を、setFrozenColumns(列数) で列を固定するのが基本です。引数は行番号ではなく「固定する行数・列数」で、0を渡せば解除できます。getFrozenRows/getFrozenColumnsで現在の状態を確認できるので、「未固定なら固定する」判定で無駄な書き込みを避けられます。固定は表示だけの設定でデータには影響しないため、並べ替えやフィルタとも安全に併用できます。テンプレート複製や複数シートへの一括適用に組み込めば、見やすい表を自動で用意できます。

よくある質問

スプレッドシートの上部の行を画面に貼り付けて、下にスクロールしても常に見えるようにする機能です。見出し行を固定しておくと、何行目を見ていても各列が何のデータか一目でわかります。GASからは setFrozenRows(行数) で設定でき、メニューの「表示 → 固定」と同じことをコードで行えます。

上から1行目までを固定する、という意味です。引数は「固定する行番号」ではなく「固定する行数」です。setFrozenRows(2) なら1〜2行目の2行が固定されます。見出しが1行だけなら setFrozenRows(1)、見出しが2段組みなら setFrozenRows(2) を指定します。

setFrozenRows(0) を呼ぶと行の固定が解除されます。列は setFrozenColumns(0) です。0は「固定する行(列)が0個」という意味なので、すべての固定が外れます。テンプレートを作り直すときなど、いったん固定をリセットしたい場面で使います。

できます。setFrozenRows と setFrozenColumns は独立して働くので、両方呼べば左上のブロック(例: 1行目とA列)が交差して固定されます。左端に品名や氏名、上部に項目見出しがある表で、縦にも横にもスクロールする大きなシートに向いています。

影響しません。固定はあくまで表示上の設定で、セルの値・数式・行番号は変わりません。getValues() や setValues() の対象範囲も固定の有無とは無関係です。並べ替え(sort)をするときも、見出し行を固定していれば見出しは並べ替え対象から自然に外れて扱いやすくなります。

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

見出しの固定のような細かな見た目の整えから、帳票の自動生成・PDF出力・Gmail通知まで、日々の業務を自動化するGAS開発をご相談いただけます。

GAS Webシステム開発を見る