GASでスプレッドシートの複数シートを集約する方法

GASでスプレッドシートの複数シートを集約する方法
mono
mono
こんにちは、monoです。

スプレッドシートでGAS(Google Apps Script)を使っていると、スプレッドシート側の関数ではなくGASでスプレッドシートの複数シートを集約したいときってありますよね。

当記事では「GASでスプレッドシートの複数シートを集約する方法」について解説します。

目次

GASでスプレッドシートの複数シートを集約する方法

早速ですが結論から言うと、以下のサンプルコードで「スプレッドシートIDとシート名」を自分の環境に合わせて変更するだけでOKです。

変更箇所は「consolidateSheets_definition()」内の入力と出力それぞれのスプレッドシートIDとシート名です。

入力部分

  • 入力のスプレッドシートID:spreadsheetId_1…n
  • 入力のシート名:sheetName_1…n

出力部分

  • 出力のスプレッドシートID:targetSpreadsheetId
  • 出力のシート名:targetSheetName

サンプルコード

// ###### 各変数の定義用関数 ######
function consolidateSheets_definition() {

  // 集約元となる複数ファイルのスプレッドシートのスプレッドシートIDとシート名を定義
  const spreadsheetSheets = [
                              {id: 'spreadsheetId_1', name: 'sheetName_1'},
                              {id: 'spreadsheetId_2', name: 'sheetName_2'},
                              //...
                              {id: 'spreadsheetId_n', name: 'sheetName_n'},
                            ];

  // 集約先となるスプレッドシートのスプレッドシートIDとシート名を定義
  const targetSpreadsheets = {id: 'targetSpreadsheetId', name: 'targetSheetName'};

  // 定義した変数を渡し値にして処理用関数を実行
  consolidateSheets(spreadsheetSheets, targetSpreadsheets);
}


// ###### 以下、処理用関数 ######
function consolidateSheets(spreadsheetSheets, targetSpreadsheets) {

  // 出力先のスプレッドシートとシートを取得
  var targetSpreadsheet = SpreadsheetApp.openById(targetSpreadsheets.id);
  var targetSheet = targetSpreadsheet.getSheetByName(targetSpreadsheets.name);

  // 出力先のシートが存在しない場合は新規作成
  if (!targetSheet) {
    targetSheet = targetSpreadsheet.insertSheet(targetSheetName);
  }

  // 初めてのデータ取得かどうかのフラグ
  var isFirst = true;

  // 各スプレッドシートIDとシート名をループ
  spreadsheetSheets.forEach(function(spreadsheetSheet) {
    var spreadsheet = SpreadsheetApp.openById(spreadsheetSheet.id);
    var sheet = spreadsheet.getSheetByName(spreadsheetSheet.name);
    
    // シートからデータを取得
    var data = sheet.getDataRange().getValues();
    
    // 最初のシートだけヘッダー(最初の行)もコピーする
    if (isFirst) {
      targetSheet.getRange(1, 1, data.length, data[0].length).setValues(data);
      isFirst = false;
    } else {
      // 2枚目以降のシートはヘッダー行を除いてコピー
      targetSheet.getRange(targetSheet.getLastRow() + 1, 1, data.length - 1, data[0].length).setValues(data.slice(1));
    }
  });
}

上記のコードだと、spreadsheetSheetsの配列で定義した複数ファイルのデータを、targetSpreadsheetsにまとめて出力します。

スプレッドシート関数を使わないメリット

スプレッドシートの関数を使用しないので、定常的にシートが重くなることを防げます。

GASの実行方法

実行は「スケジュールで時刻トリガー」もしくは「スプレッドシートのメニューに手動実行のタブを追加」すると便利です。

あわせて読みたい
GASの勉強におすすめの入門本ランキング18選!【学習方法も解説】 「GAS(Google Apps Script)を勉強したいけど勉強方法がわからない、体系的にまとまっている学習書や良書を知りたい」と困っていませんか? 「プログラミングは体系的...

この記事を書いた人

28歳♂Webアナリスト/おすすめ本と生活改善グッズ紹介サイトmonoblog.jp他4サイト運営15万PVほど/楽天経済圏/リベ大生/サウナ/筋トレ/お仕事の依頼はこちら

目次