GASを使って色付きセルをカウントする方法

前回の記事では、フィルタ機能とSUBTOTAL関数を使って「手軽に色ごとのセル数をカウントする方法」をご紹介しました。
ですが、フィルタ機能では1つの色しかカウントできず、毎回手動で切り替える必要があります。
そこで今回は、GASを使って複数の色のセルを自動でカウントする方法をご紹介します。

完成イメージ

例:
- B列の色付きセルをカウント対象
- E列 → 色付きセルの背景色を表示
- F列 → 各色のセル数を自動カウント
GASの実行手順

スプレッドシート内で、カウントしたい色付きセルがあるシートを開きます。
今回のスクリプトでは、現在開いているシートを対象にカウントを実行します。
(今回の例では対象範囲をB4:Bに設定)

Googleスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックしてGASエディタを開きます。

function myFunction(){
}
が最初から入っているため、消去して以下のスクリプトを貼り付けます。
色付きセルをカウントするスクリプト
// 背景色ごとのセル数をカウントする関数(透明と白色を除外)
function countCellsByColor(sheetName, rangeAddress) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var range = sheet.getRange(rangeAddress);
var colors = {};
var bgColors = range.getBackgrounds();
for (var i = 0; i < bgColors.length; i++) {
for (var j = 0; j < bgColors[i].length; j++) {
var color = bgColors[i][j];
// 透明セル(デフォルトの背景)と白色(#ffffff)はスキップ
if (color === "" || color.toLowerCase() === "#ffffff") {
continue;
}
colors[color] = (colors[color] || 0) + 1;
}
}
return colors;
}
// カウント結果をスプレッドシートに出力する関数(E列に背景色、F列にカウント)
function outputColorCountsCustom() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// **変更可能な設定**
var targetRangeAddress = "B4:B"; // カウント対象の範囲
var outputColumnE = 5; // 色の出力先(E列)
var outputColumnF = 6; // カウントの出力先(F列)
var headerRow = 3; // ヘッダー行(変更可)
var dataStartRow = headerRow + 1; // データ出力開始行
var colorCounts = countCellsByColor(sheet.getName(), targetRangeAddress);
if (Object.keys(colorCounts).length === 0) {
Logger.log("No color data found.");
return;
}
var outputData = [];
var backgroundColors = [];
// **ヘッダーを設定**
sheet.getRange(headerRow, outputColumnE).setValue("色");
sheet.getRange(headerRow, outputColumnF).setValue("カウント");
for (const [color, count] of Object.entries(colorCounts)) {
outputData.push([count]); // カウントデータ
backgroundColors.push([color]); // 背景色
}
var rowCount = outputData.length;
var outputRangeValues = sheet.getRange(dataStartRow, outputColumnF, rowCount, 1);
var outputRangeColors = sheet.getRange(dataStartRow, outputColumnE, rowCount, 1);
outputRangeValues.setValues(outputData); // カウントを設定
outputRangeColors.setBackgrounds(backgroundColors); // 背景色を設定
}
スクリプトの説明
今回のスクリプトは以下の2つの関数で構成されています。
関数①countCellsByColor()
– 背景色ごとのセル数をカウント
指定したシートと範囲の中から、各背景色ごとのセル数を集計し、オブジェクト形式で返します。
透明セル(デフォルトの背景)と白色(#ffffff)はカウント対象外です。
- 指定のシートと範囲を取得
-
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); var range = sheet.getRange(rangeAddress);
getSheetByName(sheetName)
で指定のシートを取得します。getRange(rangeAddress)
で対象の範囲を取得します。
- セルの背景色を取得
-
var bgColors = range.getBackgrounds();
getBackgrounds()
を使用し、セルの背景色の配列を取得します。
- セルごとの背景色をチェック
-
for (var i = 0; i < bgColors.length; i++) { for (var j = 0; j < bgColors[i].length; j++) { var color = bgColors[i][j]; // 透明セル(デフォルトの背景)と白色(#ffffff)はスキップ if (color === "" || color.toLowerCase() === "#ffffff") { continue; } colors[color] = (colors[color] || 0) + 1; } }
- 2次元配列をループ処理で走査
- 透明セル(
""
)と白色セル(#ffffff
)はスキップします。 - 既にカウントされた色なら
+1
、初回なら1
をセットします。
- 背景色ごとのカウントをオブジェクトとして返す
-
return colors;
- 例えば、
{ "#ff0000": 3, "#00ff00": 5, "#ffff00": 2 }
のようなオブジェクトを返します。
- 例えば、
関数②outputColorCountsCustom()
– カウント結果をスプレッドシートに出力
countCellsByColor()
の結果を取得し、E列(背景色)と F列(カウント)に出力します。
- アクティブシートを取得
-
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
getActiveSheet()
を使用し、現在開いているシートを取得します。
- カウント対象の範囲と出力先を設定
-
var targetRangeAddress = "B4:B"; // カウント対象の範囲 var outputColumnE = 5; // 色の出力先(E列) var outputColumnF = 6; // カウントの出力先(F列) var headerRow = 3; // ヘッダー行(変更可) var dataStartRow = headerRow + 1; // データ出力開始行
- B4:B の範囲をカウント対象に指定します。
- E列(5列目) に色を出力します。
- F列(6列目) にカウントを出力します。
- ヘッダーを3行目に設定データ出力開始は4行目(
headerRow + 1
)となります。
- カウントデータを取得
-
var colorCounts = countCellsByColor(sheet.getName(), targetRangeAddress); if (Object.keys(colorCounts).length === 0) { Logger.log("No color data found."); return; }
countCellsByColor()
を実行し、色ごとのセル数を取得- カウント結果が空なら処理を終了
- ヘッダーを追加
-
sheet.getRange(headerRow, outputColumnE).setValue("色"); sheet.getRange(headerRow, outputColumnF).setValue("カウント");
- E3 に「色」、F3 に「カウント」 をセットします。
- データをリストに格納
-
for (const [color, count] of Object.entries(colorCounts)) { outputData.push([count]); // F列(カウント) backgroundColors.push([color]); // E列(背景色) }
Object.entries(colorCounts)
で{ "#ff0000": 3, "#00ff00": 5 }
のようなデータを配列化します。- 背景色のリスト
backgroundColors
とカウント数のリストoutputData
に追加します。
- E列とF列にデータを出力
-
var rowCount = outputData.length; var outputRangeValues = sheet.getRange(dataStartRow, outputColumnF, rowCount, 1); var outputRangeColors = sheet.getRange(dataStartRow, outputColumnE, rowCount, 1); outputRangeValues.setValues(outputData); // F列にカウントを設定 outputRangeColors.setBackgrounds(backgroundColors); // E列に背景色を設定
- F列(6列目)にカウント結果を表示します。
- E列(5列目)に 各色の背景色を適用します。

スクリプトを書いたら、好きな名前を付けて保存します。
(例:「色付きセル_カウント」)

E列に背景色、F列にカウント数が表示されます。
カウント範囲を変更する場合
今回のスクリプトでは、
- B4:B の範囲をカウント対象
- E列(色)と F列(カウント数)に出力
となっているため、この範囲や出力先を変更する場合は、以下の部分を編集することで対応可能です。
カウント対象の範囲を変更する
カウントする列を B列以外に変更の場合、以下の部分を修正します。
var targetRangeAddress = "B4:B"; // カウント対象の範囲
- 例えば:
- A列を対象にする場合 →
getRange("A4:A100")
- D列を対象にする場合 →
getRange("D4:D100")
- D列の2行目から最終行までを対象にする場合 →
getRange("D2:D")
(最終行まで自動)
- A列を対象にする場合 →
カウント結果の出力先を変更する
デフォルトでは、E列(5列目)に色、F列(6列目)にカウント を出力しています。
この出力先を変更したい場合は、以下の部分を修正します。
var outputColumnE = 5; // 色の出力先(E列)
var outputColumnF = 6; // カウントの出力先(F列)
var headerRow = 3; // ヘッダー行(変更可)
- 例えば:
- G列(7列目)に色、H列(8列目)にカウントを出力する場合
var outputColumnE = 7; // 色の出力先(G列
var outputColumnF = 8; // カウントの出力先(H列) - 出力先を1行下げる(ヘッダー行4行目から出力)場合
var headerRow = 4; // ヘッダー行(変更可)
- G列(7列目)に色、H列(8列目)にカウントを出力する場合
まとめ
Google Apps Script (GAS) を使えば、色付きセルを各色ごとにカウント・可視化できます。
スクリプト内のカウント範囲や出力先を変更することで、柔軟な対応が可能です。
スプレッドシートの色分けデータをカウントする際にご活用ください。

弊社では、Google Apps Script(GAS)を活用した業務効率化のサポートを提供しております。
GASのカスタマイズやエラー対応にお困りの際は、ぜひお気軽にご相談ください。
また、ITツールの導入支援やIT導入補助金の申請サポートも行っております。
貴方の業務改善を全力でサポートいたします。
コメント