スプレッドシートのGASでCopyToを使用して行列コピーしたり、自動で別シートにコピーや値のみコピーなど、CopyToでできることをまとめて解説しています。
複数行にコピーする時の範囲指定など、なるべくわかりやすく解説してみたいと思います。
この記事で解説しているメソッド
使用メソッド一覧 | 内容説明 | パラメータ | パラメータ説明 |
---|---|---|---|
copyTo() | コピー&ペースト | destination | コピー先範囲 |
copyTo() | コピー&ペースト | destination、copyPasteType、transposed | コピー先範囲、コピー貼り付けタイプ、転置 |
copyTo() | オプションコピー&ペースト | destination、options | コピー先位置、オプション |
copyValuesToRange() | 値のみコピーシート指定 | sheet、column、columnEnd、row、rowEnd | シート、開始列、終了列、開始行、終了行 |
copyValuesToRange() | 値のみコピーgridId指定 | gridId、column、columnEnd、row、rowEnd | グリッドID、開始列、終了列、開始行、終了行 |
copyFormatToRange() | 書式のみコピーシート指定 | sheet、column、columnEnd、row、rowEnd | シート、開始列、終了列、開始行、終了行 |
copyFormatToRange() | 書式のみコピーgridId指定 | gridId、column、columnEnd、row、rowEnd | グリッドID、開始列、終了列、開始行、終了行 |
moveTo() | 切り取りペースト | target | コピー先範囲 |
GASのCopyToでできること
スプレッドシートのGASでCopyToメソッドを使用すると、
範囲をコピーして、値のみ貼り付けをしたり書式を貼り付けたりと様々な事が行えるようになります。
また、シートをコピーしたり、別シートにシートをコピーしたりすることもできます。
CopyTo()のPASTEタイプで最終行に行列コピー
通常のCopyToでは、プロパティでペーストタイプを指定することで、色々な方法でコピー&ペーストする事ができます。
CopyToメソッドのペーストタイプ
copyPasteType | 説明 |
---|---|
PASTE_NORMAL | 値、数式、書式、および結合を貼り付け |
PASTE_NO_BORDERS | 枠線(罫線)以外を貼り付け |
PASTE_FORMAT | 書式貼り付け |
PASTE_FORMULA | 数式貼り付け |
PASTE_DATA_VALIDATION | 入力規則のみを貼り付け |
PASTE_VALUES | 値のみ貼り付け |
PASTE_CONDITIONAL_FORMATTING | 条件付き書式のみ貼り付け |
PASTE_COLUMN_WIDTHS | 列幅のみ貼り付け |
CopyToメソッドでペーストタイプを指定する場合は2つの書き方があります。
copyTo(コピー先範囲)
コピー先範囲、コピー貼り付けタイプ、転置
範囲はRangeでコピー元範囲とコピー先範囲を合わせる必要があるため、
後述している可変で使用するのがおすすめです。
CopyTo()の基本サンプルコード
値、数式、書式、および結合を貼り付け
//sheetのA1:E1をA2:E2に貼り付け
sheet.getRange('A1:E1').copyTo(sheet.getRange(2,1,5,1));
CopyTo()のPASTEタイプサンプルコード
sheet.getRange(range).copyTo(sheet.getRange(lastRow+1,1,rowlength,collength),
SpreadsheetApp.CopyPasteType.PASTE_NORMAL,false);
CopyToメソッドでオプションコピーする(おすすめ)
CopyToメソッドのオプションコピーでは、範囲の位置を指定してコピー&ペーストできるため、データ量が可変する場合に使いやすいです。
copyTo(sheet.getRange('範囲'), {contentsOnly:true});
copyTo(sheet.getRange('範囲'), {formatOnly:true});
contentsOnlyは値のみコピー、formatOnlyは書式のみコピーで、
trueでオン、falseでオフです。
//最終行を取得
var lastRow = sheet.getLastRow();
//コピー元範囲
var range = 'A21:E29';
//最終行にコピー&ペースト
sheet.getRange(range).copyTo(sheet2.getRange(lastRow+1,1),{contentsOnly:true});
オプションCpyToの値のみコピーfalseの場合
sheet.getRange(range).copyTo(sheet2.getRange(lastRow+1,1),{contentsOnly:false});
オプションCpyToの書式のみコピーtrueの場合
sheet.getRange(range).copyTo(sheet2.getRange(lastRow+1,1),{formatOnly:true});
copy○◯ToRange()でシートやgrdIDを指定してコピー
copyValuesToRange()は値のみコピー
copyFormatToRange()は書式のみコピーで、
それぞれシート(もしくはgridID)、開始列、終了列、開始行、終了行を指定して
コピー&ペーストできるメソッドです。
gridIDはシートIDのことで、シートを開いた時のURLの一番最後にある、
「#gid=英数字」の英数字の部分のことです。
sheet.getRange('範囲').copyValuesToRange(シートもしくはgridID,開始列,終了列,開始行,終了行);
CopyToメソッドで範囲をデータに合わせて可変で指定する
データ範囲に合わせて可変して指定するためには、
データ範囲を取得してデータの行数をlengthで調べたり、
列取得メソッドで列数を取得して変数に格納して使用する必要があります。
ちょっと難しく感じるかもしれませんが、
コピペで使えるので動きを確認してみてください。
function sample() {
//シート1を取得
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
//最終行を取得
var lastRow = sheet.getLastRow();
//コピー元範囲
var range = 'A21:E29';
//コピー元範囲行列取得
var rowlength = sheet.getRange(range).getValues().length;
var collength = sheet.getRange(range).getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn();
//コピー&ペースト
sheet.getRange(range).copyTo(sheet.getRange(lastRow+1,1,rowlength,collength));
}
このサンプルコードでは、コピー元の範囲をA21:E29として、
「sheet.getRange(range).getValues().length」で行数を数えていて、
列は左から何列目まであるか?を調べる事ができる、getNextDataCell()メソッドとgetColumnメソッドを使用して列数を取得しています。
「sheet.getRange(range).getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn()」
列数取得について詳しくはこちらで解説しています。
【GAS】スプレッドシートで行列取得まとめ、最終行列、getLastrow、getLastcol【Google Apps Script】
別シートからCopyToでシートをコピーする
別シートからCopyToする場合は、シート毎コピーする方法と、シートをコピーして範囲をコピーするなど、色々なやり方が行えます。
別のスプレッドシートからシートをコピーするサンプルコード
function sample() {
//アクティブスプレッドシート取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
//コピー元シートの取得
var sheet = SpreadsheetApp.openByUrl('コピー元URL').getSheetByName('コピー元シート名');
//シートをコピー
sheet.copyTo(ss);
}
別のスプレッドシートからシートをコピーして範囲をコピペ
function sample() {
//アクティブスプレッドシート取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
//シート1を取得
var sheet2 = ss.getActiveSheet();
//シート1の最終行を取得
var lastRow = sheet2.getLastRow();
//コピー元シートの取得
var sheet1 = SpreadsheetApp.openByUrl('コピー元シートURL')).getSheetByName('コピー元シート名');
//シートをコピー
var copySheet = sheet1.copyTo(ss);
//コピーしたシートのコピーしたい範囲を取得
var range = copySheet.getRange('A21:E29');
//コピーしたシートのコピー元範囲行列取得
var rowlength = range.getValues().length;
var collength = range.getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn();
//表をコピー
range.copyTo(sheet2.getRange(lastRow+1,1,rowlength,collength));
//コピーしたシートを削除
ss.deleteSheet(copySheet);
}
こちらのコードはサンプルデータで実際に動かす事ができるので、
ダウンロードして使用してみてください。
切り取りコピぺmoveTo
あまり使う機会がないかもしれませんが、切り取ってコピー&ペーストができるmoveToメソッドのサンプルコードも置いておきます。
function moveTo() {
//シート1を取得
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
//シート2を取得
var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート2');
//最終行を取得
var lastRow = sheet2.getLastRow();
//コピー元範囲
var range = 'A21:E29';
//コピー元範囲行列取得
var rowlength = sheet.getRange(range).getValues().length;
var collength = sheet.getRange(range).getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn();
//コピー&ペースト
sheet.getRange(range).moveTo(sheet2.getRange(lastRow+1,1,rowlength,collength));
}
moveToメソッドのサンプルコードでは、
シート1のA21:E29を切り取って、シート2にペーストしています。
データ範囲の可変に対応しているので、コピー元範囲の部分を変更すれば使用できます。
そのまま使えるCopyToサンプルデータ
スプレッドシートで行列コピーや自動コピーができるサンプルデータを公開しています。
【Copori】GASでCopyToサンプル①
CopyToサンプル全集データ使用方法
1、【Copori】GASでCopyToサンプル①を開いてコピーしてください
2、「【Copori】GASでCopyToサンプル②」のリンクがありますので、
そちらも開いてコピーしてください。
3、「【Copori】GASでCopyToサンプル②」のシートにシート①のURLをコピペしてください
4、メニューから「拡張機能」⇨「Apps Script」を開きます
※複数アカウントでログインしているとエラーで開けません
5、GASを一度手動実行して、①②共に権限取得を行なってください。
(サンプル②はボタンで取得)
権限取得の方法はこちら
6、各処理実行にチェックを入れると実行され、終了するとチェックが外れます
GASの手動実行を行なって動きを確認してみてください。
シート②には、実行のボタンが配置してあり、
クリックするとサンプル①シートからサンプル②シートに
CopyToでシートがコピーされ、データ範囲のコピーが終わると、コピーしたシートの削除を行うようになっています。
視覚で動きがわかるように実行のボタンを作ってあるので、
GASコードと合わせて動きを確認してみてください。
7、シート2の初期化する時は、「初期化」のチェックボックスをチェックしてください。
サンプルデータで使用しているコードはこの記事で説明しているので、
実際に動かしてみて、動きを確認してみてください!
このサイトでは、サンプルデータを使って、
実際に触って学べるように記事を作成しています。
なるべくわかりやすく書いていますが、わかりにくいところや間違っている部分等ありましたら、コメントやお問い合わせより教えていただけますと助かります!
ありがとうございました!
コメント