【GAS】スプレッドシートでコピー&ペーストの実行の仕方!GASでどこまでできる?


今回のテーマは、GAS(Google App Script)でのコピー&ペーストをやって見ます。VBAと比較されがちなGASさんですが、どこまでできるのか?見ていきたいと思います。
<VBAでのコピー&ペーストはこちらから>
この記事は・・・
- GASでコピー&ペーストをしたい人
- ペーストのいろいろな方法を知っておきたい人
- コピー以外の方法を知っておきたい人
にお勧めです。

GASの使い方の初歩となるところだにゃ。是非憶えて欲しいんだにゃ。
コピーのやり方

GASでのコピー&ペーストは、基本的にcopyTo()メソッドを使用してきます。
使用方法は至ってシンプルで、コピーをしたいセルに繋げて記載するだけです。でも、引数が色々あって、引数の数でコピー方法が変わります。

憶えておきたい方法は、3段階に分かれるんだにゃ。引数の数で変わるけど、引数の数が変わると渡す引数も変わるから、別々のものとして捉えた方が、憶えやすいと思うんだにゃ。
一番シンプルなコピー&ペースト

まずは、引数が1つの一番シンプルなコピー&ペーストです。引数にコピー先を指定するだけ。指定する引数は、貼り付けたい場所の左上のセルをしてします。
オブジェクトを指定したコピー先にコピーする
function myFunction() {
let sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1")
let sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート2")
sheet1.getRange(1, 1, 5, 3).copyTo(sheet2.getRange(1, 1))
}
値orフォーマットを指定

次に、引数を2つ指定する方法。値かフォーマットを貼り付けられるやり方です。
オブジェクトを指定したコピー先にコピーする
オプションを指定することで、コピーする内容を制限する
{オプション:true}の形で指定
オプション | タイプ | 説明 |
---|---|---|
formatOnly | true/false | フォーマットのみをコピー |
contentsOnly | true/false | 値のみをコピー |
function myFunction() {
let sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1")
let sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート2")
sheet1.getRange(1, 1, 5, 3).copyTo(sheet2.getRange(1, 1), {contentsOnly:true})
}
様々な形式を指定

最後が引数を3つ指定する方法。第2引数で何をペーストするかを指定できます。値だけ、フォーマットだけの他、数式、入力規則だけなど8つの中から選ぶことができます。そして、第3引数で、行と列を反転させる転置を行うかを指定できますね。
copyTo(コピー先, ペーストタイプ, 転置)
ペーストタイプ => SpreadsheetApp.CopyPasteType.ペーストタイプで指定
転置=>true or false で指定
オブジェクトを指定したコピー先にコピーする
ペーストタイプでコピー内容を指定し、転置で列と行を反転させるかを選べる
ペーストタイプ => SpreadsheetApp.CopyPasteType.ペーストタイプで指定
転置=>true or false で指定
オプション名 | タイプ | 説明 |
---|---|---|
ペーストタイプ | タイプを指定 | 値、数式、フォーマットなど何をコピーするのかを指定 |
転置 | true/false | 転置させるかどうか。転置とは行、列を逆転させること |
ペーストタイプ | 説明 |
---|---|
PASTE_ | 値、数式、フォーマット、およびマージの貼り付け。 |
PASTE_ | 値、数式、フォーマット、マージを貼り付け。ボーダーなし。 |
PASTE_ | フォーマットとデータ検証のみを貼り付け。 |
PASTE_ | 数式のみを貼り付け。 |
PASTE_ | データの入力規則のみを貼り付け。 |
PASTE_ | 値のみを貼り付け。 |
PASTE_ | 条件式書式のみを貼り付け。 |
PASTE_ | 列幅のみを貼り付け。 |
function myFunction() {
let sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1")
let sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート2")
sheet1.getRange(1, 1, 5, 3).copyTo(sheet2.getRange(1, 1), SpreadsheetApp.CopyPasteType.PASTE_FORMULA, true)
sheet1.getRange(1, 1, 5, 3).copyTo(sheet2.getRange(1, 1), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, true)
}
代入という方法

さて、次は値を入れるだけならば、代入でいいんじゃない?という考えで行うForループによるコピーです。正確には、値を順次、目的のセルに代入している感じです。
function myFunction() {
let sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1")
let sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート2")
let lastLow = sheet1.getLastRow()
let lastColumn = sheet1.getLastColumn()
for(let i = 1 ; i <= lastLow ; i++){
for(let j = 1 ; j <= lastColumn ; j++){
sheet2.getRange(i, j).setValue(sheet1.getRange(i, j).getValue())
}
}
}

こちらは、値だけしか入れられないため、コピーよりも劣っている感じがするんだにゃ。でもループを利用したり、変数を使うことができるので、より柔軟に入力できるのが強みだにゃ。状況に合わせて、使い分けて欲しいんだにゃ。
エクセルとの違い

ここでエクセルとの違いを軽く触れておきます。エクセルとの違いは次のようになりますね。
- コピーからペーストまでが一連の流れになるので、より直感的に行える。
- 逆にいうと、エクセルのようにコピーした値がクリップボードに貼り付けられるわけではない。
- ペーストの詳細がエクセルより少なく、演算がない。

これだけみると、複雑な処理はやはりVBAに軍配が上がるかにゃ?でも簡易的な処理であれば、GASの方が直感的で使用しやすい場合もあるんだにゃ。

状況に合わせて使い分けるのが良いということでしょうね。色々憶えて、使い分けられるようになりたいですね。
【VBA】コピー&ペーストするには?ペーストを指定すると幅が広がります。
プログラミングを学ぶならTechAcademy(テックアカデミー)がおすすめ!

独学で苦戦している人は、一度しっかりと基礎を学ぶと次のステップへ進めますよ。今のおすすめは、TechAcademy(テックアカデミー)ですね。
- オンラインで選抜された現役エンジニアから学ぶことができる
- 自宅からWeb制作・プログラミング・アプリ開発など幅広い分野を学べる
- 学ぶだけではなく、転職の支援、副業に活かせるスキルの習得、副業の仕事紹介まで行っている

無料体験や相談もあるから、一度試してみてもいいんだにゃ!
\無料体験、無料相談はこちらから/