Google Apps Script (GAS) でシートのセル範囲の取得や、シートやセル範囲をアクティブにする方法を説明します。
Sheetクラスのメソッドを利用した手順について説明します。
Google Apps Scriptの基本的な使い方については下記をご覧ください。
GASによるスプレッドシート操作の概要
GASでスプレッドシートを操作するための「SpreadSheetサービス」は、主に下記のクラスで構成されています。
クラス | 説明 |
---|---|
SpreadSheetApp | SpreadSheetサービスの親クラス |
Spreadsheet | スプレッドシートを操作するクラス |
Sheet | シートを操作するクラス |
Range | セル範囲を操作するクラス |
それぞれ下記のような位置付けになります。
「SpreadSheetApp」→「SpreadSheet」→「Sheet」→「Range」という順の階層構造になっています。操作対象に応じて、下の階層にたどってオブジェクトを取得して利用します。
このページでは、上記の中のSheetクラスの下記のメソッドについて説明します。
メソッド | 戻り値 | 説明 |
---|---|---|
getActiveRange() | Range | このシートのアクティブなセル範囲を取得する |
getActiveRangeList() | RangeList | このシートのアクティブな全てのセル範囲を取得する |
getActiveCell() | Range | このシートのアクティブなセルを取得する |
getCurrentCell() | Range | このシートの現在のセルを取得する |
activate() | Sheet | このシートをアクティブにする |
setActiveRange(range) | Range | このシートのセル範囲をアクティブにする |
setActiveRangeList(rangeList) | RangeList | このシートの全てのセル範囲をアクティブにする |
setCurrentCell(cell) | Range | このシートのセルを現在のセルにする |
アクティブな各種コンテンツを取得する
このシートの、アクティブな(選択された)セル範囲などを取得するメソッドを説明します。
このシートのアクティブなセル範囲を取得する:getActiveRange()
このシートのアクティブな(選択された)セル範囲を取得する方法です。
下記のように「B2:B4」→「C6:D7」→「F9:G11」の順に複数選択していた場合を例に説明します。
下記のように実行します。
getA1Notation()は、セルの位置を表示するメソッドです。
1 2 3 4 5 6 |
function myFunction() { const testSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); const testSheet = testSpreadSheet.getSheetByName("シート1"); const testRange = testSheet.getActiveRange(); console.log(testRange.getA1Notation()); } |
下記の結果になります。
1 |
F9:G11 |
次に、下記のように「F9:G11」→「C6:D7」→「B2:B4」の順に複数選択していたとします。選択しているセルはさきほどと同じです。
今度は、下記の実行結果になります。
1 |
B2:B4 |
このように、最後に選択したセル範囲を取得します。
上記は、コンテナバインドスクリプトで実行しています。
正しく動作しない場合は、「getActive系のメソッドが正しく動作しない場合」の章もご覧ください。
このシートのアクティブな全てのセル範囲を取得する:getActiveRangeList()
このシートのアクティブな(選択された)セル範囲を全て取得する方法です。
下記の状態を例に説明します。
下記のように実行します。
取得した複数のセル範囲の位置を for…of文で順番に表示しています。
getA1Notation()は、セルの位置を表示するメソッドです。
1 2 3 4 5 6 7 8 |
function myFunction() { const testSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); const testSheet = testSpreadSheet.getSheetByName("シート1"); const testRangeList = testSheet.getActiveRangeList(); for (const testRange of testRangeList.getRanges()) { console.log(testRange.getA1Notation()); } } |
下記の結果になります。getActiveRangeメソッドとは違い、全てのセル範囲の情報を取得できます。
1 2 3 |
B2:B4 C6:D7 F9:G11 |
上記は、コンテナバインドスクリプトで実行しています。
正しく動作しない場合は、「getActive系のメソッドが正しく動作しない場合」の章もご覧ください。
このシートのアクティブなセルを取得する:getActiveCell()
このシートのアクティブなセルを取得する方法です。
下記の状態を例に説明します。
下記のように実行します。
getA1Notation()は、セルの位置を表示するメソッドです。
1 2 3 4 5 6 |
function myFunction() { const testSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); const testSheet = testSpreadSheet.getSheetByName("シート1"); const testCell = testSheet.getActiveCell(); console.log(testCell.getA1Notation()); } |
下記の実行結果になります。選択されているセル範囲の左上のセルを取得する動作になります。
1 |
B3 |
上記は、コンテナバインドスクリプトで実行しています。
正しく動作しない場合は、「getActive系のメソッドが正しく動作しない場合」の章もご覧ください。
“現在のセル”を取得したい場合は、次のgetCurrentCellメソッドを利用します。
このシートの現在のセルを取得する:getCurrentCell()
このシートの現在のセルを取得する方法です。
下記の状態を例に説明します。
下記のように実行します。
getA1Notation()は、セルの位置を表示するメソッドです。
1 2 3 4 5 6 |
function myFunction() { const testSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); const testSheet = testSpreadSheet.getSheetByName("シート1"); const testCell = testSheet.getCurrentCell(); console.log(testCell.getA1Notation()); } |
下記の実行結果になります。現在のセルを取得できます。
1 |
E6 |
上記は、コンテナバインドスクリプトで実行しています。
各種コンテンツをアクティブにする
このシートをアクティブにしたり、このシートのセル範囲などをアクティブにするメソッドを説明します。
このシートをアクティブにする:activate()
このシートをアクティブにする方法です。
下記のように実行します。
1 2 3 4 5 6 7 |
function myFunction() { const testSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); const testSheet = testSpreadSheet.getSheetByName("シート2"); console.log(testSheet.getParent().getActiveSheet().getName()); //実行前のアクティブシート名表示 testSheet.activate(); console.log(testSheet.getParent().getActiveSheet().getName()); //実行後のアクティブシート名表示 } |
下記の状態で実行すると、
下記の実行結果になります。
実行ログは下記になります。
1 2 |
シート1 シート2 |
上記は、コンテナバインドスクリプトで実行しています。
正しく動作しない場合は、「setActive系のメソッドが正しく動作しない場合」の章もご覧ください。
このシートのセル範囲をアクティブにする:setActiveRange(range)
このシートの指定したセル範囲をアクティブにする方法です。
下記のように実行します。
1 2 3 4 5 6 7 |
function myFunction() { const testSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); const testSheet = testSpreadSheet.getSheetByName("シート1"); console.log(testSheet.getActiveRange().getA1Notation()); //実行前のセル範囲表示 testSheet.setActiveRange(testSheet.getRange("B2:D4")); console.log(testSheet.getActiveRange().getA1Notation()); //実行後のセル範囲表示 } |
下記の状態で実行すると、
下記の実行結果になります。
実行ログは下記になります。
1 2 |
A1 B2:D4 |
上記は、コンテナバインドスクリプトで実行しています。
正しく動作しない場合は、「setActive系のメソッドが正しく動作しない場合」の章もご覧ください。
このシートの全てのセル範囲をアクティブにする:setActiveRangeList(rangeList)
このシートの指定した複数のセル範囲をアクティブにする方法です。
下記のように実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function myFunction() { const testSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); const testSheet = testSpreadSheet.getSheetByName("シート1"); for (const range of testSheet.getActiveRangeList().getRanges()) { console.log("実行前:" + range.getA1Notation()); //実行前のセル範囲表示 } testSheet.setActiveRangeList(testSheet.getRangeList(["C6:E9", "B2:D4"])); for (const range of testSheet.getActiveRangeList().getRanges()) { console.log("実行後:" + range.getA1Notation()); //実行後のセル範囲表示 } } |
下記の状態で実行すると、
下記のように、指定した複数のセル範囲が選択された状態になります。
実行ログは下記になります。
1 2 3 |
実行前:A1 実行後:C6:E9 実行後:B2:D4 |
上記は、コンテナバインドスクリプトで実行しています。
正しく動作しない場合は、「setActive系のメソッドが正しく動作しない場合」の章もご覧ください。
このシートのセルを現在のセルにする:setCurrentCell(cell)
このシートの指定したセルを現在のセルにする方法です。”アクティブ”ではなく”現在のセル”にするという動作です。
下記のように実行します。
1 2 3 4 5 6 7 |
function myFunction() { const testSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); const testSheet = testSpreadSheet.getSheetByName("シート1"); console.log(testSheet.getCurrentCell().getA1Notation()); //実行前のセルの表示 testSheet.setCurrentCell(testSheet.getRange("C3")); console.log(testSheet.getCurrentCell().getA1Notation()); //実行後のセルの表示 } |
下記の状態で実行すると、
下記のように、指定したセルが選択された状態になります。
実行ログは下記になります。
1 2 |
A1 C3 |
上記の場合は、アクティブにもなっていますが、次に下記の例で試してみます。
B2が現在のセルで、B2:D4がアクティブのファイルです。
実行すると下記の結果になります。現在のセルはC2に変わりますが、アクティブなセル範囲は変わりません。
このように、セルを”アクティブ”にするのではなく、”現在のセル”にする動作になる、ということに注意しましょう。最初の例のように、結果としてアクティブになるケースもあります。
上記は、コンテナバインドスクリプトで実行しています。
getActive系のメソッドが正しく動作しない場合
実際に動作確認したところ、getAcitve系のメソッドが正しく動作しないことがあったため、記載しておきます。
仕様なのかバグなのか、また、環境によるものなのか不明ですが、ご参考にしていただければと思います。
Apps Scriptダッシュボードでコンテナバインドスクリプトを開いた場合
同じコンテナバインドスクリプトでもスクリプトの開き方によって動作が変わりました。
下記のスクリプトがあるとします。「シート1」のアクティブなセル範囲を表示するスクリプトです。
1 2 3 4 5 6 |
function myFunction() { const testSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); const testSheet = testSpreadSheet.getSheetByName("シート1"); const testRange = testSheet.getActiveRange(); console.log(testRange.getA1Notation()); } |
下記のファイルに対して2通りの開き方で実行してみます。アクティブなセル範囲は「C3」です。
まず、下記のように「拡張機能」の「Apps Script」から開いて実行します。
「拡張機能」の「Apps Script」から開いて実行した場合は、下記の結果になります。
正しく表示されます。
1 |
C3 |
次に、直接Apps Scriptダッシュボードからスクリプトを開いて実行します。
https://script.google.com/にアクセスします。
該当のスクリプトである下記を開きます。アイコンを見てわかるようにスプレッドシートと紐付いたコンテナバインドスクリプトです。
下記の結果になります。
1 |
A1 |
このようにアクティブなセル範囲とは異なるセル範囲が表示されます。
Apps Scriptダッシュボードから開いたコンテナバインドスクリプトの場合、セル範囲を取得した場合は、セルA1を取得するようです。
次に、setActiveを実行したらどうなるかを見てみます。下記は、setActiveRangeメソッドを実行する前と後でgetActiveRangeメソッドの結果を表示するスクリプトです。
1 2 3 4 5 6 7 |
function myFunction() { const testSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); const testSheet = testSpreadSheet.getSheetByName("シート1"); console.log(testSheet.getActiveRange().getA1Notation()); //実行前のセル範囲表示 testSheet.setActiveRange(testSheet.getRange("B2:D4")); console.log(testSheet.getActiveRange().getA1Notation()); //実行後のセル範囲表示 } |
Apps Scriptダッシュボードから開いたコンテナバインドスクリプトで実行した結果は下記になります。「C3」がアクティブの状態で実行した結果です。
1 2 |
A1 B2:D4 |
setActiveRange実行前は、getActiveRangeの結果は正しくありませんが、実行後は正しく表示されています。
ここまでの動作をまとめると、コンテナバインドスクリプトでもApps Scriptダッシュボードから開いて実行した場合は、getActive系メソッドの結果は下記になります。
・セルはA1を取得する
・setActive系メソッドを実行した後は、getActive系メソッドでセットした値を正しく取得できる。
getActive系メソッドを利用する際は、よく動作確認しながら行うことをおすすめします。
スタンドアロンスクリプトの場合
スタンドアロンスクリプトで同様の確認をしたところ、下記の動作でした。
Apps Scriptダッシュボードからコンテナバインドスクリプトを開いた場合と同じような動作でした。
・セルはA1を取得する
・setActive系メソッドを実行した後は、getActive系メソッドでセットした値を正しく取得できる。
例えば、下記を実行してみます。
XXXXXXXXはスプレッドシートIDです。
1 2 3 4 5 6 7 |
function myFunction() { const testSpreadSheet = SpreadsheetApp.openById("XXXXXXXX"); const testSheet = testSpreadSheet.getSheetByName("シート1"); console.log(testSheet.getActiveRange().getA1Notation()); //実行前のセル範囲表示 testSheet.setActiveRange(testSheet.getRange("B2:D4")); console.log(testSheet.getActiveRange().getA1Notation()); //実行後のセル範囲表示 } |
実行結果は下記になります。Apps Scriptダッシュボードからコンテナバインドスクリプトを開いた場合と同じ結果です。
1 2 |
A1 B2:D4 |
setActive系のメソッドが正しく動作しない場合
実際に動作確認したところ、setAcitve系のメソッドが正しく動作しないことがあったため、記載しておきます。
仕様なのかバグなのか、また、環境によるものなのか不明ですが、ご参考にしていただければと思います。
Apps Scriptダッシュボードでコンテナバインドスクリプトを開いた場合
同じコンテナバインドスクリプトでもスクリプトの開き方によって動作が変わりました。
下記のスクリプトがあるとします。「シート1」のセル範囲を「B2:D4」へ変更するスクリプトです。
1 2 3 4 5 6 7 |
function myFunction() { const testSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); const testSheet = testSpreadSheet.getSheetByName("シート1"); console.log(testSheet.getActiveRange().getA1Notation()); //実行前のセル範囲表示 testSheet.setActiveRange(testSheet.getRange("B2:D4")); console.log(testSheet.getActiveRange().getA1Notation()); //実行後のセル範囲表示 } |
下記のファイルに対して2通りの開き方で実行してみます。アクティブなセル範囲は「C3」です。
まず、下記のように「拡張機能」の「Apps Script」から開いて実行します。
実行結果は下記です。正しく「B2:D4」がアクティブになります。
なお、実行ログは下記の出力です。
1 2 |
C3 B2:D4 |
次に、直接Apps Scriptダッシュボードからスクリプトを開いて実行します。
https://script.google.com/にアクセスします。
該当のスクリプトである下記を開きます。アイコンを見てわかるようにスプレッドシートと紐付いたコンテナバインドスクリプトです。
実行結果は下記になります。
実行ログは下記の出力です。
1 2 |
A1 B2:D4 |
このように、実行ログでは「B2:D4」に変わっていますが、見た目の変化はありません。
※実行前が「A1」である点については、「getActive系のメソッドが正しく動作しない場合」の章をご確認ください。
Apps Scriptダッシュボードから開いたコンテナバインドスクリプトの場合、実際に開いているファイルの見た目は変化しないようです。
setActive系メソッドを利用する際は、よく動作確認しながら行うことをおすすめします。
スタンドアロンスクリプトの場合
スタンドアロンスクリプトで同様の確認をしたところ、Apps Scriptダッシュボードからコンテナバインドスクリプトを開いた場合と同じような動作でした。
まとめ
Google Apps Script (GAS) でシートのセル範囲の取得や、シートやセル範囲をアクティブにする方法を説明しました。
GASは無料で利用できてとても便利なツールです。
Googleスプレッドシート等のGoogleアプリケーションを利用されている方は、GASを習得することで作業を大きく効率化できます。
GASの基本構文を知りたい方は、下記もご覧ください。