GAS

【GAS】複数のスプレッドシートを1つにまとめる方法

こんにちは、まさかめです。

今回はGASを使用して、ドライブの特定フォルダ内にある複数のスプレッドシートに記載されている内容を1つにまとめる方法を紹介します。

まさかめ
まさかめ
いろんな人が自分用のフォルダに毎週ファイル追加していくものを1つにまとめてデータベース化したい、、、みたいなときに使えるよ!

GASのおさらい

GASとはGoogle Apps Scriptの略称であり、
Googleが提供している「Googleサービスを自動化するための言語」です。

まさかめ
まさかめ
厳密にいえば違うかもしれないけど、実務においてはスプレッドシート関連の自動化に使うのがほとんどかな

複数のスプレッドシートを
1つのスプレッドシートにまとめる方法

今回は複数のスプレッドシートを1つのスプレッドシートにまとめるという場合を考えてみます。

ドライブのフォルダ構成

ドライブでは以下のような構成となっているとします。

▽フォルダ
↳▽A
↳sample_A(スプレッドシート)
↳▽B
↳sample_A(スプレッドシート)
↳▽C
↳sample_A(スプレッドシート)
↳DB(スプレッドシート)

ファルダの中にA / B / Cという子フォルダが存在し、これらの中にあるスプレッドシートをDBというスプレッドシートにまとめることを目指します。

また、DBというスプレッドシートでGASを組むことを想定しています。

コード

コードは以下の通りです。

”getSpreadsheetData_”で子フォルダの中にあるスプレッドシートの中身をDBというスプレッドシートに転写しています。

また、それを子フォルダ分繰り返すのが”extract”です。

// フォルダにあるスプレッドシートの記載内容をメインのスプレッドシートに転写
function getSpreadsheetData_(folderId) {
  var mainSs = SpreadsheetApp.getActiveSpreadsheet();
  var mainSsList = mainSs.getSheetByName("list");
  var mainSsDb = mainSs.getSheetByName("db");
  var files = DriveApp.getFolderById(folderId).getFiles();
  var readSs = [];

  while (files.hasNext()) {
    var file = files.next();
    readSs.push([
      file.getName(),
      file.getUrl(),
      file.getId()
    ]);
    var ss = SpreadsheetApp.openById(file.getId()).getSheetByName("シート1");
    var ssData = ss.getSheetValues(2, 1, ss.getLastRow(), ss.getLastColumn());
    mainSsList.getRange(mainSsList.getLastRow() + 1, 1, readSs.length, readSs[0].length).setValues(readSs);
    mainSsDb.getRange(mainSsDb.getLastRow() + 1, 1, ssData.length, ssData[0].length).setValues(ssData);
  }
}

// メインのスプレッドシートが存在するフォルダ内の子フォルダを取得
function extract(){
  var mainSs = SpreadsheetApp.getActiveSpreadsheet();
  var mainSsList = mainSs.getSheetByName("list");
  var mainSsDb = mainSs.getSheetByName("db");
  mainSsList.getRange(2, 1, mainSsList.getLastRow(), mainSsList.getLastColumn()).clear();
  mainSsDb.getRange(2, 1, mainSsDb.getLastRow(), mainSsDb.getLastColumn()).clear();
  var parentFolder = DriveApp.getFileById(mainSs.getId()).getParents();
  var folderId = parentFolder.next().getId();
  var childFolders = DriveApp.getFolderById(folderId).getFolders();
  while (childFolders.hasNext()) {
    getSpreadsheetData_(childFolders.next().getId())
  }
}

まとめ

今やスプレッドシートは業務で欠かせないツールとなっています。

GASを組めるようになればこういった自動化を簡単に行うことができますので、ぜひ一度学んでみてください。

まさかめ
まさかめ
どんな業務でも重宝すること間違いなし!!