皆さんこんにちは。HiroCom777です。このたびノンプロ研のGAS(Google Apps Script)中級講座を受講することと相成りました。振り返ってみると、初級を受講したのが2023年の12月でした。普段ほとんどGASを使わないのですが、ノンプロ研技術同人誌のお手伝いでGASを理解する必要が出てきたため学んでいます。前回のブログに記録を残しています。
今回、VBA、Pythonに続いてノンプロ研で学んでいるプログラミング中級講座で最後の受講となります。

中級の知識をマスターすることで、他言語の知識と相互に補強していきたいと考えています。
どうして受講を決意したのか
今回、VBA、Pythonに続いてノンプロ研で学んでいるプログラミング中級講座で最後の受講となります。中級の知識をマスターすることで、他言語の知識と相互に補強していきたいと考えています。
GAS中級講座
今回受講する講座は、GASの応用を学ぶ中級講座。カリキュラムは全部で5つ(+卒業ライトニングトーク大会)です。
- スコープと関数
- クラス・ライブラリ
- 組み込みオブジェクト
- Utility Services 1
- Utility Services 2
2週間に1つずつ学んでいきます。
スコープと関数
今回はスコープと関数です。
スコープ
GASのスクリプトには、「グローバル領域」と「ローカル領域」があります。グローバル領域は関数に含まれない領域、ローカル領域は関数内の領域です。以下のようになります。
// グローバル領域
function 関数() {
// ローカル領域
}
関数を実行すると、先にグローバル領域のコードがすべて実行されます(別ファイルでも実行されます)。続いて呼び出された関数が実行されます。コード全体がわかりづらくなるので、グローバル領域にむやみにコードを書いてはいけません。
スコープとは、変数・定数・関数などを使用できる範囲のことです。3つのスコープがあります。
ブロックスコープ
現在の{}で囲まれたブロック内ローカルスコープ
宣言した関数内グローバルスコープ
プロジェクト全体
ブロックとは、{}で囲って処理をグループ化したものです。{}で囲った任意の処理や、分岐、反復などの処理を指します。ブロック化することでスコープを閉じることができ、変数・定数などの命名・管理が楽になります。
スコープ内で宣言した変数・定数(varで宣言したものを除く)はスコープ外では使用できません。スコープの外で宣言した変数・定数は、スコープ内でも使用できますが、上下のスコープで名前がバッティングしたときは、より小さいスコープが優先されます。また、varは通常使用することは推奨されません。varはブロックスコープを持たず、関数スコープで管理されるため意図しない参照が発生しやすいからです。
関数
初級講座でも関数について学びました。ここでは、初級で扱わなかった内容について見てきましょう。
メソッド
関数にもメソッドを定義できます。以下は税込みの金額を返すメソッドを関数内に記述した例です。
function myFunction() {
const tax = {
taxRate: 0.1,
getTaxInclude(price) {
return Math.floor(price * (1 + this.taxRate));
}
};
console.log(tax.getTaxInclude(100));
// 110
}
プライベート関数
関数名がアンダースコア「_」で終わる関数はプロジェクト外からは呼び出せません。プロジェクトのプルダウンリストにも出てきません。
function 関数名_(仮引数1, 仮引数2,...) {
//処理
return 戻り値;
}
引数
関数は呼び出し時に指定した引数が、仮引数に渡されます。引数と仮引数の数が合わない場合の挙動は以下のようになります。
- 数が合わなくても動く
- 引数の数 > 仮引数の数: 余った引数は捨てられる
- 引数の数 < 仮引数の数: 余った仮引数にはundefinedが返される
また、指定されなかった場合にデフォルト値を指定できます。これを「デフォルト引数」と言います。
function 関数名(,,, 仮引数[ = デフォルト値]) {
//処理
return 戻り値;
}
デフォルト引数には、以下のルールがあります。
- 値が未指定(undefined)の時に適用される
- デフォルト引数は任意の位置に定義できるが、可読性のため後ろに配置することが一般的
- 左側で定義された引数は、その後のデフォルト引数で利用できる
関数が不定数の引数を配列として受け入れることができます。これを「残余引数」といいます。
function 関数名(,,, ...仮引数x) {
//処理
return 戻り値;
}
残余引数には、以下のルールがあります。
- 関数定義は、残余引数を1つしか持つことができない
- 残余引数は関数定義において最後の引数でなければならない
- 残余引数の後に末尾カンマは許可されない
- 残余引数はデフォルト値を持つことができない
値渡し、参照の値渡し
仮引数に渡されたデータは、データの種類によって渡し方が異なります。
プリミティブ
プリミティブとはデータを処理する上での最小単位、基本データ型のことです。数値、文字列、ブール値等が該当します。この場合、引数の値が仮引数に複製されて関数内では複製された値が使用されます。これを「値渡し」と言います。オブジェクト
オブジェクトは参照先が渡されるため、関数内で内容を変更すると呼び出し元にも影響します。これを「参照の値渡し」と言います。
値渡しでは関数内で仮引数を変更しても、引数自体には影響ありません。
function myFunction() {
const coFunction = (y1, y2) => {
y1 += 1;
y2[0] += 1;
};
const x1 = 10, x2 = [10];
coFunction(x1, x2);
console.log(`x1:${x1},x2:${x2}`);
// x1:10,x2:11
}
この例では、x1(数値型)は値渡しのため関数内の処理は影響ありません。対してx2(配列)はオブジェクトなので参照の値渡しになります。関数内の処理によってx2の値も変わります。
次回はクラス・ライブラリ
いかがでしょうか。今回はスコープと関数について見ていきました。次回はクラス・ライブラリです。お楽しみに!!





