GASでセルに「2」を書き込むプログラムの意味を理解しよう
前回までは、下記のプログラムを「どう入力するか」を中心に話をしてきました。
function writeToA1() {
SpreadsheetApp.getActiveSheet().getRange(1, 1).setValue(2);
}
今回は、このプログラムの「意味」について説明をしていきます。
function ... { ... } の部分
ここでは、function(=関数)を定義しています。
functionというのは、1つまたは複数の処理をまとめて、それに名前を付けたものです。
functionのすぐ後に出てくる「writeToA1」というのが、このfunctionの名前です。このfunctionの名前は、プログラムを書く人が自由に決められます。
そして、「writeToA1」というfunctionを実行すると、「{」と「}」で囲まれた部分に書かれた命令文が実行されます。
「SpreadsheetApp.getActiveSheet().getRange(1, 1).setValue(2)」は何をしているのか?
次に、「{」と「}」で囲まれた部分「SpreadsheetApp.getActiveSheet().getRange(1, 1).setValue(2)」の解説をしていきます。
ここについては、難易度別に3パターンの解説を書いてみようと思います。すべてのパターンの解説を読む必要はありませんので、自分のレベル感に合いそうな解説を読んでみてください。
初心者向け説明(概略)
命令文を、日本語に翻訳すると、次のような意味になります。
このように、「.」(ドット)を「の」に置き換えて、残りの部分を、日本語に翻訳すれば、意味がわかります。
とりあえず、最初の段階では、この程度の理解でも十分でしょう。
中級者向け説明(内部動作のたとえ)
少し、学習が進んでくると、先ほどの説明だけでは、理解できなくなる部分が出てきます。
そこで、ここでは、もう少し詳しく挙動を説明していこうと思います。
まずは、少しでも理解しやすくなることを期待して、「たとえ」を使った説明をしてみます。
全体的な状況
まずは、何かの手続きをするために建物に入ったときに、たくさんの「受付窓口」がある状況を想像してみてください。
それぞれの受付窓口は「番号」で管理されています。
この世界で、何か作業をしたいときには、受付窓口の中に入って、情報を引き出したり、サービスを受ける(処理をしてもらう)必要があります。
「SpreadsheetApp」の受付窓口の番号を探す
今回の命令文の最初は「SpreadsheetApp」です。
そこで、「SpreadsheetApp」の処理をしてくれる受付窓口を探しましょう。
入り口に、受付窓口の案内があるので、それを見て「SpreadsheetApp」の受付窓口を探しましょう。
「SpreadsheetApp」の受付窓口に行く
その案内に従って、3番の受付窓口に行ってみましょう。
そこは、「グーグルスプレッドシートアプリ全般」について取り扱う窓口です。
窓口で「.getActiveSheet()」の操作を依頼する
その窓口で「アクティブシート(=シート1)を操作したいです」と伝えましょう。
すると、その窓口の担当者は、奥に行ってガサゴソと作業をしたあと戻ってきて言いました。
言われた受付窓口に行って「.getRange(1, 1)」の操作を依頼する
そこで、6番窓口に行ってみましょう。そこには《「シート1」》の受付窓口」があります。
そこで、その窓口の担当者に「1行1列目のセルの操作をしたいです」と伝えましょう。
すると、担当者は、奥に行ってガサゴソと作業をしたあと戻ってきて言いました。
言われた受付窓口に行って「.setValue(2)」の操作を依頼する
今回も、言われた10番の受付窓口に行ってみましょう。そこには《シート1の1行1列目のセルを操作する窓口》」があります。
そこで、その窓口の担当者に「セルに2という値を書き込みたいです」と伝えましょう。
すると、担当者さんは、奥に行ってガサゴソと作業をしたあと戻ってきて言いました。
これで、セルに書き込む操作が終わりました。
今回の処理の流れをまとめると、「受付窓口の番号」を次々に受け取って、処理をすすめていることがわかります。
- 「SpreadsheetApp」の受付窓口に行き「.getActiveSheet()」の処理を依頼する
→ アクティブシート(=シート1)の処理をする受付窓口の番号を教わる
- 「シートの処理をする」受付窓口に行き「.getRange(1, 1)」の処理を依頼する
→ (シート1の1行1列目の)セルの処理をする受付窓口の番号を教わる
- 「セルの処理をする」受付窓口に行き「.setValue(2)」の処理を依頼する
→ (シート1の1行1列目の)セルに書き込みが行われる
今回行われている処理で覚えるべきポイント
今回の処理のポイントは2つあります。
- 「.」でつながれた各段階で、次の処理を行う「受付窓口の番号」を受け取っていること
- その値を使って後続の処理を行っているところ
特に、受け取る値が、シートやセルそのものではなく、シートやセルの処理を行う「受付窓口の番号」であることが、非常に重要です。
非常に重要ですので、ぜひ、覚えておいてください。
上級者向け説明(内部動作)
先ほどのたとえを、本来の書き方で書いてみます。
「SpreadsheetApp」オブジェクトを使う
GASでは、スプレッドシートの処理をするために必要な操作や情報を1セットにまとめた「SpreadsheetApp」オブジェクトが準備されています。
「SpreadsheetApp」オブジェクトに限らず、特定のデータを処理するために必要な操作や情報を1セットにまとめたものを「オブジェクト」と呼びます。
また、1セットにまとめられたもののうち、操作を「メソッド」、情報を「プロパティ」と呼ぶことにします。
GAS(JavaScript)では、オブジェクトの場所は、アドレスと呼ばれる番号で管理をしています。
たとえば、今回の例では、アドレスが「2」の場所に「SpreadsheetApp」オブジェクトがあるものと考えてください。
「SpreadsheetApp」オブジェクトの「getActiveSheet」メソッドを呼び出す
そこで、その「SpreadsheetApp」オブジェクトに準備されている「getActiveSheet」メソッドを呼び出しましょう。
メソッドは「getActiveSheet()」のように末尾に「()」を付けて呼び出します。
つまり「SpreadsheetApp.getActiveSheet()」で、「SpreadsheetApp」オブジェクトの「getActiveSheet」メソッドを呼び出すという意味になります。
すると、アクティブシート(=「シート1」シート)を操作できる「Sheet」オブジェクト(※)が得られます。
(※)正確には、「Sheet」オブジェクトそのものではなく、「Sheet」オブジェクトがある場所の情報(=アドレス)が得られます。この情報のことを参照といいます。
「Sheet」オブジェクトの「getRange」メソッドを呼び出す
このようにして得られた「Sheet」オブジェクトの「getRange」メソッドを呼び出します。
「getRange」メソッドを呼び出すときには、どのセルを操作したいかの情報を指定する必要があります。そこで、「getRange(1, 1)」というように、getRangeの後に括弧で囲んで、操作をしたいセルの行、列を指定します。
すると、「シート1」シートの1行1列目のセルを操作できる「Range」オブジェクト(※)が得られます。
(※)繰り返しになりますが、正確には「Range」オブジェクトそのものではなく、「Range」オブジェクトの参照が得られることに注意してください。
「Range」オブジェクトの「getRange」メソッドを呼び出す
最後に、その「Range」オブジェクトに対して、「.setValue(2)」で、「2」という値を記入するように指示をしています。
その結果、アクティブシートの1行1列目のセルに「2」という値を記入することができるのです。