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導入補助金の申請サポートも行っております。
貴方の業務改善を全力でサポートいたします。





 
	








コメント