どうも。つじけ(tsujikenzo)です。このシリーズでは 「スプレッドシートのセル考察 ~A1Notationってなに~」 について、全2回でお送りします。今日は2回目です。
なお、この記事は「ノンプロ研GAS初級講座8期卒業LT」で発表した資料になります。ノンプロ研はこちらからどなたでも参加できます。
前回のおさらい
前回は、「A1形式とR1C1形式」 について、Excelとスプレッドシートの比較をもちいて考察してみました。
今回は、「getRange()メソッドとセルアドレスリテラル」 についてお届けします。
セルアドレスリテラル
ここまで、[A1Notation] 、[R1C1Notation] 、そして、2つを身近なものにするための [Formula] をお伝えしてきました。最後に 「セルアドレスとはなにか」 について考察したいと思います。
getRange(R1C1Notation)
講座ではセルアドレスを取得する方法として、getRange()メソッドをご紹介しました。
Sheetオブジェクト.getRange(セルアドレス)
Sheetクラスの公式リファレンスでは、getRange(a1Notation)となっています。
しかし、よく目をこらしてみると、[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()メソッドを確認しました。
実は、SpreadSheetクラスでもgetRange()メソッドが紹介されています。
そして内容は、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());
}
値が取得できました。
// 名前
// 名前
// [ [ '名前' ], [ 'つじけ' ], [ 'たかはし' ], [ 'えとう' ] ]
名前付き範囲
こちらの記事でも紹介しましたが、セルの範囲には名前をつけることができます。
名前付き範囲に使用する[名前]はスプレッドシート全体をとおして、ユニークである必要がありました。
そして、名前付き範囲を掴むメソッドは [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ってなに~ [前編]