Googleスプレッドシートで串刺し集計:GASで複数シートのデータ合算を自動化

前回の記事では、クエリ関数を使ってGoogleスプレッドシートの複数シートのデータを集計する方法をご紹介しました。

ですが、クエリ関数ではシートが増減するたびに数式を修正する必要があり、シート数が多くなると面倒になる場合もあります。

そこで今回は、Google Apps Script(GAS)を活用して、シートの増減に柔軟に対応できる集計方法をご紹介します。

GASを使えば手動で数式を修正することなく、自動でデータを取得して集計できるようになります。

目次

完成イメージ

各シートA列の項目(商品名)を基準に、B列の金額の合計を算出

今回のスクリプトでは、一つのスプレッドシートファイル内における全シートを対象に集計を行います。

手順

STEP
Googleスプレッドシートを開く

集計したいデータのあるスプレッドシートを開きます。

各シートのフォーマットは合わせておく必要があります。

(A列に商品名、B列に売上など)

STEP
GASエディタを開く

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

STEP
スクリプトの作成

function myFunction(){

}

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

function aggregateSheets() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var data = [];
  var header = ["商品名", "売上合計"];
  var targetSheetName = "集計"; // シート名を"集計"に設定

  for (var i = 0; i < sheets.length; i++) {
    var sheet = sheets[i];
    if (sheet.getName() !== targetSheetName) { // "集計"シートを除外
      var values = sheet.getDataRange().getValues();
      data = data.concat(values.slice(1)); // ヘッダー行を除外して追加
    }
  }

  // 商品名ごとに売上を集計
  var summary = {};
  data.forEach(function(row) {
    var item = row[0];
    var amount = row[1];
    if (item && amount) {
      if (!summary[item]) {
        summary[item] = 0;
      }
      summary[item] += amount;
    }
  });

  // 集計データを配列に変換
  var outputData = Object.entries(summary).map(([item, total]) => [item, total]);

  // "集計"シートの取得または作成
  var targetSheet = ss.getSheetByName(targetSheetName);
  if (!targetSheet) {
    targetSheet = ss.insertSheet(targetSheetName);
  }

  // "集計"シートのデータをクリアして新しいデータをセット
  targetSheet.clear();
  targetSheet.getRange(1, 1, 1, header.length).setValues([header]); // ヘッダー
  targetSheet.getRange(2, 1, outputData.length, outputData[0].length).setValues(outputData); // データ書き込み
}
スクリプトの説明
スプレッドシートの全シートを取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
  • getActiveSpreadsheet() で現在のスプレッドシートを取得します。
  • getSheets() を使い、すべてのシートを配列として取得します。
「集計」シートのヘッダーを設定
var header = ["商品名", "売上合計"];
targetSheet.clear();
targetSheet.getRange(1, 1, 1, header.length).setValues([header]); // ヘッダー
  • header 配列 ["商品名", "売上合計"] を1行目に設定します。(必要に応じてヘッダー名を変更)
シートを1つずつ処理し、「集計」シートを除外
for (var i = 0; i < sheets.length; i++) {
  var sheet = sheets[i];
  if (sheet.getName() !== targetSheetName) { // "集計"シートを除外
    var values = sheet.getDataRange().getValues();
    data = data.concat(values.slice(1)); // ヘッダー行を除外して追加
  }
}
  • すべてのシートをループ処理し、targetSheetName(=「集計」)と一致しないシートのデータを取得します。
  • getDataRange().getValues() でシートの全データを取得します。
  • slice(1) で1行目(ヘッダー行)を除外し、データのみを data 配列に追加します。
商品名ごとに売上を集計
var summary = {};
data.forEach(function(row) {
  var item = row[0];
  var amount = row[1];
  if (item && amount) {
    if (!summary[item]) {
      summary[item] = 0;
    }
    summary[item] += amount;
  }
});
  • summary というオブジェクトを作成し、商品名をキーに売上を累積します。
  • forEach()data 配列をループし、summary[item] に売上を加算します。
集計データを配列形式に変換
var outputData = Object.entries(summary).map(([item, total]) => [item, total]);
  • Object.entries(summary) を使って summary のオブジェクトを [キー, 値] のペアの配列 に変換します。
  • map()[商品名, 売上合計] の形式の配列を作成します。
「集計」シートの取得 or 作成
var targetSheet = ss.getSheetByName(targetSheetName);
if (!targetSheet) {
  targetSheet = ss.insertSheet(targetSheetName);
}
  • getSheetByName(targetSheetName) で「集計」シートが存在するか確認します。
  • シートが存在しない場合は insertSheet(targetSheetName) で新規作成します。
「集計」シートにデータを書き込む
targetSheet.getRange(2, 1, outputData.length, outputData[0].length).setValues(outputData);
  • setValues(outputData) を使って、集計結果を2行目以降に書き込みます。
STEP
スクリプトを保存

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

(例:「データ集計」)

STEP
スクリプトを実行

スクリプトを実行して、ファイル内の全シートのデータを集計します。

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

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

許可の詳細手順

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

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

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

STEP
集計シートが作成される

ファイル内に「集計」シートが作成され、集計結果が表示されます。

(すでに「集計」シートがある場合は、そのシートに上書きされます)

GASを使った自動集計のメリットとデメリット

メリットデメリット
シートの数が変わっても自動で対応
トリガー設定で定期的な自動集計が可能
実行時間の制限がある(6分)
スクリプトのカスタマイズには知識が必要
メリット
シートの数が変わっても自動で対応

クエリ関数では新しいシートを追加するたびに手動で数式を修正する必要がありますが、GASならすべてのシートを自動取得し処理するため、スクリプトを変更することなく対応できます。

トリガー設定で定期的な自動集計が可能

GASでは、スクリプトを一定の間隔で実行する「トリガー」を設定することができます。
たとえば、「1日1回」や「毎時」などの頻度でスクリプトを実行し、常に最新のデータを集計しておくことが可能です。
これにより、手作業なしでリアルタイムなデータ管理を実現できます。

デメリット
実行時間の制限がある(6分)

GASはクラウド上で実行されるため、無料プランでは1回の実行につき最大6分の制限があります(Google Workspaceアカウントの場合は30分)。
大量のデータを処理しようとするとスクリプトがタイムアウトし、途中で停止してしまう可能性があります。
対策として、データを分割して処理するなどがあります。

スクリプトのカスタマイズには知識が必要

GASを活用すると柔軟なデータ集計が可能ですが、条件を変更・追加する場合はスクリプトを理解し修正する必要があります。

トリガーを使って定期的な集計を自動化

今回のスクリプトは手動で実行できますが、トリガーを設定することで定期的に自動実行することも可能です。

毎日、毎月など決まった日にスクリプトを実行したい時に便利です。

トリガーの設定手順

STEP
GASエディタを開く
画像に alt 属性が指定されていません。ファイル名: GAS.png

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

STEP
トリガーページを開く

時計アイコン」をクリックしてトリガーページを開きます。

STEP
「トリガーを追加」をクリック

トリガーを追加」または「新しいトリガーを作成します」をクリックします。

STEP
トリガーを実行するイベントを設定

(時間主導型を選択した例)

実行する関数を選択
  • トリガーを実行した際に動かす関数を指定します。
実行のデプロイを選択:
  • どのバージョンのスクリプトを使用してトリガーを実行するかを選びます。
  • 通常は「Head」を選択して、最新のバージョンを使用します。
イベントのソースを選択
  • トリガーのきっかけとなるイベントを指定します。
  • 「時間主導型」などの選択肢があります。
  • 時間主導型は、指定されたスケジュールに基づいてスクリプトを実行するものです。
時間ベースのトリガーのタイプを選択
  • 時間主導型のイベントソースを選択した場合に表示され、どの頻度で実行するかを設定します。
  • 月ベースのタイマー」を選択すると、毎月決まった日にスケジュールを設定できます。
STEP
トリガーを保存

保存をクリックして、トリガー設定完了となります。

設定したトリガーは一覧で表示されます。

これで指定のイベントが発生した際、選択したスクリプトが実行されます。

まとめ

Google Apps Script(GAS)を活用することで、スプレッドシートの複数シートのデータを自動で集計できるようになります。

シートの増減に対応しながら集計したい場合にはGASを使うと効率的です。

トリガーを設定すれば、定期的な売上データの自動集計ができるため、そちらも併せてご活用ください。

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

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

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

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

お問い合わせはこちら

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

コメント

コメントする

目次