GASでスプレッドシートの色付きセルの値を合計する方法

前回の記事では、GASを使って色付きセルの数をカウントする方法を紹介しました。

今回は、それに続いて色付きセルの値を合計する方法をご紹介します。

スプレッドシートには 「特定の背景色のセルだけを合計する関数」 はありませんが、GASを活用することで色ごとの値を合計できます。

目次

完成イメージ

例:

  • B列の色付きセルを計算対象
  • E列 → 色付きセルの背景色を表示
  • F列 → 各色のセルの合計を表示

GASの実行手順

STEP
色付きセルのあるシートを開く

スプレッドシート内で、色付きセルがあるシートを開きます。

今回のスクリプトでは、現在開いているシートを対象に色付きセルの合計を算出します。

STEP
GASエディタを開く

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

STEP
スクリプトの作成

function myFunction(){

}

が最初から入っているため、消去して以下のスクリプトを貼り付けます。

色付きセルをカウントするスクリプト

function sumValuesByColor(sheetName, rangeAddress, valueRangeAddress) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  var colorRange = sheet.getRange(rangeAddress);
  var valueRange = sheet.getRange(valueRangeAddress);
  
  var colors = {};
  var bgColors = colorRange.getBackgrounds();
  var values = valueRange.getValues();

  for (var i = 0; i < bgColors.length; i++) {
    for (var j = 0; j < bgColors[i].length; j++) {
      var color = bgColors[i][j];
      var value = values[i][j];

      // 透明セル(デフォルトの背景)と白色(#ffffff)はスキップ
      if (color === "" || color.toLowerCase() === "#ffffff") {
        continue;
      }

      // 数値セルのみ合計
      if (typeof value === "number") {
        colors[color] = (colors[color] || 0) + value;
      }
    }
  }

  return colors;
}

function outputColorSums() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var colorRangeAddress = "B2:B"; // 色判定の範囲
  var valueRangeAddress = "B2:B"; // 数値データの範囲
  var outputColumnE = 5; // 色の出力先(E列)
  var outputColumnF = 6; // 合計の出力先(F列)
  var headerRow = 1; // ヘッダー行
  var dataStartRow = 2; // データ出力開始行

  var colorSums = sumValuesByColor(sheet.getName(), colorRangeAddress, valueRangeAddress);
  if (Object.keys(colorSums).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, sum] of Object.entries(colorSums)) {
    outputData.push([sum]);
    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);
}
スクリプトの説明

今回のスクリプトは、スプレッドシート内の背景色ごとのセルに入っている数値を合計し、指定した列に結果を出力します。

関数①sumValuesByColor() – 背景色ごとのセルの合計を計算

指定したシートの範囲内で、背景色ごとにセル内の数値を合計し、オブジェクト形式で返します。
透明セル(デフォルトの背景)と白色(#ffffff)は計算の対象外です。

指定のシートと範囲を取得
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var colorRange = sheet.getRange(rangeAddress);
var valueRange = sheet.getRange(valueRangeAddress);
  • getSheetByName(sheetName) で指定のシートを取得します。
  • getRange(rangeAddress) で色を判定する範囲を取得します。
  • getRange(valueRangeAddress) で合計する数値が入った範囲を取得します。
セルの背景色と値を取得
var bgColors = colorRange.getBackgrounds();
var values = valueRange.getValues();
  • getBackgrounds() でセルの背景色を2次元配列として取得
  • getValues() でセル内の数値データを2次元配列として取得
セルごとの背景色をチェックし、数値を合計
for (var i = 0; i < bgColors.length; i++) {
  for (var j = 0; j < bgColors[i].length; j++) {
    var color = bgColors[i][j];
    var value = values[i][j];

    // 透明セル(デフォルトの背景)と白色(#ffffff)はスキップ
    if (color === "" || color.toLowerCase() === "#ffffff") {
      continue;
    }

    // 数値セルのみ合計
    if (typeof value === "number") {
      colors[color] = (colors[color] || 0) + value;
    }
  }
}
  • 2次元配列をループ処理で走査
  • 透明セル("")と白色セル(#ffffff)はスキップします。
  • 数値セルのみ合計を計算し、同じ色のセルがあれば足していきます。
背景色ごとの合計値をオブジェクトとして返す
return colors;
  • 例えば、{ "#ff0000": 12000, "#00ff00": 8000, "#ffff00": 5000 } のようなオブジェクトを返します。

関数②outputColorSums() – 合計結果をスプレッドシートに出力

sumValuesByColor() の結果を取得し、E列(背景色)と F列(合計)に出力します。

アクティブシートを取得
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  • getActiveSheet() を使用し、現在開いているシートを取得します。
計算対象の範囲と出力先を設定
var colorRangeAddress = "B2:B"; // 色判定の範囲
var valueRangeAddress = "C2:C"; // 数値データの範囲
var outputColumnE = 5; // 色の出力先(E列)
var outputColumnF = 6; // 合計の出力先(F列)
var headerRow = 1; // ヘッダー行
var dataStartRow = 2; // データ出力開始行
  • B2:B の範囲をカウント対象に指定
  • C2:C の範囲の数値を合計対象に指定
  • E列(5列目) に色を出力
  • F列(6列目) に合計を出力
  • ヘッダーを1行目に設定データ出力開始は2行目(dataStartRow = 2
計算データを取得
var colorSums = sumValuesByColor(sheet.getName(), colorRangeAddress, valueRangeAddress);
if (Object.keys(colorSums).length === 0) {
  Logger.log("No color data found.");
  return;
}
  • sumValuesByColor() を実行し、色ごとのセル内の合計を取得します。
  • 計算結果が空なら処理を終了します。
ヘッダーを追加
sheet.getRange(headerRow, outputColumnE).setValue("色");
sheet.getRange(headerRow, outputColumnF).setValue("合計");
  • E1 に「色」、F1 に「合計」 をセットします。
データをリストに格納
for (const [color, sum] of Object.entries(colorSums)) {
  outputData.push([sum]); // F列(合計)
  backgroundColors.push([color]); // E列(背景色)
}
  • Object.entries(colorSums){ "#ff0000": 12000, "#00ff00": 8000 } のようなデータを配列化します。
  • 背景色のリスト 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列目)に 各色の背景色を適用します。
STEP
スクリプトを保存

スクリプトを書いたら、好きな名前を付けて保存します。

(例:「色付きセル_合計」)

STEP
スクリプトを実行

スクリプトを実行すると、色付きセルの値を各色ごとに合計します。

初めてそのスクリプトを実行する場合は権限の確認が必要です。

そのため、『権限を確認』を押します。

許可の詳細手順

「詳細」をクリックします。

無題のプロジェクト(安全ではないページ)に移動」をクリックします。

許可」をクリックします。

STEP
カウント結果が出力

E列に背景色、F列に合計値が表示されます。

GASの対象範囲や出力先を変更

計算の対象範囲や出力先を変更する場合は、以下の設定を編集すれば対応可能です。

スクリプト 32~35行目

var colorRangeAddress = "B4:B100"; // 色判定の範囲
var valueRangeAddress = "C4:C100"; // 数値データの範囲
var outputColumnE = 5; // 色の出力先(E列)
var outputColumnF = 6; // 合計の出力先(F列)

例えば:

  • D列を対象にする場合colorRangeAddress = "D4:D100";
  • 出力先をG列・H列に変更する場合 →var outputColumnE = 7; // 色の出力先(G列)
    var outputColumnF = 8; // 合計の出力先(H列)

まとめ

色付きセルのカウントと同様に、合計値の算出もGoogle Apps Script (GAS) を使うことで可能となります。

「スプレッドシートの色分けデータの合計値を求めたい!」という場合にぜひご活用ください。

弊社では、Google Apps Script(GAS)を活用した業務効率化のサポートを提供しております。

GASのカスタマイズやエラー対応にお困りの際は、ぜひお気軽にご相談ください。

また、ITツールの導入支援やIT導入補助金の申請サポートも行っております。

貴方の業務改善を全力でサポートいたします。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次