見出し画像

【GAS】初級の復習 その2(関数)

▼前回のエントリーの続き。

勉強時間を決めた

スローペースではあるけれど、少しずつGAS初級の復習を進めている。「在宅勤務日の始業前は必ずGASの復習をする時間」と決めた。今は出社するのは週に1回(多くても2回)なので、週に4回は時間を取れる。朝8時から始業までがGASの時間。フレックスなので始業時間は自由だけれど、だいたい1時間くらい復習して、キリの良いところで仕事を開始するルーティン。

苦手な関数の復習

初心者講座で最も苦手意識を持ってしまった関数について復習した。関数が苦手って、かなり致命的。
関数が書けないと、スクリプトが動かないよ〜(꒪ཫ꒪; ) 
なのにこれまで見て見ぬフリをしてしまっていた。

いや、まぁ、単なる関数の宣言はさすがに書けますよ(↓)。

function myFunction(){
 console.log(`Hello!World`);
}

ただ、それ以外の理解がどうにもあやふや。前回までの復習はさらっと流していたけれど、関数のところは時間をかけてじっくりめっこり取り組んだ。

ところで、なんでプログラミングの第一歩は、どんな教材でも"Hello!World"なんだろう。定番というか無難というか。「おでんといえば大根」みたいな感じかな。(ちくわぶ派)

で、ググってみたら最初に発刊されたC言語のプログラミング本が起源らしい(ネット情報なので真偽は不明)。「Hello World プログラミング」と検索したら、ご丁寧にも「Hello World プログラミング なぜ」とレコメンドが出てきた。

画像1


さて、与太話はこの辺にしておき、今回も復習メモを備忘として残しておく。

引数と仮引数

仮引数はどんな名前でもよくて、なんなら引数と同じ名前でも良い。

これは講座の途中でちらりと言われて、「そうなのかー!」と思った記憶がある。なので、知ってはいたけれど引数と仮引数が同じ名前の方がコードとして読みやすいのかどうかは、ちょっと定かではない。私は常に同じ名前にしているけど、どっちが引数でどっちが仮引数なのか自分でも混乱するときがあり、GASの理解を深める観点では良くない気もしている。

引数と戻り値

引数と戻り値の概念は一応理解できている。ただ、実際の処理をどちらの関数に書けばいいのかがわからなくなることがあり、パターンを変えてコードを書いて試してみた。

function myFunction3_03({
 console.log(calcRemainder(93)); //0
 console.log(calcRemainder(152)); //1
}

function calcRemainder(x, y{
 return x % y;
}
function myFunction3_03_02({
 calcRemainder_(93); //0
 calcRemainder_(152); //1
}

function calcRemainder_(x, y{
 return console.log(x % y);
}

▲引数として2つの整数を渡して、剰余を戻り値として返す関数

どちらに命令文(console.logの処理)を書くかという話。結果は同じなんだけど、実務で作る際はどちらが適切なのだろうか。コードの読みやすさや、作りたいツールの目的やフローによって判断するのだろうけれど、この辺がまだ腹落ちしていないというか、自分のものになっていない気がする。
「こう考えるといいよ!」というアドバイスをお持ちの方、ぜひコメントお待ちしています。

戻り値をブール値で返す

「引数として整数を渡して、偶数ならtrue、そうでないならfalseを戻り値として返す関数を作成しましょう」という例題。

function myFunction3_04({
 console.log(isEvenNumber(3));
 console.log(isEvenNumber(8));
}

function isEvenNumber(x{
 return x % 2 === 0;
}

これは今回はすぐに書けたけど、初級を受けたときは「if文使うのかな・・?」と大パニックになった記憶がある。少しは成長したかな^^

関数リテラル

この辺からいよいよあやしくなってくる領域。気合入れて集中して講座(動画)を見る。

関数リテラルのルール
・先頭に「function」は付けない
・関数名を書かない、いきなり()から始まる

用途
・関数を変数に格納する
・引数として渡せる(コールバック関数)
・オブジェクトのプロパティに格納できる(メソッド定義)

まず、関数名を書かないのに関数であるということを理解する。用途についても、中級を受けて(100%ではないものの)なんとなくわかり、少しずつ伏線が回収されていく感覚。当時はオブジェクトもプロパティもコールバック関数も知らないし、引数も習ったばかりで、「引数として関数を渡す!?」「引数に関数を入れてさらに他の関数に渡すってこと!?」と大混乱した記憶がある。

関数は宣言や呼び出しだけでなく、リテラルで書ける、ということを概念として再認識し、次に進む。

アロー関数・・・の前に

講座ではここでアロー関数の説明に入るのだけれど、GAS本に重要な解説が載っていることに気づく。あ、GAS本は第3版が発売になったそうですよ!みんなのバイブル!


関数リテラルの定義

function(仮引数1,仮引数2,...){
 //処理
}
const sayHello_ = function(){
 console.log(`Hello!`);
}

function sayGoodBye(){
 sayHello_();
 console.log(`GoodBye`);
}

知らなかったよーーーーーー!こんなコードはお見かけしないし、普通こういう書き方はしないのだろうけど、変数に格納するという意味でこのコード例は理解しやすい。さすが高橋先生。あざます。

アロー関数

からのアロー関数。みんなが苦手な(決めつけ)アロー関数。まずは基本形から。

const 関数名 = (仮引数1, 仮引数2,…) => {
 //処理
 return 戻り値;
}; 
function myFunction3_05(){
 const sayHello = () => {
   console.log(`Hello!`);
 }

 sayHello();
 console.log(`GoodBye`);
}

関数リテラルは「関数名を書かないで、いきなり()から始まる」という上述の説明があって、なんかやっとアロー関数を理解できた。
初級を受けたときは、▲のコードを見て、どこからが関数なのかがよく分かってなかった。アローの前の()からが関数なのね。本当に今さらだけれどやっと分かったぜよ。。。sayHelloという定数に名前のない関数を格納しているのね。ふむふむ。

アロー関数の省略

仮引数が1つだけのときは()を省略できる
仮引数がない場合や2つ以上のときは()を省略できない
処理がreturnだけのときはreturnと{}を省略できる

これも知ってはいる。けれど使いこなせていないし、人の書いたコードでアロー関数が出てくるとまだ混乱する。でも概念としては理解できたので、これからは見て見ぬフリをせずにこのnoteを読み返そうと思う。

function myFunction3_06({

 const calcArea = x => x ** 2;
 console.log(calcArea(3));
}
function myFunction3_06({

 const calcArea = (x) => {
   return x ** 2;
 }
 console.log(calcArea(3));
}

▲上が省略形のアロー関数、下が省略しないアロー関数


上述の「引数として整数を渡して、偶数ならtrue、そうでないならfalseを戻り値として返す関数を作成しましょう」という例題をアロー関数で書くとこうなる。

function myFunction3_07({
 const isEvenNumber = x => x % 2 === 0;
 console.log(isEvenNumber(3));
}

めっちゃ短い!スマート!!

復習をしてみて関数への苦手意識はだいぶ払拭されてきた。アロー関数はどんなときに使うのか、いまいちイメージが湧いていないけれど、頑張って取り入れていこうと思う。


追記

GAS講座のつじけ先生から早速コメントをいただいたのでメモとして追記。

関数は「引数を受け取って戻り値を返す機能」と定義できます。
ということは、関数にログ出力させる処理をもたせるより、関数ではreturnさせて、呼び出し側でログ出力させるといいでしょうね。

つじけ先生のブログはこちら▼
https://tgg.jugani-japan.com/tsujike/

この記事が気に入ったらサポートをしてみませんか?