GASでスプレッドシートのセルをコピーして貼り付けるには、copyTo を使います。
コピー元の範囲.copyTo(コピー先の範囲);| やりたいこと | 書き方 |
|---|---|
| そのままコピー | src.copyTo(dest) |
| 値のみ貼り付け | src.copyTo(dest, {contentsOnly: true}) |
| 書式のみ貼り付け | src.copyTo(dest, {formatOnly: true}) |
| 別のスプレッドシートへ | copyTo は使えない。getValues() と setValues() を使う |
また、フィルタをかけた範囲をコピーしようとすると、「この操作は除外した行を含む範囲ではサポートされていません。」というエラーが出ることがあります。この記事では、その解決策も紹介します。
セルをコピーして貼り付ける(基本)

スプレッドシート サンプル
セル単体をコピーする:A1をA2にコピーします。
function copyCell() {
const sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange('A1').copyTo(sheet.getRange('A2'));
}
GAS copyTo セル単体のコピー
セル範囲をコピーする:A1:A2をA3にコピーします。コピー先は「左上のセル」だけ指定すれば、同じ大きさで貼り付けられます。
function copyRange() {
const sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange('A1:A2').copyTo(sheet.getRange('A3'));
}
GAS copyTo セル範囲のコピー
値のみ・書式のみを貼り付ける
第2引数にオプションを渡すと、貼り付ける内容を選べます。
function pasteSpecial() {
const sheet = SpreadsheetApp.getActiveSheet();
const src = sheet.getRange('A1:C5');
// 値のみ(数式は計算結果の値になる)
src.copyTo(sheet.getRange('E1'), {contentsOnly: true});
// 書式のみ
src.copyTo(sheet.getRange('I1'), {formatOnly: true});
}より細かく選びたいときは、SpreadsheetApp.CopyPasteType を使います。
| 指定 | 貼り付ける内容 |
|---|---|
PASTE_VALUES | 値のみ |
PASTE_FORMAT | 書式のみ |
PASTE_FORMULA | 数式のみ |
PASTE_NO_BORDERS | 罫線以外すべて |
PASTE_COLUMN_WIDTHS | 列の幅のみ |
// 値のみを、行と列を入れ替えて貼り付ける(第3引数 true)
src.copyTo(sheet.getRange('A10'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, true);別のシートにコピーする
同じスプレッドシート内であれば、コピー先を別のシートの範囲にするだけです。
function copyToOtherSheet() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const src = ss.getSheetByName('入力').getRange('A1:C10');
const dest = ss.getSheetByName('集計').getRange('A1');
src.copyTo(dest);
}別のスプレッドシートにコピーする
copyTo は同じスプレッドシートの中でしか使えません。別のファイルへコピーするときは、getValues() で値を読み込み、setValues() で書き込みます。
function copyToOtherFile() {
const src = SpreadsheetApp.getActiveSheet().getRange('A1:C10');
const values = src.getValues();
const destFile = SpreadsheetApp.openById('コピー先のスプレッドシートID');
const destSheet = destFile.getSheetByName('シート1');
destSheet.getRange(1, 1, values.length, values[0].length).setValues(values);
}この方法でコピーされるのは値だけで、書式はコピーされません。シートごと丸ごとコピーしたい場合は、シートの copyTo を使います。
const sheet = SpreadsheetApp.getActiveSheet();
sheet.copyTo(SpreadsheetApp.openById('コピー先のスプレッドシートID'));フィルタ中のcopyToと「この操作は除外した行を含む範囲ではサポートされていません。」
以前はエラーで止まっていた
当サイトで2018年に検証したときは、フィルタで非表示(除外)になっている行を含む範囲を copyTo のコピー元にすると、「この操作は除外した行を含む範囲ではサポートされていません。」というエラーが出て、処理が止まりました。
2026年11月の検証では、エラーは出ず「非表示の行が空白」になった
同じ操作をあらためて試したところ、エラーは出ず、フィルタで非表示の行だけが飛ばされてコピーされました。A1:A5(商品名・りんご・なし・もも・ぶどう)のうち「なし」と「ぶどう」をフィルタで非表示にして、B1に copyTo した結果が次のとおりです。
function copyRange() {
const sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange('A1:A5').copyTo(sheet.getRange('B1'));
}| 行 | A列(コピー元) | B列(コピー先) |
|---|---|---|
| 1 | 商品名 | 商品名 |
| 2 | りんご | りんご |
| 3 | なし(フィルタで非表示) | (空白) |
| 4 | もも | もも |
| 5 | ぶどう(フィルタで非表示) | (空白) |
エラーで止まらない分、非表示の行がコピーされていないことに気づきにくいので注意が必要です。フィルタをかけたままスクリプトを動かすと、データが欠けたまま集計してしまうことになります。

GAS copyTo フィルタ 非表示の行
フィルタをかけた範囲をコピーするときは、やりたいことに合わせて次の3つから選びます。
| やりたいこと | 方法 |
|---|---|
| 非表示の行も含めて、全部の行をコピーしたい | ① getValues() / setValues() でコピーする |
| 表示されている行だけを、空白を詰めてコピーしたい | ② 表示されている行だけを選んで書き込む |
| 書式も含めて全部そのままコピーしたい | ③ フィルタを解除してから copyTo する |
① getValues / setValues でコピーする
値だけを読み込んで書き込む方法なら、フィルタの影響を受けません。非表示の行も含めて、すべての行の値がコピーされます。
function copyAllValues() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const values = ss.getSheetByName('入力').getDataRange().getValues();
ss.getSheetByName('集計').getRange(1, 1, values.length, values[0].length).setValues(values);
}② 表示されている行だけコピーする
isRowHiddenByFilter() でフィルタによって非表示かどうかを調べ、表示されている行だけを書き込みます。
function copyVisibleRows() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const srcSheet = ss.getSheetByName('入力');
const values = srcSheet.getDataRange().getValues();
// フィルタで非表示になっていない行だけを残す
const visible = values.filter((row, i) => !srcSheet.isRowHiddenByFilter(i + 1));
ss.getSheetByName('集計').getRange(1, 1, visible.length, visible[0].length).setValues(visible);
}③ フィルタを解除してからコピーする
書式も一緒にコピーしたいときは、シート上でフィルタを解除してから実行します。スクリプトで解除する場合は sheet.getFilter().remove() ですが、フィルタの条件も消えるので注意してください。
まとめ
- セルのコピーは
コピー元.copyTo(コピー先)。コピー先は左上のセルだけ指定すればよい - 値のみなら
{contentsOnly: true}、書式のみなら{formatOnly: true} - 別のスプレッドシートへは
getValues()/setValues() - フィルタ中の copyTo は非表示の行が空白になる(以前は「除外した行を含む範囲」エラー)。
getValues()/setValues()に切り替えるか、表示行だけをコピーする

