[GAS]スプレッドシートのセル考察 ~getRange()メソッドとセルアドレスリテラル~ [後編]

GAS

どうも。つじけ(tsujikenzo)です。このシリーズでは 「スプレッドシートのセル考察 ~A1Notationってなに~」 について、全2回でお送りします。今日は2回目です。

なお、この記事は「ノンプロ研GAS初級講座8期卒業LT」で発表した資料になります。ノンプロ研はこちらからどなたでも参加できます。

コミュニティ「ノンプログラマーのためのスキルアップ研究会」についてのお知らせ #ノンプロ研
ノンプログラマーがVBA・GAS・Pythonなどのプログラミングを学ぶコミュニティ「ノンプログラマーのためのスキルアップ研究会」が絶賛活動中です!本ページはコミュニティの情報発信をしていく特集ページです。

前回のおさらい

前回は、「A1形式とR1C1形式」 について、Excelとスプレッドシートの比較をもちいて考察してみました。

[GAS]スプレッドシートのセル考察 ~A1Notationってなに~ [前編]
どうも。つじけ(tsujikenzo)です。このシリーズでは、 「スプレッドシートのセル考察 ~セルアドレスリテラル~」 について、全2回でお送りします。今日は1回目で 「A1Notationってなに」 です。なお、この記事は「ノンプロ...

今回は、「getRange()メソッドとセルアドレスリテラル」 についてお届けします。

セルアドレスリテラル

ここまで、[A1Notation][R1C1Notation] 、そして、2つを身近なものにするための [Formula] をお伝えしてきました。最後に 「セルアドレスとはなにか」 について考察したいと思います。

getRange(R1C1Notation)

講座ではセルアドレスを取得する方法として、getRange()メソッドをご紹介しました。

Sheetオブジェクト.getRange(セルアドレス)

Sheetクラスの公式リファレンスでは、getRange(a1Notation)となっています。

Class Sheet  |  Apps Script  |  Google for Developers

しかし、よく目をこらしてみると、[a1Notation or R1C1 notation] と書かれています。

さきほどのシートを使って、R1C1Notationの 絶対参照形式 でセル[A2]の値(つじけ)を取得してみましょう。

このようなコードになります。「つじけ」を取得できています。

function getRangeAsR1C1Notation(){

const sheet = SpreadsheetApp.getActiveSheet();
console.log(sheet.getRange('R2C1').getValue()); //つじけ

}

ちなみに、相対参照形式で書くと、セル[A1]を起点(R[0]C[0])とした相対参照になります。社内ガイドラインではどちらかの記法で統一した方がよいでしょう。

function getRangeAsR1C1Notation() {

const sheet = SpreadsheetApp.getActiveSheet();
console.log(sheet.getRange('R[0]C[0]').getValue()); //名前
console.log(sheet.getRange('R1C1').getValue()); //名前

console.log(sheet.getRange('R[0]C[1]').getValue()); //国語
console.log(sheet.getRange('R1C2').getValue()); //国語

console.log(sheet.getRange('R[1]C[0]').getValue()); //つじけ
console.log(sheet.getRange('R2C1').getValue()); //つじけ

console.log(sheet.getRange('R[2]C[0]').getValue()); //たかはし
console.log(sheet.getRange('R3C1').getValue()); //たかはし

}

セルアドレスリテラルの仮説

前回の記事で、INDIRECT関数に渡す引数は、「他のシートのセル参照の文字列」でも構いません。というのを紹介しました。

=indirect("sheet2!R1C1", false) //sheet2の1行1列目を指定する

シート名に空白などが含まれている場合は、シングルクォーテーションで囲む必要があります。

'Sheet One'!A1:B2

さらに、A1Notationの歴史は、R1C1Notationが始まりであったため、この2つは併用することができそうです。

sheet.getRange('A1').getValue());
sheet.getRange('R[0]C[0]').getValue());

つまり、セルアドレスを表すリテラルはこのように定義できそうです。

//セルアドレスリテラルの仮説
"'シート名'!A1Notation or R1C1Notation"

SpreadSheetクラスのgetRange()メソッド

前項で、公式リファレンスのSheetクラスのgetRange()メソッドを確認しました。

Class Sheet  |  Apps Script  |  Google for Developers

実は、SpreadSheetクラスでもgetRange()メソッドが紹介されています。

Class Spreadsheet  |  Apps Script  |  Google for Developers

そして内容は、Sheetクラスとまったく同じです。

これは、getRange()メソッドに渡す引数(セルアドレス)が、このようなリテラルで書けるからではないでしょうか。

"'シート名'!A1Notation or R1C1Notation"

裏を取ってみましょう。シート名は「合否判定」です。

function getRangeByAddressLiteral() {

const ss = SpreadsheetApp.getActiveSpreadsheet();
console.log(ss.getRange("'合否判定'!R1C1").getValue());
console.log(ss.getRange("'合否判定'!R[0]C[0]").getValue());
console.log(ss.getRange("'合否判定'!A1:A4").getValues());
}

値が取得できました。

// 名前
// 名前
// [ [ '名前' ], [ 'つじけ' ], [ 'たかはし' ], [ 'えとう' ] ]

名前付き範囲

こちらの記事でも紹介しましたが、セルの範囲には名前をつけることができます。

[GAS]名前付き範囲でスプレッドシートを操作しよう 後半戦
どうも。つじけ(tsujikenzo)です。このシリーズでは「名前付き範囲でスプレッドシートを操作しよう」について前半後半でご紹介しようと思います。今日は後半戦で「名前付き範囲をGASで操作しよう」をお届けします。前回のおさらい...

名前付き範囲に使用する[名前]はスプレッドシート全体をとおして、ユニークである必要がありました。

そして、名前付き範囲を掴むメソッドは [getRangeByName()メソッド] で、SpreadSheetクラスのメンバーです。

スプレッドシートオブジェクト.getRangeByName()

スプレッドシート全体をとおして、ユニークである名前を使用していますので、スプレッドシートを掴んだら、シートを指定せずにセルを掴むことができます。

function getNamedRangeValue() {

const ss = SpreadsheetApp.getActiveSpreadsheet();
console.log(ss.getRangeByName("送信日").getValue()); //Sun Mar 01 2020 14:00:00 GMT+0900 (Japan Standard Time)

}

しかし、名前付き範囲は、 セルアドレスリテラル を保有していますので、getRange()メソッドで掴むことができそうです。

function getNamedRangeValue() {

const ss = SpreadsheetApp.getActiveSpreadsheet();
console.log(ss.getRange("送信日").getValue()); //Sun Mar 01 2020 14:00:00 GMT+0900 (Japan Standard Time)

}

名前付き範囲は、セル単体だけでなく、セル範囲に対しても適用できます。

同様に、getRange()メソッドで掴むことができます。

function getNamedRangeValue() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
console.log(ss.getRange("納品内訳").getValues());

// [ [ '商品名', '数量', 'サイズ', '生産者', '重量', '荷姿' ],
//   [ 'じゃがいも', 2, '150-250g/pc', '大崎 太郎', 10, '単箱' ],
//   [ 'ながいも', 4, '0.8-1.0kg/pc', '大崎 太郎', 8, '単箱' ],
//   [ 'ごぼう', 10, '1-2kg/pc', '辻 次郎', 20, '単箱' ],
//   [ 'たまねぎ', 2, '0.3-0.5kg/pc', '辻 次郎', 4, '単箱' ],
//   [ 'にんじん', 6, '80-100g/pc', '辻 次郎', 18, '2合/甲' ] ]

ちなみに、

『名前付き範囲がシートの名前と競合する場合は、名前付き範囲が優先されます。』
公式ドキュメント[Google 開発者向けシート API v4]
https://developers.google.com/sheets/api/guides/concepts

とのことです。

まとめ

以上で、「getRange()メソッドとセルアドレスリテラル」 についてお届けしました。今回の考察で、自分の中でモヤモヤとしていたことを、たくさん整理できました。

一番の収穫は、 「セルアドレスリテラル」 を自分なりに定義できたことです。

"'シート名'!A1Notation or R1C1Notation"

講師を卒業します

さて、初級講座の補講ブログとLTが終了しましたが、いかがでしたでしょうか。ここまでお付き合いいただきありがとうございました。
[ノンプロ研]GAS初級講座8期 事前課題

私は、プログラミングのプロではありませんので、知識が不完全なこともありますし、間違っている認識も多々あります。恥をかくこともあります。しかし、 「正解だと思うことを、自分なりにアウトプットするしかない」 と信じて活動しています。

それは、ノンプログラマーの「プログラミング学習」においては、必ずしも誰かが答えを教えてくれるわけではないからです。

私も、最初は超初心者でした。「ググっても情報がない」、「なんで誰も教えてくれないんだろう」とずっと思っていました。ところがある日、 「正解を待ってるだけじゃなくて、自分なりの正解を発表すれば世界は変わるんじゃないか」 ということに気付きました。世の中は 「正解を知ってるけどつじけさんに教えてあげない」 という人より、「それ知りたかった!ありがとう!」 と思ってる人の方が圧倒的に多いということです。

要は誰かのものさしで決めた「正しいかどうか」ではなく、「やってみたかどうか」「アウトプットしたかどうか」 が大切なのです。これは初級でも中級でも変わらない、普遍的なものだと思います。

今回をもちまして、GAS初級講座の講師は卒業いたします。引き続き、考察とアウトプットを楽しんで続けたいと思います。このような貴重な機会を頂きました、ノンプロ研に大変感謝申し上げます。ありがとうございました。

このシリーズの目次

1. [GAS]スプレッドシートのセル考察 ~A1Notationってなに~ [前編]

2. [GAS]スプレッドシートのセル考察 ~getRange()メソッドとセルアドレスリテラル~ [後編]

3. [GAS]GASでセルに式を入力しよう

タイトルとURLをコピーしました