【GAS】copyToでセルをコピーする方法|値のみ・別シートへの貼り付けと「除外した行を含む範囲」エラーの対処法

受講料の最大70%の給付金あり
経済産業省リスキリングを通じたキャリアアップ支援事業対象
サムライエンジニア「生成AI」コース

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 セル単体のコピー

GAS copyTo セル単体のコピー

セル範囲をコピーする:A1:A2をA3にコピーします。コピー先は「左上のセル」だけ指定すれば、同じ大きさで貼り付けられます。

function copyRange() {
  const sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange('A1:A2').copyTo(sheet.getRange('A3'));
}
GAS copyTo セル範囲のコピー

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 フィルタ 非表示の行

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() に切り替えるか、表示行だけをコピーする
タイトルとURLをコピーしました