子育てエンジニアブログ

子育てに励むシステムエンジニア(SE)のブログ

【GAS】GASを使って複数シートを1つにまとめる方法

Googleスプレッドシートって便利で、たくさんシートを作ってしまいますよね。
で、時々シートを1つにまとめて集計したいって思うことありませんか?
そういう時のために今日はGASを使って複数シートを1つにまとめる方法について書いてみたいと思います。

仕様について説明します。

1つにまとめたいスプレッドシートのブックのIDを指定し、実行しているスプレッドシートに新規のシートを作成しそこに集約します。
新規で作られるシート名は集計_システム日付になります。

コードを登録して、スプレッドを開くとメニューというのが一番右にでます。

複数シートを集計するをクリックすると処理が始まります。

シートIDを入力します。(最近この形式での入力がマイブーム。)

1つにまとめられ、こんな感じで新しいシートができます。

ソースコードはこんな感じ。

function onOpen() {
    const ui = SpreadsheetApp.getUi()
    const menu = ui.createMenu('メニュー');
    menu.addItem('複数シートを集計する', 'totallingSheet');
    menu.addToUi();
}

function totallingSheet() {
    let ui = SpreadsheetApp.getUi();

    // シートIDの入力
    let response = ui.prompt('シートIDを入力してください', ui.ButtonSet.OK_CANCEL);

    // キャンセル時はスクリプトを終了する
    if (response.getSelectedButton() == ui.Button.CANCEL) {
        return;
    }

    // シートIDを取得する
    let sheetID = response.getResponseText();

    //コピー先のスプレッドシート
    let toSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();

    //コピー先のシートを新規作成する。シート名は「集計_」+システム日付
    let newSheet = toSpreadSheet.insertSheet(); 
    let newSheetName = "集計_" + Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyyMMddhhmmss");
    newSheet.setName(newSheetName);

    //コピー元のスプレッドシート
    let fromSheet = SpreadsheetApp.openById(sheetID);

    //コピー元のスプレッドシート
    let fromSpreadSheet = fromSheet.getSheets();

    //コピー元のシート分ループする
    for (let i = 0; i < fromSpreadSheet.length; i = i + 1) {
        //シートの内容を取得する
        let data = fromSpreadSheet[i].getDataRange().getValues();
        //取得したデータの先頭行(ヘッダ)を削除する
        data.shift();

        //取得したデータをコピー先シートの最終行以降に書き込む
        let lastlow = newSheet.getLastRow();

        //空の場合を考慮しチェックする
        if (data.length > 0) {
            newSheet.getRange(lastlow + 1, 1, data.length, data[0].length).setValues(data);
        }

    }

}

今日はGASを使って複数シートを1つにまとめる方法について書いてみました。