見た目はキレイ、データはキタナイ– 結合セル問題をワンクリックで解決する
結合セル、見た目はキレイなんだけど…
データ操作では、色々やらかしてくれますよね。
例えば、セル結合のあるA, B列で「並べ替え」を実行すると、「問題が発生しました。垂直方向の結合が含まれている範囲を並べ替えることはできません」と怒られます。
他にも、
コピー&ペーストがしづらい
ピボットテーブルに向かない
行や列の追加・削除でレイアウトが崩れやすい
などなど。
データを再利用するための ” 結合セル解除とデータ補填作業 " は、作業効率下げ下げです。
GASで結合セル問題をワンクリック解決
ということで、
「結合解除 + 穴埋め」をGASで一瞬で片付けちゃいましょう!
セル解除と同時に、空になったセルに元の値が自動で入るので、穴埋め作業ゼロです!
コード.gs
// コード.gs
/**
* 結合セルを一括解除して空セルを上の値で穴埋めする
* アクティブシートの結合を検出 → 解除 → 穴埋め
*/
function unmergeFill() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ui = SpreadsheetApp.getUi();
const sheet = ss.getActiveSheet();
const dataRange = sheet.getDataRange();
const mergedRanges = dataRange.getMergedRanges();
if (mergedRanges.length === 0) {
ui.alert('結合セルは見つかりませんでした。');
return;
}
let fillCount = 0;
for (let i = 0; i < mergedRanges.length; i++) {
const merged = mergedRanges[i];
const topValue = merged.getCell(1, 1).getValue();
merged.breakApart();
const numRows = merged.getNumRows();
const numCols = merged.getNumColumns();
for (let r = 1; r <= numRows; r++) {
for (let c = 1; c <= numCols; c++) {
if (r === 1 && c === 1) continue;
merged.getCell(r, c).setValue(topValue);
fillCount++;
}
}
}
SpreadsheetApp.flush();
ui.alert(
'完了しました。\n\n' +
'結合セル: ' + mergedRanges.length + ' 箇所を解除\n' +
'穴埋め: ' + fillCount + ' セルに値をコピー'
);
}
a
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('自動ボタン')
.addItem('結合セル解除+穴埋め', 'unmergeFill')
.addToUi();
}使い方
① 新規または既存のスプレッドシートを用意
結合セルがあるスプレッドシートを開きます。
新しいスプレッドシートで試してから本番に導入するのがおすすめです。
※新しいスプレッドシートを用意した場合は、画像「結合セルの例」のようなシートを作成する必要があります。
② 拡張機能 → Apps Script のコード.gsに上記コードを貼り付けて保存
③ スプレッドシートをリロード
メニューバーに「自動ボタン」が追加されます。
④ 結合セルがあるシートを開いた状態で「自動ボタン」→「結合セル解除+穴埋め」を実行
初めて実行すると承認ダイアログが表示されます。手順は第1回と同じです。
実行すると、すべての結合が解除され、空白になったセルには元の結合セルの値が自動で入ります。
ワンポイント・レッスン
getMergedRanges() — 結合セルを見つけて操作する
コードの中にあるこの部分を見てください。
const mergedRanges = dataRange.getMergedRanges();GASでは、結合セルの操作に専用のメソッドが用意されています。
-
`getMergedRanges()` — 範囲内の結合セルをすべて取得する。結果は Range の配列
-
`breakApart()` — 結合を解除する
-
`getCell(行, 列)` — 範囲内の特定のセルを取得する(1始まり)
結合セル A2:A5(「営業1課」)の場合:
getMergedRanges() → [Range(A2:A5), ...] ← 結合を見つける
getCell(1, 1) → A2(「営業1課」) ← 左上の値を取得
breakApart() → A2:A5 の結合を解除 ← A3〜A5 は空白に
getCell(2, 1) → A3(空白) ← ここに値を書き込む`getMergedRanges()` で結合を見つけ、`breakApart()` で解除し、`getCell()` で穴埋め先を指定する。この3つの組み合わせが、結合セル操作の基本パターンです。
まとめ
結合セルの解除と穴埋めをワンクリックで同時に実行。
解除後の空白セルには元の値が自動で入るので、手作業のコピペはゼロ。
結合だらけのシートでも、実行後はフィルタ・並び替え・VLOOKUPなどがすべて正常に使えるデータ構造に変わります。
バックアップ+全シート一括処理
確かにデータ操作には厄介モノの結合セルだけど、操作が終われば、やっぱり見た目がキレイな方がいいよね。
それなら、拡張コードで、結合解除と穴埋め前の状態をバックアップで残しましょう。
5枚、10枚と結合だらけのシートがあると、同じ操作の繰り返しが面倒なので、全シート一括処理も出来るようにしましょう。
さらに、どこが結合されているかを解除前に確認できる罫線ハイライトも付けましょう。
一目で結合セルがわかる!
この記事の続きはnoteで公開しています。
