スプレッドシートを別のシートにコピーするには、CopyToメソッドやgetValueとsetValueを使用して値をコピー&ペーストするなど様々な方法があります。
この記事ではGASでスプレッドシートを別のスプレッドシートにコピーする方法をまとめています。
この記事で解説しているメソッド
使用メソッド | 説明 |
---|---|
CopyTo() | コピー&ペースト |
openByUrl() | スプレッドシートをURLで開く |
openById() | スプレッドシートをシートIDで開く |
setName() | シート名を変更 |
setActiveSheet() | 指定シートをアクティブシートにする |
moveActiveSheet() | アクティブシートを移動する |
GASで別のシートにコピーする2つの方法
GASでスプレッドシートを別のシートにコピーする方法は大きく分けて2つの方法があります。
- copyToでコピー&ペーストする
- getValueとsetValueを使用して値をコピー&ペーストする
どちらの方法でも値のみや関数を別シートにコピーしたい場合であればできますが、
書式や行の高さ、列の幅なども反映したいとなると少し処理を増やすことが必要になってきます。
私の場合、1つのスプレッドシートをテンプレートとして使用して共有し、複数人がコピーしてシートを使っている場合など、いくつものシートに同じものを反映させたい時があったので、その辺りはまた別の記事で解説していきます!
GASで別のスプレッドシートにシートをコピー
GASで別のスプレッドシートにシートをそのままコピーするには、
CopyToメソッドを使用すれば実現できます。
CopyToで別のシートにコピーサンプルコード
function sample() {
//コピー先のスプレッドシート取得
var ss = SpreadsheetApp.openByUrl('コピー先シートのURL');
//コピー元のコピーしたいシートを取得
var sheet_main = SpreadsheetApp
.openByUrl('コピー元シートのURL').getSheetByName('コピーしたいシート名');
//シートをコピー
copySheet = sheet_main.copyTo(ss);
//コピーしたシート名を変更
copySheet.setName('変更後のシート名');
//シートを任意の場所に移動
ss.setActiveSheet(copySheet);
ss.moveActiveSheet(1); //コピーしたシートを左から1番目に移動
}
単純にコピーするだけのサンプルコード
function sample() {
//コピー先のスプレッドシート取得
var ss = SpreadsheetApp.openByUrl('コピー先シートのURL');
//コピー元のコピーしたいシートを取得
var sheet_main = SpreadsheetApp
.openByUrl('コピー元シートのURL').getSheetByName('コピーしたいシート名');
//シートをコピー
sheet_main.copyTo(ss);
}
ただし、これだけだと、
コピーしたシート名が「コピー元シート名のコピー」という感じで、
「のコピー」というシート名になってしまうため、シート名を変更しています。
コピーしたシート名変更サンプルコード
コピーシートを「copySheet」という変数に入れている場合
//コピーしたシート名を変更
copySheet.setName('変更後のシート名');
コピーしたスプレッドシートのシートを移動
また、コピー先のシートを任意の場所に移動したい時があると思います。
シートの移動はアクティブシートになっている必要があるので、
先にアクティブシートとして取得して、移動するという必要があります。
シートの移動をするmoveActiveSheet()メソッドはシートの一番左が「1」で、
左から2番目に移動したいなら「2」をプロパティに入力します。
「コピー先シート. setActiveSheet(コピーしたシート);」
「コピー先シート. moveActiveSheet(1);」
このサンプルコードは移動したいシートを
「copySheet」という変数に入れている場合のGASコードです。
//シートを任意の場所に移動
ss.setActiveSheet(copySheet);
ss.moveActiveSheet(1); //コピーしたシートを左から1番目に移動
コピーして変数に格納サンプルコード
シート名を変更したり、シートを移動したりしたい時は、
コピーしたシートを変数に格納しておくと便利です。
「変数 = コピーしたいシート名.copyTo(コピー先スプレッドシート);」
//シートをコピー
copySheet = sheet_main.copyTo(ss);
シートIDで別のスプレッドシートにシートコピー
上で解説しているGASは、openByUrl()メソッドを使用してURLを使って別シートにコピーしていますが、スプレッドシートIDでも可能です。
スプレッドシートIDはURLの「d/」の後ろから「/edit」の手前までのランダムな英数字部分です。
https://docs.google.com/spreadsheets/d/ABCDefghi1234567/edit#gid=0
※URLはサンプルです
function sample() {
//コピー先のスプレッドシート取得
var ss = SpreadsheetApp.openById('コピー先シートのID');
//コピー元のコピーしたいシートを取得
var sheet_main = SpreadsheetApp
.openById('コピー元シートのID').getSheetByName('コピーしたいシート名');
//シートをコピー
copySheet = sheet_main.copyTo(ss);
//コピーしたシート名を変更
copySheet.setName('変更後のシート名');
//シートを任意の場所に移動
ss.setActiveSheet(copySheet);
ss.moveActiveSheet(1); //コピーしたシートを左から1番目に移動
}
GASで別のスプレッドシートにコピーできない、エラーが出る時
GASでスプレッドシートを別シートにコピーする時は、
コピー元とコピー先のスプレッドシートが同一アカウントである必要があります。
別のアカウントのスプレッドシートだと、アクセス権限取得ができず、
「Exception: You do not have permission to access the requested document.」
というエラーが出てしまいます。
同一アカウントにすると、エラーが出ないのでアカウントを確認してみてください。
GASで別のスプレッドシートに値のみコピー
GASでスプレッドシートを別のシートに値のみコピーしたい場合は、
getValueとsetValueメソッドでできます。
function sample() {
//コピー元のコピーしたいシートを取得
var sheet_main = SpreadsheetApp
.openByUrl('コピー元シートのURL').getSheetByName('コピーしたいシート名');
//コピーしたい範囲の値を取得
var value = sheet_main.getRange('コピーしたい範囲').getValues();
//コピー先のシート取得
var targetSheet = SpreadsheetApp.openByUrl('コピー先シートのURL').getSheetByName('コピー先シート名');
//コピー先にペースト
targetSheet.getRange('ペーストしたい範囲').setValues();
}
別のシート取得や値の取得、コピーについては、他の記事でも解説しています。
【別シート取得・操作】スプレッドシートの取得・読み込み・開く、idや別シート
【getValue・setValue】スプレッドシートのセルの書き込み、文字を入れる、値取得
【CopyTo】行列コピー、スプレッドシートで自動コピーまとめ
別のスプレッドシートの最終行に書き込む
GASでスプレッドシートを別のシートの最終行にコピー&ペーストしたい時は、
コピー先のシートの最終行をgetLastRow()メソッドで取得すれば可能です。
詳しくはこちらの記事で解説しています。
スプレッドシートの最終行に追加、コピー、自動追加する方法まとめ
GASでシートを別のシートにコピーサンプルデータのダウンロード
別のシートにコピーするサンプルデータは、
CopyToメソッドの記事で公開していますので、
そちらからダウンロードして実際に動かしてみてください。
ありがとうございました!
コメント