スプレッドシートの画面上で選択しているセル範囲を取得してみる
今回の記事では、スプレッドシートの画面上でマウスを使って選択したセル範囲を取得するコードをご紹介します。
GASを使ってプログラムを書く場合、セルの行と列を数字で指定したり、A1などのセル位置を指定してセルを指定することが多いと思います。
プログラムですべての処理をする場合はこのやり方で全く問題はないのですが、人がスプレッドシートを操作しながら、一部プログラム処理を組み込みたいというような場合に今回ご紹介の方法は有効な手段だと考えます。
具体的には、getSelectionというメソッドとそれに付随するメソッドの使い方をサンプルコードを使って紹介しようと思います。
本記事が役立つターゲット読者
- スプレッドシートを作業の一部をプログラムを使って自動化したい方
- 値を取得 / 出力したいセルが規則性がなく可変するスプレッドシートを自動化したい方
上記の要な場合は、プログラムで対象セルを指定するよりも、人が作業をしながらプログラムを思い通りに操ることができるような柔軟性を持たせることが必要となります。
記事で紹介するメソッド一覧
getSelectionは他のメソッドと組み合わせることで真価を発揮できます。
- getSelection(マウスで選択しているセル範囲をすべて取得する)
- getActiveRangeList(選択範囲をすべて取得する)
- getRanges(選択対象セルのすべてを配列で取得する)
実際の動作を確認してみる
まずは、下記のリンクからスプレッドシートを開き、上部のカスタムメニューを実行してみましょう。
一番最初に実行するときだけスクリプトに許可を求められますので、下記記事の手順に従ってGASに実行許可の付与をお願いします。
こちらのサンプルシートでは、マウスで選択したセルの範囲をダイアログで出力する関数を組み込んであります。
人がスプレッドシートで作業をする際は、このように様々なセルを選択して文字を入力したり削除したり、行や列を追加したり削除したりしますよね。
プログラムでは規則性を持った事を実行するのは得意なのですが、人の作業のように不規則な動きをするものに対しては弱いという特性があります。
今回ご紹介する方法では、人が行う作業ととプログラムの処理それぞれのいいとこ取りができる可能性を秘めています。
getSelectionのサンプルコード
引数に入れる値
引数なし
サンプルコード
function sampleCodeForGetSelection() {
let selection = SpreadsheetApp.getSelection();
let rangeList = selection.getActiveRangeList();
let ranges = rangeList.getRanges();
let array = [];
let i;
for (i in ranges) {
let a1Notation = ranges[i].getA1Notation();
array.push(a1Notation);
}
let a1Notations = array.join("\\n");
Browser.msgBox(a1Notations);
}
変数の説明
selection = マウスで選択したセルをすべて格納(Selectionオブジェクト)
rangeList = selectionから選択範囲を格納(RangeListオブジェクト)
ranges = すべての選択セルを格納(Range[]オブジェクト)
array = 選択したセル範囲を格納する配列
a1Notation = 選択したセル範囲のA1形式
a1Notations = arrayに格納されたa1Notationを選択範囲ごとに改行して整形した文字列
サンプルシートのコードは上記のようなコードで実現しています。
変数の説明を見ると、似たようなメソッドを何度か行っているように見えると思いますが、SelectionオブジェクトとRangeListオブジェクト、そしてRangeオブジェクトはそれぞれ利用できるメソッドが異なるため、このようなコードになっています。
今回のサンプルコードでは、選択されたセル範囲をA1形式で取得したかったので、Selection → RangeList → Rangeとセル範囲を取得していきました。
このようにすることで、人が選択したセル範囲をプログラムで自由に操作することができるようになります。
getSelectionを有効に使える状況とは?
getSelectionを利用すると人とプログラムの親和性がより高まることは理解できたと思います。
ただ、具体的にどのような場面で有効に使えるのか?イメージができない方も少なくないですよね。
たとえば、次のような場合に有効に使えるのではないかと考えます。
こういうような作業多い場合はプログラムとの共存が効果を発揮すると思います。
一つ例を挙げますが、スプレッドシートでは、対象のセルを削除するという機能がありますが、離れたセルを一括で削除することはできません。
下の動画を見てほしいですが、赤字になっているセルを削除するためには、一つずつ削除する操作をしなければならないのです。
一括で削除できればいいのになぁと思ったことがある人もいますよね?
こういうような作業があれば、積極的にgetSelectionを使って効率化してしまいましょう。
上記作業をプログラムを使って実現すると下の動画のようになります。
一瞬で終わりますね。
このように、普段当たり前のように手作業で行っている作業も、プログラムでできることを知れば作業効率を更に向上させることが可能です。
上記処理のサンプルコードは下記に置いておきます。
function sampleCodeFordeleteSelection() {
let selection = SpreadsheetApp.getSelection();
let rangeList = selection.getActiveRangeList();
let ranges = rangeList.getRanges();
let array = [];
let i;
for (i in ranges) {
ranges[i].deleteCells(SpreadsheetApp.Dimension.COLUMNS);
}
}
まとめ
今回は、getSelectionを使って人とプログラムが共存して作業効率を上げることができる一例をご紹介しました。
アイディア次第で効率はまだまだ上げられますので、どんどん活用していってくださいね。