GASでセルに「2」を書き込むプログラムの意味を理解しよう

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)を操作したいです」と伝えましょう。

すると、その窓口の担当者は、奥に行ってガサゴソと作業をしたあと戻ってきて言いました。

担当者:「アクティブシートであるシート1の管理をする窓口で、担当者がお待ちしています。6番の受付窓口に行ってください」

言われた受付窓口に行って「.getRange(1, 1)」の操作を依頼する

そこで、6番窓口に行ってみましょう。そこには《「シート1」》の受付窓口」があります。

そこで、その窓口の担当者に「1行1列目のセルの操作をしたいです」と伝えましょう。

すると、担当者は、奥に行ってガサゴソと作業をしたあと戻ってきて言いました。

担当者:「シート1の1行1列目のセルを操作する窓口で、担当者がお待ちしています。10番の受付窓口に行ってください」

言われた受付窓口に行って「.setValue(2)」の操作を依頼する

今回も、言われた10番の受付窓口に行ってみましょう。そこには《シート1の1行1列目のセルを操作する窓口》」があります。

そこで、その窓口の担当者に「セルに2という値を書き込みたいです」と伝えましょう。

すると、担当者さんは、奥に行ってガサゴソと作業をしたあと戻ってきて言いました。

担当者:「値を書き込んでおきました。」

これで、セルに書き込む操作が終わりました。

今回の処理の流れをまとめると、「受付窓口の番号」を次々に受け取って、処理をすすめていることがわかります。

  • 「SpreadsheetApp」の受付窓口に行き「.getActiveSheet()」の処理を依頼する
    → アクティブシート(=シート1)の処理をする受付窓口の番号を教わる
     
  • 「シートの処理をする」受付窓口に行き「.getRange(1, 1)」の処理を依頼する
    → (シート1の1行1列目の)セルの処理をする受付窓口の番号を教わる
     
  • 「セルの処理をする」受付窓口に行き「.setValue(2)」の処理を依頼する
    → (シート1の1行1列目の)セルに書き込みが行われる

今回行われている処理で覚えるべきポイント

今回の処理のポイントは2つあります。

  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」という値を記入することができるのです。