Spreadsheetデータの選択、挿入、削除、コピー、移動、ソート&ちょっとした高速化のコツ:Excel VBAプログラマーのためのGoogle Apps Script入門(7)(2/3 ページ)
Googleが提供するGoogle Apps Script(GAS)のプログラミングで、Google Apps(主にスプレッドシート)を操作する方法を解説していく連載。今回は、Spreadsheetデータの選択、挿入、削除、コピー、移動、ソートに使うメソッドの使い方などを解説する。
データの削除
次は、データの削除だ。データを削除するには、clearメソッドを使用する。
データを削除するclearメソッドの書式
「formatOnly: true」とは、書式(ここでは、セルの色やフォントなど表現形式)を真っさらな状態に戻すオプションだ。書式をクリアしたくない場合は、「formatOnly: false」とする。「contentsOnly」「commentsOnly」「validationsOnly」は、それぞれセル内のデータ、コメント、入力規則をクリアするかどうかだ。オプションは、それぞれ省略することもできるが、falseとなる。つまり、省略されたオプションに関してはクリアされない。
オプションがない「clear()」のみだと、書式、データ、入力規則の全てがクリアされる。
ここでは、clear()をリスト7のコードのように使うことにする。
function myClearFunction() { var sheet=SpreadsheetApp.getActiveSheet(); sheet.getRange("A6:D10").clear(); }
getRangeメソッドで、データをクリアしたい範囲を指定(今回は「A6:D10」の範囲)して、clearメソッドを実行するだけだ(3行目)。
図1に対して、リスト4を実行した結果は図4のようになる。
データを行ごと/列ごと削除する
図4では削除されたのはデータだけで、行はそのまま残っている。行ごと削除するには、別途処理が必要だ。
下記のメソッドのいずれかを使うと、行ごと/列ごと削除できる。
データを行ごと/列ごと削除するメソッドの書式
- 1行を削除する
{シートオブジェクト}.deleteRow({行番号}) - 複数行を削除する
{シートオブジェクト}.deleteRows({行番号},{消す行数}) - 1列を削除する
{シートオブジェクト}.deleteColumn({列番号}) - 複数列を削除する
{シートオブジェクト}.deleteColumns({列番号},{消す列数})
リスト5を使うと、図4で残った空白行も削除できる。
function myClearFunction() { var sheet=SpreadsheetApp.getActiveSheet(); sheet.deleteRows(6,5); }
Excel VBAとの違い
Excel VBAでは、行ごと/列ごとデータを削除するのに、Deleteメソッドを使う。
VBAではRange/Rows/Columnsオブジェクトで複数行/列の範囲を指定することで、削除する位置と行/列数が決まるが、GASではメソッドの名前/引数で削除する位置と行/列数が決まるという違いがある。
データのコピー
次にデータのコピーについて見ていこう。図1のデータを、E1〜H19の範囲にコピーするにはどうすればいいのだろうか。これまでの連載で紹介したメソッドや文法を使うと、リスト6のコードのようになると思う。
function myCopyFunction() { var sheet=SpreadsheetApp.getActiveSheet(); for(var i=1;i<=19;i++) { for(var j=1;j<=4;j++) { var copyValue=sheet.getRange(i,j).getValue(); sheet.getRange(i,j+4).setValue(copyValue); } } }
4〜12行目で、反復変数「i」を使って行を取得し、6〜10行目で反復変数「j」を使って列を取得する。getValueメソッドでi〜j列目までの値を取得して(8行目)、setValueで「i」行目の「j+4」列目に値をコピーしている(9行目)。
結果は図5のようになる。
データをコピーするcopyToメソッド
まずは、これまでの連載で紹介した方法を使うということで、for文を使ったが、これだと、先述のようにメソッドをたくさん使うため、コードも長くなるし、処理が重くなってしまう。
そこで、データのコピーはcopyToメソッドでも実現できるので、使ってみよう。こちらの方が使用方法は簡単だ。
データをコピーするcopyToメソッドの書式
{コピー元Rangeオブジェクト}.copyTo({コピー先Rangeオブジェクト})
{コピー元Rangeオブジェクト}.copyTo({コピー先Rangeオブジェクト},{ formatOnly: true, contentsOnly: true})
{コピー元Rangeオブジェクト}と{コピー先Rangeオブジェクト}を指定するだけだ。また、先述した「{ formatOnly: true, contentsOnly: true}」というオプションを指定することもできる。
実際に使うとなると、リスト7のようになる。
function copyToSample() { var sheet=SpreadsheetApp.getActiveSheet(); sheet.getRange("A1:D19").copyTo(sheet.getRange("E1:H19")); }
3行目でcopyToメソッドを使っている。ここでは、オプションがないcopyToメソッドを使っているので、ヘッダー部分にある「個人情報」のセル連結書式やフォント書式がコピーされていない。
Excel VBAとの違い
Excel VBAにおいてはCopyメソッドを使う。使い方はGASのcopyToメソッドと一緒だが、copyToメソッドのようなオプションはなく、データも書式もコピーされる。
なお、Excel VBAのCopyメソッドでは、コピー先の指定も省略できる。その場合は、クリップボードに保存される。保存されたデータはPasteメソッドで貼り付けることができる。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Excelマクロ/VBAリファレンス用途別・キーワード別一覧超まとめ
- 初心者のためのJavaScript入門
- ピボットテーブルとは何か──「そもそも、何をする機能か」を理解する
Excelを通じて「ピボットテーブル」の基礎を学び、データ分析を実践するまでを習得する本連載。初回はピボットテーブルの基礎と、「どんなことができるのか」を解説する。