GASでスプレッドシートのセルを
値・書式だけコピー&貼り付けする方法

手作業の「コピー → 特殊貼り付け」をコードで自動化しましょう。copyTo()(範囲をコピーして貼り付けるメソッド)で、値だけ・書式だけ・数式ごとなど、貼り付け方を細かく指定する方法を解説します。

|対象: GAS / スプレッドシート / copyTo

Table of Contents

copyToでできること

スプレッドシートのRange.copyTo()は、選択した範囲を別の場所に貼り付けるメソッドです。画面上で「コピー → 貼り付け」する操作を、そのままコードで再現できます。ポイントは、貼り付ける内容を細かく選べることです。

値ごとコピー

数式の計算結果や文字列を、そのまま別の場所へ貼り付ける

書式だけコピー

背景色・罫線・表示形式など、見た目だけを他の範囲へそろえる

数式ごとコピー

相対参照を保ったまま数式を複製し、行方向へ量産する

入力規則・列幅コピー

プルダウンや列幅など、特定の属性だけを引き継ぐ

範囲をまるごとコピーする基本コード

まずは一番シンプルな使い方です。コピー元の範囲をgetRange()で取得し、貼り付け先の左上セルを引数に渡すだけです。貼り付け先は範囲全体を指定する必要はなく、左上の1セルだけで足ります。

function copyRange() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("元データ");

  // コピー元の範囲
  const source = sheet.getRange("A1:C10");

  // 貼り付け先は左上のセルだけ指定すればよい
  const destination = sheet.getRange("E1");

  // 値・書式・数式をまるごとコピー(通常の貼り付け)
  source.copyTo(destination);
}

引数を省略したcopyTo(destination)は、値・数式・書式をすべて含む「通常の貼り付け」になります。

値だけ・書式だけをコピーする

最もよく使うのが「値だけ」「書式だけ」の貼り付けです。{ contentsOnly: true }なら値だけ、{ formatOnly: true }なら書式だけをコピーします。

function copyContentsOrFormat() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("元データ");
  const source = sheet.getRange("A1:C10");

  // 値だけを貼り付け(数式は計算結果の値に変わる/書式はコピーしない)
  source.copyTo(sheet.getRange("E1"), { contentsOnly: true });

  // 書式だけを貼り付け(背景色・罫線・表示形式などをコピー/値は変えない)
  source.copyTo(sheet.getRange("I1"), { formatOnly: true });
}

contentsOnlyは、数式を計算結果の値に固定したいとき(数式の「値貼り付け」)に便利です。集計結果を別シートに残す用途でよく使います。

CopyPasteTypeで貼り付け方法を指定する

さらに細かく指定したいときは、SpreadsheetApp.CopyPasteTypeの値を第2引数に渡します。第3引数は行と列を入れ替えるtransposedで、入れ替えないときはfalseを渡します。

function copyWithType() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("元データ");
  const source = sheet.getRange("A1:C10");
  const CopyType = SpreadsheetApp.CopyPasteType;

  // 数式ごとコピー(相対参照は貼り付け先に合わせてずれる)
  source.copyTo(sheet.getRange("E1"), CopyType.PASTE_FORMULA, false);

  // 罫線を除いてコピー
  source.copyTo(sheet.getRange("I1"), CopyType.PASTE_NO_BORDERS, false);

  // 入力規則(プルダウン)だけをコピー
  source.copyTo(sheet.getRange("M1"), CopyType.PASTE_DATA_VALIDATION, false);

  // 列幅だけをコピー
  source.copyTo(sheet.getRange("Q1"), CopyType.PASTE_COLUMN_WIDTHS, false);
}

主な種類は、通常貼り付けのPASTE_NORMAL、数式のPASTE_FORMULA、書式のPASTE_FORMAT、罫線なしのPASTE_NO_BORDERS、入力規則のPASTE_DATA_VALIDATION、条件付き書式のPASTE_CONDITIONAL_FORMATTINGなどです。

テンプレート書式を複数行へ一括適用する

実務でよく効くのが、1行分の書式見本を作っておき、それをデータ全行へ一気にそろえるパターンです。貼り付け先を「1行」ではなく「複数行の範囲」で指定すると、コピー元の書式がその範囲全体に敷き詰められます。

function applyTemplateFormat() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("請求書");

  // 1行分の書式見本(背景色・罫線・表示形式などを設定済み)
  const template = sheet.getRange("A2:F2");

  // データが入っている最終行まで、書式だけを一気にそろえる
  const lastRow = sheet.getLastRow();
  if (lastRow < 3) return; // 貼り付け対象がなければ終了

  const target = sheet.getRange(3, 1, lastRow - 2, 6);
  template.copyTo(target, { formatOnly: true });
}

毎日データが追加されるシートでも、この関数を1回呼ぶだけで見た目を統一できます。値には触れず書式だけをそろえるので、データを壊す心配もありません。

行と列を入れ替えて貼り付ける

縦に並んだデータを横に並べ替えたいときは、第3引数transposedtrueにします。手作業の「特殊貼り付け → 行と列を入れ替える」と同じ動作です。

function copyTransposed() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("元データ");

  // 縦に10行並んだデータ
  const source = sheet.getRange("A1:A10");

  // 第3引数 transposed を true にすると、横10列に入れ替えて貼り付ける
  source.copyTo(
    sheet.getRange("C1"),
    SpreadsheetApp.CopyPasteType.PASTE_NORMAL,
    true
  );
}

別スプレッドシートへコピーするには

注意したいのは、copyTo()は「同じスプレッドシート内」でしか使えない点です。別ファイルへ渡すと エラーになります。別ファイルへ値を移すときは、getValues()で二次元配列を取り出し、開いた先のシートでsetValues()する方法を使います。

function copyToAnotherSpreadsheet() {
  // copyTo は同じファイル内でしか使えないため、値を取得して書き戻す
  const source = SpreadsheetApp.getActive()
    .getSheetByName("元データ")
    .getRange("A1:C10");
  const values = source.getValues();

  const targetSs = SpreadsheetApp.openById("コピー先スプレッドシートのID");
  const targetSheet = targetSs.getSheetByName("取込先");

  // 取得した二次元配列の大きさに合わせて書き込む(書式はコピーされない)
  targetSheet
    .getRange(1, 1, values.length, values[0].length)
    .setValues(values);
}

この方法では書式はコピーされず、値だけが移ります。書式も引き継ぎたい場合は、貼り付け先で改めて書式を設定するか、シートごとcopyTo(別スプレッドシート)でコピーして必要な範囲を残す、といった設計にします。

実務での注意点

1. 貼り付け先の既存データは上書きされる

copyTo()は貼り付け先のセルを確認せず上書きします。重要なデータがある場所へ貼らないよう、貼り付け先の行・列は慎重に計算しましょう。

2. 相対参照は貼り付け先に合わせてずれる

数式ごとコピーすると、A1形式の相対参照は貼り付け位置に合わせて自動でずれます。ずらしたくない参照は$A$1のような絶対参照にしておきます。

3. 値だけの移動ならgetValues/setValuesが速い

書式が不要で値だけを大量に動かすなら、copyToより getValues()+setValues()の一括読み書きの方が高速です。用途に応じて使い分けましょう。

まとめ

GASのcopyTo()は、contentsOnlyformatOnlyやCopyPasteTypeを使い分けることで、手作業の「特殊貼り付け」をそのまま自動化できます。テンプレート書式の一括適用や数式の量産と組み合わせれば、シートの整形作業を大きく省力化できます。別ファイルへのコピーだけはgetValues/setValuesに切り替える、という点だけ覚えておきましょう。

よくある質問

copyTo() の第2引数にオプション { contentsOnly: true } を渡します。こうすると背景色や罫線などの書式はコピーされず、値だけが貼り付けられます。数式が入っているセルは、計算結果の値に変換されて貼り付けられます。

copyTo() に { formatOnly: true } を渡すと、背景色・文字色・罫線・表示形式などの書式だけがコピーされ、貼り付け先の値はそのまま残ります。テンプレートの見た目を他の範囲へそろえたいときに便利です。

PASTE_NORMAL や PASTE_FORMULA で数式ごとコピーすると、相対参照(A1形式)は貼り付け先の位置に合わせて自動でずれます。ずらしたくない場合は、参照を $A$1 のような絶対参照にしておくか、getValues() で計算結果の値だけを取得して書き戻します。

できません。copyTo() は同じスプレッドシート内の範囲どうしでしか使えません。別ファイルへコピーする場合は、コピー元で getValues() を実行し、開いた先のシートで setValues() する方法を使います。ただしこの方法では書式はコピーされず、値だけが移ります。

できます。copyTo(destination, SpreadsheetApp.CopyPasteType.PASTE_NORMAL, true) のように第3引数 transposed を true にすると、縦に並んだデータを横に、横のデータを縦に入れ替えて貼り付けられます。スプレッドシートの「特殊貼り付け → 行と列を入れ替える」と同じ動作です。

GAS開発・業務Webシステムを
相談する。

コピー&貼り付けの自動化以外にも、帳票のテンプレート整形・集計の値貼り付け・シート間のデータ連携など、日々の表計算作業を自動化するGAS開発をご相談いただけます。

GAS Webシステム開発を見る