スプレッドシートに大量のデータがあるとき、一部のデータを別のセルにコピペしたり、条件に合ったものを抽出してコピペしたいと言った場面があると思います。
そんなときはGASを使って効率的にコピペ作業をするのが良いでしょう。今回の記事では、GASを使ってセルにあるデータを「書式あり」で別のセルにコピペする方法・「値のみ」でコピペする方法の2種類のコピペ方法を解説していきます!
スプシのセル情報を簡易的にコピペする方法
スプレッドシートの特定のセルを別のセルにコピペする方法で考えられるのは、getValue()
メソッドとsetValue()
メソッドを使う方法です。
コピーしたいセルに対してgetValue()
でデータを取得し、ペーストしたいセルに対してsetValue()
を使用します。例えば、以下のようなスプレッドシートがあったとき、A8にある山田さんのセルをD4のセルにコピペしたいとします。その場合、以下の様なコードになります。(コンテナバインド型で作成します)
function CopyAndPaste() {
// スプレッドシートを開く
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// A8セルの値を取得
let value = sheet.getRange('A8').getValue();
// 取得した値をD4セルに設定
sheet.getRange('D4').setValue(value);
}
初回実行時には承認作業が必要なので、画面の指示に沿って進めてください。
実行が成功すると、きちんとセルにコピペができていることがわかります!
では、A列のデータに書式を加えて実行してみるとどうでしょうか。
文字色をオレンジ・太字に設定して実行すると、D4セルには先ほどと同様黒字で通常の太さのフォントで値のみがペーストされることがわかります。
これは、getValue()、setValue()が「値」のみの情報を取ってくる・貼り付けることが原因です。
書式もコピペするならcopyTo()メソッド
では、書式もコピペするにはどの様にしたらよいでしょうか?GASにはもっと便利なメソッドが用意されています。
それがcopyTo()
メソッドです。copyTo()
メソッドは、範囲を表すRangeオブジェクトにのみ適用されるメソッドになります。もちろん単一のセルにも使えるし、こちらのメソッドひとつでgetValue()
とsetValue()
双方の役割を果たす様な書き方も可能です。
コピー対象のセル範囲Rangeオブジェクト.copyTo(コピー先のセル範囲を指定, {options})
options
にはオプションを設定することが可能で、contentsOnly
、formatOnly
と2つの指定が可能です。
contentsOnly:true
とすると、値のみのコピペになり、先ほど実施したgetValue()
とsetValue()
を利用した時と同様の動作になります。
対して、formatOnly:true
とすると、書式のみ保持したコピペとなり、色やフォントの太さなどの値以外の情報がコピペされます。
では、先ほどのスプレッドシートを使って、山田さんのデータを書式を保持したまま、再度同じセルにコピペしてみましょう。
function CopyAndPaste() {
// スプレッドシートを開く
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// コピー元のセル範囲を取得
let sourceRange = sheet.getRange('A8');
// コピー先のセル範囲を取得
let targetRange = sheet.getRange('D4');
sourceRange.copyTo(targetRange);
}
実行すると、無事書式を保持したまま、データが対象のセルにきちんとコピペされました!
こちらの方法の方が、1つのメソッドでコピペが済むので非常に楽ですね!
また、値のみのオプションを指定する場合は以下の様になります。
function CopyAndPaste() {
// スプレッドシートを開く
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// コピー元のセル範囲を取得
let sourceRange = sheet.getRange('A8');
// コピー先のセル範囲を取得
let targetRange = sheet.getRange('D4');
sourceRange.copyTo(targetRange, {contentsOnly:true});
}
【応用編】条件にあったデータのみ抽出してコピペ
先ほどのcopyTo()メソッドを使って、条件にあったデータのみ別の列にコピペする方法を試したいと思います。
今回は、役職が「社員」の人の名前をコピペしてみます。コードは以下の様になります。
function CopyAndPaste() {
// アクティブなスプレッドシートを取得
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// データ範囲をRangeオブジェクトで取得(A列とB列のデータを取得)
let range = sheet.getRange("A2:B11");
let values = range.getValues();
// 「社員」の名前を抽出
let employeeNames = values.filter(row => row[1] === "社員").map(row => [row[0]]);
// D列に抽出した名前をコピー(D2セルから開始)
if (employeeNames.length > 0) {
sheet.getRange("D2:D" + (1 + employeeNames.length)).setValues(employeeNames);
}
}
この時、valuesに入っている情報は以下の様なデータになります
[ [ '田中', '部長' ],
[ '伊藤', '課長' ],
[ '佐藤', '主査' ],
[ '斉藤', '社員' ],
[ '水野', '社員' ],
[ '小山', '社員' ],
[ '山田', '社員' ],
[ '菅野', '社員' ],
[ '吉田', '社員' ],
[ '沖田', '社員' ] ]
行の値を1つの配列として、その配列のデータをさらに配列にしたものになります。以下のコードで1行のデータの2要素目に「社員」という文字列があるものをフィルタ(抽出)し、残った社員のみのデータが残っている配列データをmap関数で展開し、名前のみを再度配列に格納しています。
let employeeNames = values.filter(row => row[1] === "社員").map(row => [row[0]]);
最後に、D列にその配列の値をセットしているという流れになります。
このように、D列に社員のみの名前がペーストされているのがわかります!
CopyTo()
はあくまで範囲に対するメソッドになるので、このような条件付きのコピペについてはgetValue()
、setValue()
を使う方が使い勝手が良さそうです。
まとめ
今回はスプレッドシートのセルの値・情報をコピーして、別のセルにペーストする方法をいくつか紹介していきました。CopyTo()は非常に便利なメソッドですので、是非セルの範囲コピペを利用するときは使ってみてください。
また、状況に合わせてCopyTo()
を使うのが良いのか、それともgetValue()
とsetValue()
を使うのが良いのかは、適宜考えてみてください。
コメント