GASでスプレッドシートの列幅・行の高さを
コードで自動調整する方法
シートを自動生成すると、列が狭くて文字が###で切れたり、行が窮屈で読みにくくなりがちです。setColumnWidthやautoResizeColumnsで、見やすいレイアウトをコードから一括で整える方法を解説します。
Table of Contents
なぜ列幅・行の高さをコードで整えるのか
GASでシートを新規作成したり、他のデータを差し込んだりすると、列幅は初期値のままです。 金額の桁が多い列で数字が###と省略されたり、長い備考が隣のセルにはみ出したりして、そのままでは読みにくくなります。 毎回手作業で列の境界をドラッグして整えるのは非効率です。レイアウトの調整までコードに含めておけば、 いつ実行しても同じ見やすい表が完成します。
帳票・レポートの自動生成
毎月作り直すシートで、列幅までそろえて配布できる状態にする
データの差し込み後
外部データを流し込んだあと、内容に合わせて自動で幅を広げる
テンプレートの初期化
空のシートに見出しと列幅をセットし、入力用のひな型を用意する
印刷・PDF出力の前
はみ出しや切れを防ぎ、A4に収まる読みやすい体裁に整える
1列・1行の幅と高さを指定する
基本はsetColumnWidth(列番号, 幅)とsetRowHeight(行番号, 高さ)の2つです。どちらも単位はピクセル(px)で、列番号・行番号は1から始まります(A列=1、B列=2)。
function setSingleColumnWidth() {
const sheet = SpreadsheetApp.getActive().getSheetByName("台帳");
// B列(2列目)の幅を200ピクセルにする
sheet.setColumnWidth(2, 200);
// 3行目(行番号3)の高さを40ピクセルにする
sheet.setRowHeight(3, 40);
}これらは見た目の幅・高さだけを変えるメソッドです。セルの値・数式・背景色などのデータには一切影響しません。
複数列・複数行をまとめて設定する
連続した複数の列を同じ幅にそろえるならsetColumnWidths(開始列, 列数, 幅)が便利です。列ごとに幅を変えたいときは、列番号と幅の対応表を作って1列ずつ設定すると、あとで見返したときにわかりやすくなります。
function setMultipleColumnWidths() {
const sheet = SpreadsheetApp.getActive().getSheetByName("台帳");
// A列から3列分(A・B・C)をまとめて150ピクセルに
sheet.setColumnWidths(1, 3, 150);
// 列ごとに違う幅にしたいときは1列ずつ指定する
const widths = { 1: 60, 2: 220, 3: 120, 4: 100 }; // { 列番号: 幅 }
Object.keys(widths).forEach((col) => {
sheet.setColumnWidth(Number(col), widths[col]);
});
// 2行目から10行分の高さを28ピクセルにそろえる
sheet.setRowHeights(2, 10, 28);
}行も同様に、setRowHeights(開始行, 行数, 高さ)で複数行の高さを一度にそろえられます。
内容に合わせて自動調整する(autoResizeColumns)
一番手軽で実用的なのが自動調整です。autoResizeColumns(開始列, 列数)を使うと、その列の一番長いデータに合わせて幅を自動で広げます。 手動で「列の境界線をダブルクリック」する操作を、コードで一括実行するイメージです。
function autoFitColumns() {
const sheet = SpreadsheetApp.getActive().getSheetByName("台帳");
const lastCol = sheet.getLastColumn();
// 1列目から最終列まで、内容に合わせて幅を自動調整
sheet.autoResizeColumns(1, lastCol);
// 特定の1列だけ自動調整したいとき
sheet.autoResizeColumn(2);
}1列だけならautoResizeColumn(列番号)(末尾sなし)を使います。データを書き込んだ直後に呼ぶことで、常に中身にぴったり合った幅を保てます。
行の高さと折り返し(setWrap)
行には、列のautoResizeColumnに相当する「内容に合わせて高さを広げる」専用メソッドがありません。 代わりにsetWrap(true)(折り返し)を有効にすると、文字量に応じて行の高さが自動で広がります。長文の備考欄などで役立ちます。
function wrapAndFitRows() {
const sheet = SpreadsheetApp.getActive().getSheetByName("台帳");
const lastRow = sheet.getLastRow();
// B列(備考など長文が入る列)を折り返し表示にする
// 折り返しをONにすると、行の高さは文字量に応じて自動で広がる
sheet.getRange(2, 2, lastRow - 1, 1).setWrap(true);
// 折り返しではなく「はみ出しを切る」にしたいとき
// sheet.getRange(2, 2, lastRow - 1, 1)
// .setWrapStrategy(SpreadsheetApp.WrapStrategy.CLIP);
}折り返さずにはみ出した文字を隠したい場合は、setWrapStrategy(SpreadsheetApp.WrapStrategy.CLIP)を使います。用途に応じて折り返し(WRAP)・切り取り(CLIP)・はみ出し(OVERFLOW)を選べます。
現在の幅を取得して保存・復元する
印刷用に一時的に列幅を変え、あとで元に戻したい場面もあります。getColumnWidth(列番号)で現在の幅(px)を取得できるので、変更前に控えておけば、いつでも復元できます。
// 現在の列幅を控えてから一時的に変更し、あとで元に戻す
function saveColumnWidths(sheet) {
const widths = [];
const lastCol = sheet.getLastColumn();
for (let col = 1; col <= lastCol; col++) {
widths.push(sheet.getColumnWidth(col)); // 各列の現在の幅(px)
}
return widths;
}
function restoreColumnWidths(sheet, widths) {
widths.forEach((width, i) => {
sheet.setColumnWidth(i + 1, width);
});
}行の高さも同様にgetRowHeight(行番号)で取得できます。見出しと幅をひとまとめに定義しておくと、テンプレートの初期化コードが読みやすくなります。
function applyTableLayout() {
const sheet = SpreadsheetApp.getActive().getSheetByName("請求一覧");
// レイアウト定義(見出しと幅をセットで管理すると見通しが良い)
const layout = [
{ header: "No", width: 50 },
{ header: "取引先", width: 220 },
{ header: "件名", width: 260 },
{ header: "金額", width: 110 },
{ header: "状態", width: 90 },
];
// 見出しを書き込みつつ列幅を設定
layout.forEach((col, i) => {
sheet.getRange(1, i + 1).setValue(col.header);
sheet.setColumnWidth(i + 1, col.width);
});
// ヘッダー行を少し高くして見やすくする
sheet.setRowHeight(1, 36);
sheet.setFrozenRows(1); // ついでにヘッダーを固定
}実務での注意点
1. 単位はピクセル、番号は1から
幅・高さの単位はフォントのptではなくピクセルです。また列番号・行番号は0ではなく1から始まります。A列は1、B列は2です。getValuesの配列インデックス(0始まり)と混同しやすいので注意しましょう。
2. 「幅0」と「非表示」は別物
setColumnWidthには最小幅の制約があり、完全に0にはできません。列を隠したいときはhideColumns(列番号)を使い、showColumnsで元に戻します。
3. 大量の列を1列ずつ動かすと遅い
幅の指定はスプレッドシートへの書き込み操作です。数十列を1列ずつループで設定すると時間がかかります。同じ幅にそろえる範囲はsetColumnWidthsで一括指定し、呼び出し回数を減らすと安定します。
まとめ
列幅・行の高さの調整は、setColumnWidth/setRowHeightで手動指定、setColumnWidths/setRowHeightsで一括指定、autoResizeColumnsで内容に合わせた自動調整という3つを使い分けるのが基本です。 長文セルはsetWrapで折り返せば行の高さも自動で整います。データを書き込む処理の最後にレイアウト調整を1関数まとめておけば、いつ実行しても読みやすい表が仕上がります。
よくある質問
ピクセル(px)です。setColumnWidth(2, 200) と書くと、B列の幅が200ピクセルになります。フォントサイズ(pt)ではないので注意してください。標準の列幅はおおむね100ピクセル前後です。
できます。autoResizeColumn(列番号) または autoResizeColumns(開始列, 列数) を使うと、その列に入っている一番長いデータに合わせて幅を自動で広げてくれます。手動で「列の境界をダブルクリック」する操作をコードで行うイメージです。
列の autoResizeColumn に相当する行版のメソッドはありません。行は setWrap(true) で折り返しを有効にすると、文字量に応じて高さが自動的に広がります。特定の高さに固定したい場合は setRowHeight(行番号, 高さ) を使います。
消えません。setColumnWidth や setRowHeight は見た目の幅・高さだけを変えるメソッドで、セルの値・数式・背景色などには一切影響しません。安心して実行できます。
違います。setColumnWidth では最小幅の制約があり、完全な0にはできません。列を隠したい場合は hideColumns(列番号) を使ってください。非表示にした列は showColumns で元に戻せ、幅の情報も保持されます。
GAS開発・業務Webシステムを
相談する。
列幅の自動調整だけでなく、帳票の自動生成・PDF出力・Gmail通知など、日々の業務を自動化するGAS開発をご相談いただけます。