GASでGoogleスプレッドシートの複数のシートから1つのシートにデータを集約する方法

Yahoo!知恵袋の回答受付中の質問に勝手に答えるコーナーです。

今回の質問は、

googleスプレッドシートのマクロ、GASについて質問です。 初心者なので既出の質問でしたらすみません。

一つのブックの中にりんご,バナナ,メロン,みかん,バスケットという名前をそれぞれつけた5つのシートがあるとします。
りんご、バナナ、メロン、みかんのシート内のA行からG行までをコピーしてバスケットのそれぞれA1,A100,A200,A300にコピペしたい時、マクロの記録機能を使ったところ煩雑なコードになってしまいました。具体的には、

function myFunction() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange(‘A1’).activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName(‘りんご’), true);
spreadsheet.getRange(‘A:G’).activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName(‘バスケット’), true);
spreadsheet.getRange(‘\’りんご\’!A:G’).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
(中略)
}
という感じです。
さすがに長すぎますし扱いづらいので、もっと簡素化できる書き方があればぜひ教えてください。
できればコピペ後点線が出ないようなものが望ましいです。(伝わりますかね)

よろしくお願いします。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12212563977

スプレッドシート

次のように作成しました。

実現したい機能の整理

まず、実現したい機能の整理です。

ひとつめ。
質問文にある “A行からG行までをコピーして” は “A列からG列までをコピーして” の間違いかと思います。

ふたつめ。
1つ目のシートのりんごシートの値はバスケットの 1行目にコピーしますが、その他のシートの値は A100, A200, A300 と 一の位が 0 の行にコピーする点に注意が必要です。

つまり、りんごシートのコピー先の先頭とバナナシートのコピー先の先頭は 99行ずれ、バナナシートのコピー先の先頭とメロンシートのコピー先の先頭は 100行ずれます。

スクリプト

var ssid = "xxxxxxxxxx";

の xxxxxxxxxx の部分にシートID を貼り付けます。

copy() 関数を実行すると、各シートの値がバスケットシートにコピーされます。

コピー元のシート名を配列で保持しておき(1行目)、ループを回しながらコピー元のシートからコピー先のセルにコピーします(10-18行目)。
コピー先は offset 変数で、初回は 99 行ずらし、その後は 100行ずらします。

実行結果は次のようになります。

一覧できるように、10行ずらしの A10, A20, A30 にコピーするように変更しています。

まとめ

変更前は、おそらく 6行 × 4シート分 = 24行のコードかと推測しますが、今回はループを使って 19行(関数だけなら 11行)に小さくできました。

シートが増えても、配列にシート名を追加するだけでよく、その他の処理は変更する必要がないため、メンテナンス性も高まりました。