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引数transposedをtrueにします。手作業の「特殊貼り付け → 行と列を入れ替える」と同じ動作です。
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()は、contentsOnly・formatOnlyや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開発をご相談いただけます。