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

前回の記事では、クエリ関数を使ってGoogleスプレッドシートの複数シートのデータを集計する方法をご紹介しました。
ですが、クエリ関数ではシートが増減するたびに数式を修正する必要があり、シート数が多くなると面倒になる場合もあります。
そこで今回は、Google Apps Script(GAS)を活用して、シートの増減に柔軟に対応できる集計方法をご紹介します。
GASを使えば手動で数式を修正することなく、自動でデータを取得して集計できるようになります。

完成イメージ


各シートA列の項目(商品名)を基準に、B列の金額の合計を算出
今回のスクリプトでは、一つのスプレッドシートファイル内における全シートを対象に集計を行います。
手順

集計したいデータのあるスプレッドシートを開きます。
各シートのフォーマットは合わせておく必要があります。
(A列に商品名、B列に売上など)

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

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行目以降に書き込みます。

スクリプトを書いたら、名前を付けて保存します。
(例:「データ集計」)

ファイル内に「集計」シートが作成され、集計結果が表示されます。
(すでに「集計」シートがある場合は、そのシートに上書きされます)
GASを使った自動集計のメリットとデメリット
メリット | デメリット |
---|---|
シートの数が変わっても自動で対応 トリガー設定で定期的な自動集計が可能 | 実行時間の制限がある(6分) スクリプトのカスタマイズには知識が必要 |
- シートの数が変わっても自動で対応
-
クエリ関数では新しいシートを追加するたびに手動で数式を修正する必要がありますが、GASならすべてのシートを自動取得し処理するため、スクリプトを変更することなく対応できます。
- トリガー設定で定期的な自動集計が可能
-
GASでは、スクリプトを一定の間隔で実行する「トリガー」を設定することができます。
たとえば、「1日1回」や「毎時」などの頻度でスクリプトを実行し、常に最新のデータを集計しておくことが可能です。
これにより、手作業なしでリアルタイムなデータ管理を実現できます。
- 実行時間の制限がある(6分)
-
GASはクラウド上で実行されるため、無料プランでは1回の実行につき最大6分の制限があります(Google Workspaceアカウントの場合は30分)。
大量のデータを処理しようとするとスクリプトがタイムアウトし、途中で停止してしまう可能性があります。
対策として、データを分割して処理するなどがあります。 - スクリプトのカスタマイズには知識が必要
-
GASを活用すると柔軟なデータ集計が可能ですが、条件を変更・追加する場合はスクリプトを理解し修正する必要があります。
トリガーを使って定期的な集計を自動化
今回のスクリプトは手動で実行できますが、トリガーを設定することで定期的に自動実行することも可能です。
毎日、毎月など決まった日にスクリプトを実行したい時に便利です。
トリガーの設定手順

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

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

「トリガーを追加」または「新しいトリガーを作成します」をクリックします。
(時間主導型を選択した例)

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

保存をクリックして、トリガー設定完了となります。
設定したトリガーは一覧で表示されます。
これで指定のイベントが発生した際、選択したスクリプトが実行されます。

まとめ
Google Apps Script(GAS)を活用することで、スプレッドシートの複数シートのデータを自動で集計できるようになります。
シートの増減に対応しながら集計したい場合にはGASを使うと効率的です。
トリガーを設定すれば、定期的な売上データの自動集計ができるため、そちらも併せてご活用ください。

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