どうも。つじけ(tsujikenzo)です。このシリーズでは、2021年2月から始まりました「ノンプロ研GAS初級講座8期」について、講座内では伝えきれなかったことなどを、全8回でお届けします。今日は第4回(Day3)です。
前回のおさらい
前回は「制御構文」ということで、if文やswitch文による条件分岐、for文やwhile文によるループ処理をお届けしました。
今日は「関数」と「配列」についてですね。個人的に一番好きな回です。
今日のアジェンダ
- 関数
- 配列
関数
「関数」は英語で「Function」ですが、そこには、何かの処理をしてくれるプログラム(コード)が書かれているとイメージしてください。
みなさんのキーボードには「Functionキー」があると思いますが、押すと「音量をあげる」とか「ディスプレイを切り替える」のような操作をしてくれますよね。これは、「キーを押すとそこに書かれているプログラムが実行される」ということです。
そして、引数だけでなく、処理が終わったらその成果物として、関数から値を受け取る設定にもできます。この、関数から受け取るものを「戻り値(もどりち)」と呼びます。
関数の種類
ここで、関数の種類について整理してみましょう。今までみなさんが書いてきたコードは、「myFunction○○」という関数だったと思います。
//A.定数nameを定義する関数 function myFunctionA(){ const name; } //B.定数nameに’つじけ’を代入してログ出力する関数 function myFunctionB(){ const name = ‘つじけ’ console.log(name); }それだけでなく、関数には「引数」や「戻り値」を設定することができます。
//C.関数myFunctionに素材(値)を与えてnameに代入してログ出力する関数 function myFunctionC(x){ const name = x; console.log(name); } //D.関数myFunctionに素材(値)を与えてnameに代入して戻り値として得る関数 function myFunctionD(x){ const name = x; return name; }
引数と仮引数
先ほど「何か素材(値)を与えると」と言いましたが、関数には値を渡すことができます。
引数と仮引数のことを英語で「paramater」「argument」 と言いますが、厳密にどっちがどっちという決着はつけません。引数も仮引数もどっちもパラメーターと言えるし、オーギュメントとも言えるからです。
ただ、一般的には、
- 関数を呼び出す時に渡す値の事を実引数(じつひきすう)「パラメーター」
- 関数定義されて待ち構えてる引数を仮引数(かりひきすう)「オーギュメント」
と区別してる気もします。今後他の人のコードを見て[param][arg]なんて変数名を見つけたら「GAS初級講座の3日目で習ったやつだ」と思ってください。
戻り値
関数の中にreturnを置くと、そこで処理が止まって、その時点でreturnに定義されてる値を返す仕組みになってます。
//E.myFunctionを実行して関数getName()に’つじけ’を渡すと’つじけ先生’に変換してくれる function myFunction(){ const value = getName(‘つじけ’); console.log(value); } function getName(x){ const name = x; return name + ‘先生’; }
戻り値とログ出力の関係
次の2つのスクリプトは、同じ結果になります。
//一つ目 function myFunction(){ getHoge(); } function getHoge(){ console.log('hoge'); } //二つ目 function myFunction(){ console.log(getHoge()); } function getHoge(){ return 'hoge'; }この、どちらの書き方が正しいのかという話ですが、『関数とは戻り値を持つ』と考えた方が後々の学習にとって良い結果を生むと思います。何度も使うような処理は関数化(パーツ化)していきますし、メンテナンスしやすい方がいいです。
function getHoge(){ return 'hoge'; }と定義しておいた方が、console.log()でログ出力したり、関数からreturnさせた戻り値を変数に格納したりできます。
function myFunction(){ const x = getHoge(); }
関数リテラル
2点だけ補足すると、関数リテラルを変数に代入した時は、変数名()で呼び出すことができます。今までこのように変数は変数名オンリーで呼び出していました。
function myFunction(){ const name = ‘つじけ’ console.log(name); }しかし、変数に関数が代入されることにより、変数()で呼び出すようになったのです。テキストではconst 関数名 =と書いてますね。
function myFunction(){ const name = (x) => { return x + ‘様’; } const result = name(‘つじけ’); console.log(result); }もう一つは記述順です。呼び出し関数は関数定義の後に書かないとエラーになってしまいます。
アロー関数
アロー関数は、記法を省略することができるため、さまざま形で目にする機会があると思います。決して怖がらずに、コード中に=>が登場したら「アロー関数だ!」と思って間違いありませんので、=> 以降のパターンを覚えてしまいましょう。
//{}とreturnを省略する const getArea = (width, height) => width * height; console.log(getArea(10,2));//20 //引数が一つの場合は()も省略する const getExponent = number => number ** 4; console.log(getExponent(2));//16 //引数がない場合は()が必要 const getHello = () => console.log('Hello GAS!'); getHello();//'Hello GAS!'
配列
今後、GASで様々なデータを扱っていきますが、複数の要素を扱うのに便利なのが配列とオブジェクトです。
リテラル(型を認識してもらう為の書き方のルール)は、
配列・・・・・・角カッコ[]で囲って、中の値はカンマ区切り。1つ1つの値を要素と呼ぶ。
オブジェクト・・波カッコ{}で囲って、中の値はキーとバリューがコロン:でセットになっていてカンマ区切り。1つ1つの値をプロパティと呼ぶ。
です。コードを動かすのに必要なミニマムデータをリテラルに書けるように反復練習しましょう。慣れが大事です。
変数名のヒント
配列やオブジェクトを変数に代入する際は、複数系を使うなど、中にどんな値が代入されているのか読みやすい工夫を心掛けましょう。あとで要素を取り出して変数に格納する際に便利です。
const members = [‘Bob’, ‘Tom’, John]; const values = [10,20,30]; const member = members[0]; const value = values[0];
配列の型はobject
そんな配列とオブジェクトですが、実は配列型というデータ型があるわけではなく、配列はオブジェクト型です。typeof演算子で型を確認してみましょう。
const numbers = [10, 20, 30]; console.log(typeof numbers); //object・Array型があるわけじゃない。
・実は配列もオブジェクト型で、実際の中身はインデックスをキー、要素をバリューとしたオブジェクトになってるから。
というわけです。
const numbers = [10, 20, 30]; //中身はindex:valueになっている→{0:10, 1:20, 3:30}
for of文でなぜconstが使えるのか
for文(カウント変数型)とfor文(for of文)の挙動は少し異なります。
- for文(カウント変数型)・・カウント変数が条件式によってfalseを返すまで回す
- for文(for of文)・・・・・イテラブルオブジェクトを回してfalseを返すまで回す
//for文(カウント変数型) for (let i = 1; i<10; i++) { //iが1から始まって10になるまで{}の中の処理を回す } //for文(for of文) for (const イテラブルオブジェクトの1要素 of イテラブルオブジェクト) { //イテラブルオブジェクトから1要素を取り出して{}の処理を回す }for of文はループが終わるまでブロックスコープ{}を毎回生成しています。ブロックスコープを毎回生成しているということは、再代入しているわけではありませんので、constでいいのです。
上達のコツはfor of文を作成する時に、変数名を分かりやすく付けることです。意識してみてください。
for (const member of members) { //処理 } for (const value of values) { //処理 } for (const element of elements) { //処理 }
カウント変数型とfor of文のfor文の使い分け
for of文は短くて読みやすいので便利ですが、カウント変数型のように配列のインデックスを操作(例えばインデックス1からループを始めるなど)する為には、配列.entries()メソッドを使う必要があります。(※entries()メソッドは中級で習います)
let numbers = [10,20,30]; for (const [index, number] of numbers.entries()){ if (index 0 && index < 2 ) console.log(number); //20 }この場合はカウント変数型の方が読みやすそうですね。
numbers = [10,20,30]; for(let i = 1; i< 2; i++){ console.log(numbers[i]); //20 }for of文を習得するとfor ofで書くことが多くなっていくと思いますが、カウント変数型で書くかどうか迷ったら「配列のインデックスをループ処理の中で使いたいかどうか」というのを基準にしてみてください。
まとめ
以上で、「関数・配列」についてでした。スクリプトエディタを立ち上げたときに1つ用意されているmyFunctionですが、これが関数であり、GASの実行単位になっていることを理解したときはおもわず「なるほど」と叫びました。笑。
配列もスプレッドシートと相性がよく、配列に要素を足したり抜いたり、これからいろいろな処理を行うことになります。応用編としていろんなことができていきますので、基礎の書き方はしっかり身に着けていきましょう。
次回はいよいよ「オブジェクト」です。お楽しみに。
このシリーズの目次
- [ノンプロ研]GAS初級講座8期 事前課題
- [ノンプロ研]GAS初級講座8期DAY1補講 はじめてのGAS、変数、演算、データ型
- [ノンプロ研]GAS初級講座8期DAY2補講 制御構文
- [ノンプロ研]GAS初級講座8期DAY3補講 関数・配列
- [ノンプロ研]GAS初級講座8期DAY4補講 オブジェクト・GASの世界
- [ノンプロ研]GAS初級講座8期DAY5補講 スプレッドシートの操作 基本編
- [ノンプロ研]GAS初級講座8期DAY6補講 スプレッドシートの操作・実践編
- [GAS]スプレッドシートのセル考察 ~A1Notationってなに~ [前編]
- [GAS]スプレッドシートのセル考察 ~getRange()メソッドとセルアドレスリテラル~ [後編]