見出し画像

復習 中級講座GASコース 01「スコープと関数」

8/30(金)から1回目開始。回ごとのアウトプットを兼ねて復習。
講座は2週間おきと期間空くけど内容が難しめ。
ヘッダー画像ないのも寂しいので、Canvaで試しに作成。


講座のゴール

GASの開発・保守を楽に&スマートにできる知識とスキルを身につける
何個か作って実際に動かしてるけど、作るのに時間かかるし保守まで考慮しきれていない。この講座でそこら辺の知識を付けて、文字通り楽に&スマートに行えるよう勉強する。

スコープ

コードの領域

初級の時は関数内にのみコードを書いていた。この関数内の領域のことをローカル領域と言って、関数の呼び出し時に実行される。
逆に関数外のグローバル領域にもコードを書くことができる。グローバル領域に書いたコードは、関数実行前に「全て」実行されてから関数が実行される。
1.グローバル領域のコードを全て実行(別ファイルでも実行される)
2.呼び出した関数のコードを実行


Q:複数ファイルのグローバル領域に書いた時の実行順は?
ファイルの並び順はこの順。myFunction1_01を実行すると、

// 1_00.gs
console.log(`1_00グローバル:${msg}`);

// 1_01.gs
var msg = 'Hello!';
function myFunction1_01() {
  console.log(`1_01ローカル:${msg}`);
}
console.log(`1_01グローバル:${msg}`);

// 1_02.gs
console.log(`1_02グローバル:${msg}`);

実行結果から、グローバル領域のコードはファイルの並び順の上から順番に全て実行された後に、関数を実行してるのがわかる。

スコープとは

変数・定数や関数を使用できる範囲で、以下の3つがある。
ブロックスコープ:{ }の範囲内でのみ使用可

{ } の範囲内のことをブロックと呼ぶ

ローカルスコープ:宣言した関数内でのみ使用可

functionのブロック内

グローバルスコープ:プロジェクト全体から使用可

上記2つ以外は全部これに当てはまる

むやみにグローバルスコープに書いてはいけない理由

・全部が毎回実行される
・プロジェクト全体から影響を受ける
・変数名が被りやすくなる(異なるスコープ間で名前が被った場合、小さいスコープが優先される)
・宣言と使用位置が遠くなる(可読性が下がる)

一見便利に感じるけどデメリットも相応にあるので、理解して使用するのが大事。
自分の場合は1つだけグローバル用のファイルを用意して、共通で使用する定数だけをまとめるってことは結構やるけど、当たり前のように使ってしまってるから注意しないとな・・・。

関数

関数化のメリット

講座で出てきたサンプルコード。
どちらも同じ動きをするけど、処理の書き方で違いがある。

console.log内で処理を書いてるパターン
処理部分を関数化して分けてるパターン

1_06の場合はconsole.log内に直接処理を書いており、行数は短いが
・主処理以外も意識する必要が出てくる
・読みづらい
・再利用性、メンテナンス性が低い
など色々デメリットが大きい。

1_07の場合は処理を関数化して呼び出せるように書いており、行数は多いが
・主処理以外を意識しなくてすむ
・読みやすい
・再利用性、メンテナンス性が高い
などメリットが大きい。

プライベート関数

関数名の最後にアンダーバー「_」を付けると、関数選択のプルダウンに表示されない。

特定の関数からしか呼び出さない時などに付ける

引数と仮引数の数

関数間で情報を渡すための引数と仮引数。実は数が合わなくても動く
・引数の数 > 仮引数の数: 余った引数は捨てられる
・引数の数 < 仮引数の数: 余った仮引数にはundefined

下のルールについてはそら引数に設定してないならundefinedかー確かにと思ったけど、処理に必須な情報を引数として渡すんだからどっちにしろ処理途中でエラーにはなるよな・・・。
そしてそんな時に使えるのが次のやつ。

デフォルト引数

function 関数名(, ...仮引数[ = 値]) {
引数がない場合に、仮引数に規定値(初期値)を設定できる
仮引数にundefined以外を設定できるので引数が不足していてもエラーを吐かずに処理を動かせる。
関数とかで任意の引数とかよくあって疑問だったけど、これ知って納得。自分でも同じように作れるのは良き。

残余引数

function 関数名(..., ...仮引数x) {
逆に引数が多くて余る時に、配列として受け取る事もできる。
あんまり使うイメージはわかないけど、引数の数が不明な場合とかに使えそう?

値渡しと参照渡し

引数の渡し方は2種類ある。

対象はプリミティブ値(数値、文字列、ブール値)
同じ値をコピーして別物として取り扱う為、操作がお互いに影響しない
対象はオブジェクト
コピーはせずに同じ場所を見る為、操作がお互いに影響する

配列もオブジェクト扱いなので参照渡しとなる。
自分がこれに沼ったのは配列と日付の時。この知識がなかったため値渡しの間隔で渡し、結果が呼び出し元にも影響していて混乱した・・・。
この仕様は変えられないので、元のオブジェクトに影響を与えたくないならオブジェクトのコピーを取って、コピーを引数として渡す方法で影響を与えずに済む。

ドキュメンテーションコメント

緑色の部分
関数の概要は必ず。引数・戻り値の説明はあれば書く

関数の処理の概要、引数、戻り値などを簡潔に説明する為のコメント。
関数をざっくり理解できるので、開発や保守時の可読性向上につながる。
書くのは少し面倒だけど、コードを全部読み解く羽目になるより全然マシ。

まとめ

スコープの所では、グローバルスコープは注意というのは再認識。
グローバルファイルにまとめるのも、本当に必要かを考えて作らないとな。
関数の所だと、関数化は別関数にするのが面倒で直接書いたりしちゃってる時もあるので、そういうのはアロー関数を活用する。
引数の数、デフォルト引数、残余引数はすんなり理解できたし利便性高いなと感じたので、使える場面ではどんどん使っていく。

次回:クラス・ライブラリ

VBAではクラスを理解できなかったので、GASで理解できるといいなあ。

いいなと思ったら応援しよう!