Spreadsheetデータの選択、挿入、削除、コピー、移動、ソート&ちょっとした高速化のコツExcel VBAプログラマーのためのGoogle Apps Script入門(7)(2/3 ページ)

» 2017年06月12日 05時00分 公開
[薬師寺国安PROJECT KySS]

データの削除

 次は、データの削除だ。データを削除するには、clearメソッドを使用する。

 「formatOnly: true」とは、書式(ここでは、セルの色やフォントなど表現形式)を真っさらな状態に戻すオプションだ。書式をクリアしたくない場合は、「formatOnly: false」とする。「contentsOnly」「commentsOnly」「validationsOnly」は、それぞれセル内のデータ、コメント、入力規則をクリアするかどうかだ。オプションは、それぞれ省略することもできるが、falseとなる。つまり、省略されたオプションに関してはクリアされない。

 オプションがない「clear()」のみだと、書式、データ、入力規則の全てがクリアされる。

 ここでは、clear()をリスト7のコードのように使うことにする。

function myClearFunction() {
  var sheet=SpreadsheetApp.getActiveSheet();
  sheet.getRange("A6:D10").clear();
}
リスト4 データを削除するコード

 getRangeメソッドで、データをクリアしたい範囲を指定(今回は「A6:D10」の範囲)して、clearメソッドを実行するだけだ(3行目)。

 図1に対して、リスト4を実行した結果は図4のようになる。

図4 任意の範囲のデータが削除された

データを行ごと/列ごと削除する

 図4では削除されたのはデータだけで、行はそのまま残っている。行ごと削除するには、別途処理が必要だ。

 下記のメソッドのいずれかを使うと、行ごと/列ごと削除できる。

 リスト5を使うと、図4で残った空白行も削除できる。

function myClearFunction() {
  var sheet=SpreadsheetApp.getActiveSheet();
  sheet.deleteRows(6,5);
}
リスト5 行を削除するコード

Excel VBAとの違い

 Excel VBAでは、行ごと/列ごとデータを削除するのに、Deleteメソッドを使う。

 VBAではRangeRowsColumnsオブジェクトで複数行/列の範囲を指定することで、削除する位置と行/列数が決まるが、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);   
    }
  }
}
リスト6 for文を使ってデータをコピーする

 4〜12行目で、反復変数「i」を使って行を取得し、6〜10行目で反復変数「j」を使って列を取得する。getValueメソッドでi〜j列目までの値を取得して(8行目)、setValueで「i」行目の「j+4」列目に値をコピーしている(9行目)。

 結果は図5のようになる。

図5 データをコピーした

データをコピーするcopyToメソッド

 まずは、これまでの連載で紹介した方法を使うということで、for文を使ったが、これだと、先述のようにメソッドをたくさん使うため、コードも長くなるし、処理が重くなってしまう。

 そこで、データのコピーはcopyToメソッドでも実現できるので、使ってみよう。こちらの方が使用方法は簡単だ。

 {コピー元Rangeオブジェクト}と{コピー先Rangeオブジェクト}を指定するだけだ。また、先述した「{ formatOnly: true, contentsOnly: true}」というオプションを指定することもできる。

 実際に使うとなると、リスト7のようになる。

function copyToSample() {
  var sheet=SpreadsheetApp.getActiveSheet();
  sheet.getRange("A1:D19").copyTo(sheet.getRange("E1:H19"));
}
リスト7 copyToメソッドを使ったデータのコピー

 3行目でcopyToメソッドを使っている。ここでは、オプションがないcopyToメソッドを使っているので、ヘッダー部分にある「個人情報」のセル連結書式やフォント書式がコピーされていない。

Excel VBAとの違い

 Excel VBAにおいてはCopyメソッドを使う。使い方はGASのcopyToメソッドと一緒だが、copyToメソッドのようなオプションはなく、データも書式もコピーされる。

 なお、Excel VBAのCopyメソッドでは、コピー先の指定も省略できる。その場合は、クリップボードに保存される。保存されたデータはPasteメソッドで貼り付けることができる。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。