どうも。つじけ(tsujikenzo)です。このシリーズでは、 「スプレッドシートのセル考察 ~セルアドレスリテラル~」 について、全2回でお送りします。今日は1回目で 「A1Notationってなに」 です。
なお、この記事は「ノンプロ研GAS初級講座8期卒業LT」で発表した資料になります。ノンプロ研はこちらからどなたでも参加できます。
A1形式とR1C1形式
まず、A1形式(以降、A1Notation)と、R1C1形式(以降、R1C1Notation)について、おさらいしていきたいと思います。
A1Notation とは、アルファベット(A)と数字(1)の組み合わせで、 セルアドレス を表す記法です。アルファベットをA~Zまで使いきったら、AA、AAAのように、Zで桁上がりします。
R1C1Notation は、「Row and Column cell references」という意味が省略されたもので、日本語では R1C1参照形式 とも呼ばれています。
Excelのセル参照(A1Notation)
Excelでセルアドレスを指定するときは、A1Notationでこのように記述することが多いと思います。図では、セル[B2]から、セル[A1]を参照しています。
R1C1Notationによる相対参照
Excelの[オプション]から 「R1C1参照形式を使用する」 にチェックをいれると、R1C1Notationを使用できます。
表示は自動で切り替わります。 A列、B列などのアルファベットが数値に変わっていますね。
セル[B2]から見て、セルA1は[Rowがマイナス1]、[Columnがマイナス1]という意味です。
R[整数]C[整数]
起点となるセルアドレスから、 「相対的にかぞえて、どれくらい距離が離れているのか」 という書き方になります。
R1C1Notationによる絶対参照
R1C1Notationには、セルアドレスを直接指定する 「絶対参照」 記法もあります。
図では、セル[D4]から、セル[A1]を参照しています。
相対参照とくらべて、角カッコがないのが特徴的です。
R整数C整数
スプレッドシートのセル参照
スプレッドシートはもともと、A1Notationでセルアドレスを指定することを前提として設計されています。
公式ドキュメント[Google 開発者向けシートAPIv4]
なので、スプレッドシートでは、R1C1Notationでセルアドレスを指定することができません。
この問題は、セル参照の文字列を引数として渡す [INDIRECT関数] を使うことにより解決できます。
INDIRECT("セル参照の文字列", Boolean[A1 形式にする])
ドキュメント エディタ ヘルプ [INDIRECT]
セル[B2]に、セル[A1]を、相対参照 で指定するとこのようになります。
絶対参照 による、セルアドレス指定も可能です。参照した先に値がある場合は、小さく表示(「A1セルです」)してくれて親切ですね。
他のシートの参照
INDIRECT関数に渡す引数は、「他のシートのセル参照の文字列」でも構いません。
=indirect("sheet2!R1C1", false) //sheet2の1行1列目を指定する
シート名にスペースが含まれている場合、または角かっこで始まる場合は、シート名をシングルクォーテーション[‘]で囲みます。
'Sheet One'!A1:B2
社内のシート運用ガイドラインでは、 「シート名にスペースを使用しない」 というルールを課すより、「シート名は常にシングルクォーテーションで囲む」 というルールで運用する方がいいでしょう。
Formulaってよく聞くけど・・・
みなさんも一度は、「Formula(フォーミュラ)」 という単語を耳にしたことがあると思います。スポーツカー(F1はFormula 1の略です)ならわかるけど、表計算ソフトでは分からないという人も多いのではないでしょうか。
Formulaとは 「式(しき)」 です。式といえば [=(イコール)で始まる] とイメージしていただいてもいいかもしれません。
セルアドレスを指定する「式(以降、formula)」を整理してみましょう。
Excelに[表1]のように[A1 formula]を入力します。※画像はセル[A6]に[=SUM(A1:A5]を入力した状態です。
[表1]
参照元 | A1 formula | R1C1 formula |
---|---|---|
A1 | = B2 | = R [1] C [1] |
A2 | = B2 + 1 | = RC [1] +1 |
A3 | = A2 + 1 | = R [-1] C + 1 |
B4 | = $ A $ 3 + 1 | = R3C1 + 1 |
C5 | = B $ 4 + 1 | = R4C [-1] +1 |
D6 | = $ C5 + 1 | = R [-1] C3 + 1 |
A6 | = SUM(A1:A5) | = SUM(R [-5] C:R [-1] C) |
Excelのオプション設定で、R1C1方式をONにすると、[表1]の「R1C1 formula」になります。
スプレッドシートにおけるFormula
スプレッドシートにはformulaを使った関数が数多く用意されています。いくつかご紹介します。
getFormulas()とgetFormulasR1C1()メソッド
RangeクラスにあるgetFormulas()メソッドは、セルの見た目の値ではなく、セルに書かれている式を取得できます。
Rangeオブジェクト.getFormulas()
シート内に、式(ArrayFormula関数)が書かれたシートを準備します。
コンテナバインドスクリプトで、式のみを取得してみましょう。
function myFunction() {
const sheet = SpreadsheetApp.getActiveSheet();
console.log(sheet.getDataRange().getFormulas());
}
取得できました。
[ [ '', '', '', '', '', '', '', '', '' ],
[ '', '', '', '', '=SUM(B2:D2)', '=if(E2>=200,"合格","不合格")', '', '= Arrayformula(IF(E2:E4>=200,"合格","不合格"))', '' ],
以下、略
]
同様に、getFormulasR1C1()メソッドは、式の中にセルアドレス[A1Notation]が含まれていた場合は、[R1C1Notation]で返します。
Rangeオブジェクト.getFormulasR1C1()
コンテナバインドスクリプトで確認してみましょう。
function myFunction() {
const sheet = SpreadsheetApp.getActiveSheet();
console.log(sheet.getDataRange().getFormulasR1C1());
}
先ほどのログ出力に含まれる、[A1Notation]が[R1C1Notation]になっています。
[ [ '', '', '', '', '', '', '', '', '' ],
[ '', '', '', '', '=SUM(R[0]C[-3]:R[0]C[-1])', '=if(R[0]C[-1]>=200,"合格","不合格")', '', '= Arrayformula(IF(R[0]C[-3]:R[2]C[-3]>=200,"合格","不合格"))', '' ],
以下、略
]
まとめ
以上で、「A1形式とR1C1形式」 について、Excelとスプレッドシートの比較をもちいて考察してみました。
実は歴史を調べると、R1C1形式でセルアドレスを参照する方法は、古くから使われており、A1Notationが比較的に新しく開発された技術のようです。確かにA1Notationはより短く書くことができ、かつ直観的にアドレスを指定できますね。
しかしながら、相対的に参照したい場合はいまだにR1C1Notationを使います。セル位置をカウント変数などで回す場合などに便利ですので、まだまだ活躍の場は残されていると思います。
次回は、「getRange()メソッドとセルアドレスリテラル」 についてお届けします。
このシリーズの目次
1. [GAS]スプレッドシートのセル考察 ~A1Notationってなに~ [前編]