見出し画像

GAS中級講座 事前課題 その3

ネタバレ注意

中級講座受講中の方、このnoteみてコピペしちゃだめだよー。
このnoteでは課題内容に対してぶつぶつ言いながら取り組んでる私の脳内が展開されています。

前回のnote

初級講座受講時のnote


【課題2-3】3.関数、配列より

演習3-03 関数

引数として二つの整数を渡して、x,yとして受け取り、xをyで割ったときの余り(剰余)を戻り値として返す関数を作成しましょう。

まずは関数基本形。一部ではおなじみ、アジの開き加工場を頭に浮かべつつ、引数が渡されて、計算して、戻ってくる、という流れを確認する。

function lesson3_03() {
  console.log(surplus(4, 3));//関数名(引数1, 引数2,…)
}

function surplus(x, y) {//function 関数名(仮引数1, 仮引数2,…)
return x % y; //戻り値
}

演習3-04 関数(真偽判定)

引数として整数を渡して、xとして受け取り、その値は偶数ならtrue、そうでないならfalseを戻り値として返す関数を作成しましょう。

先ほどの基本形に加えて、TURE/FALSEで返すパターン。

関数でTURE/FALSEを取るため、===の比較演算子を使った。
console.log をどこに置くかで、最初は戸惑った。

// 演習3-04 関数
// 引数として整数を渡して、xとして受け取り、その値は偶数ならtrue、そうでないならfalseを戻り値として返す関数を作成しましょう。
function lesson3_04() {
 console.log(isEvenNum(5));//false
 console.log(isEvenNum(6));//true
}
function isEvenNum(x) {
 return x % 2 === 0; //2で割りきれる=偶数=true
}

演習3-07 アロー関数

引数として整数を渡して、xとして受け取り、その値は偶数ならtrue、そうでないならfalseを戻り値として返す関数を、アロー関数で作成しましょう。

アロー関数は諳んじることができないので、構文見ながら書いてます。

// 演習3-07 アロー関数
// 引数として整数を渡して、xとして受け取り、その値は偶数ならtrue、そうでないならfalseを戻り値として返す関数を、アロー関数で作成しましょう。

function lesson3_07() {
 const isEvenNum = x => x % 2 === 0;
 console.log(isEvenNum(5));
 console.log(isEvenNum(6));
}

// //アロー関数
// //基本形
// const isEvenNum = (x) =>{
//  return x % 2 === 0;
// }
// //仮引数1つ→()省略OK
// const isEvenNum = x =>{
//  return x % 2 === 0;
// }
// //戻り値1つ→{}とreturn省略OK
// const isEvenNum = x => x % 2 === 0;
// }

演習3-11 配列

以下の配列について、インデックスが大きい順にログ出力するスクリプトを作成してみましょう。
['Bob', 'Tom', 'Jay', 'Tom']

ここでいうインデックスは、[]の中の並び順のことである。
Bob=0、Tom=1、Jay=2, Tom=3 というインデックスになる。
※配列は0から数え始めることに注意。

インデックスが大きい順にログ出力する、つまり、
Tom
Jay
Tom
Bob
というように表示したい、ということだ。

3パターン考えてみた。

// 演習3-11
// 以下の配列について、インデックスが大きい順にログ出力するスクリプトを作成してみましょう。
// ['Bob', 'Tom', 'Jay', 'Tom']

//愚直version
function lesson3_11_a() {
 const members = ['Bob', 'Tom', 'Jay', 'Tom'];
 console.log(members[3]);
 console.log(members[2]);
 console.log(members[1]);
 console.log(members[0]);
}

//for version
function lesson3_11_b() {
 const members = ['Bob', 'Tom', 'Jay', 'Tom'];
 for (let i = members.length - 1; i >= 0; i--) {
   console.log(members[i]);
 }
}

//while version
function lesson3_11_c() {
 const members = ['Bob', 'Tom', 'Jay', 'Tom'];
 let i = members.length - 1;
 while (i >= 0) {
   console.log(members[i]);
   i--;
 }
}

愚直versionは、[3]のように配列を指定して大きい順に表示している。
for やwhileでは、members.lengthを利用して、繰り返しの処理として表示する。lengthは、今回の場合は4となるので、配列の最大値3と1つズレる。

演習3-13 配列

以下の二次元配列を定数numbersに格納して、numbers[0][0],numbers[0][1],…,numbers[2][0]をそれぞれ出力するスクリプトを作成してみましょう。
for文やfor...of文のネストを使ってみましょう。

画像1

まずはnumbersをconstする。それぞれのグループごとに[]に入れるイメージ。

const numbers = [[10, 30, 20, 40], [11, 31, 21], [12]];

で、まずは普通に愚直に書くとこうなる。

function lesson3_13_a() {
 const numbers = [[10, 30, 20, 40], [11, 31, 21], [12]];
 console.log(numbers[0][0]);
 console.log(numbers[0][1]);
 console.log(numbers[0][2]);
 console.log(numbers[0][3]);
 
 console.log(numbers[1][0]);
 console.log(numbers[1][1]);
 console.log(numbers[1][2]);
 
 console.log(numbers[2][0]);
}

こういう、似たような行が続くときには、
行のコピーのショートカット Shift + Alt + ↓または↑ が使える。

ショートカットは、スクリプトエディタを開いているときにF1キーで確認することができる。

画像2

for文をすっとばしてfor of

//for of 文
function lesson3_13_c() {
 const numbers = [[10, 30, 20, 40], [11, 31, 21], [12]];
 for (number of numbers) {
   for (num of number) {
     console.log(num);
   }
 }
}

for of のすっきり簡単さを知ってしまうと、普通にfor書くのがかったるく感じられる。num of number がミソというか、こう書くの最初わかんなかった。

で、for文。

最初、このような間違いコードを書いた。

//for文
function lesson3_13_b() {
 const numbers = [[10, 30, 20, 40], [11, 31, 21], [12]];
 for (i = 0; i <= numbers.length - 1; i = i + 1) {
   for (j = 0; j <= numbers.length - 1; j = j + 1) {
     console.log(numbers[i][j]);
   }
 }
}

これだと、配列の外側と内側とで、なんていうのか、数えるときの合わなくなる。

画像3

で、書き直してこうなる。j <= numbers[i].length - 1 として、numbers[i].length にするのがミソ。

//for文
function lesson3_13_b() {
 const numbers = [[10, 30, 20, 40], [11, 31, 21], [12]];
 for (i = 0; i <= numbers.length - 1; i = i + 1) {
   for (j = 0; j <= numbers[i].length - 1; j = j + 1) {
     console.log(numbers[i][j]);
   }
 }
}

演習3-14 配列と関数

以下のように配列を引数として渡すと、その要素数を戻り値として返す関数lenArrayを作成してみましょう。
function myFunction3_14(){
const members1 = ['Bob', 'Tom', 'Jay'];
console.log(lenArray(members1)); //3
const members2 = [['Bob', 'Tom', 'jay']];
console.log(lenArray(members2)); //1
}

配列の関数の合わせ技。

うーん、やっぱ最初にふつーに書いて、それからアローの構文見て、なんとかアロー書けるって感じだなー。

// 演習3-14
// 以下のように配列を引数として渡すと、その要素数を戻り値として返す関数lenArrayを作成してみましょう。
// function myFunction3_14(){
//  const members1 = ['Bob', 'Tom', 'Jay'];
//  console.log(lenArray(members1)); //3
//  const members2 = [['Bob', 'Tom', 'jay']];
//  console.log(lenArray(members2)); //1
// }

function lesson3_14_a() {
 const members1 = ['Bob', 'Tom', 'Jay'];
 console.log(lenArray(members1)); //3
 const members2 = [['Bob', 'Tom', 'jay']];
 console.log(lenArray(members2)); //1
}
function lenArray(members) {
 return members.length;
}

//アロー関数省略形
function lesson3_14_b() {
 const lenArrayb = members => members.length;
 const members1 = ['Bob', 'Tom', 'Jay'];
 console.log(lenArrayb(members1)); //3
 const members2 = [['Bob', 'Tom', 'jay']];
 console.log(lenArrayb(members2)); //1
}


閑話休題 for of

入れ子になってるfor of の書き方が良く分からなくて、うーんとなっていた。たとえば、下記のように試したが、どれもworkするようだった。

//for of 文
function lesson3_13_c() {
 const numbers = [[10, 30, 20, 40], [11, 31, 21], [12]];
 for (number of numbers) {
   for (num of number) {
     console.log(num);
   }
 }
}

function lesson3_13_d() {
 const numbers = [[10, 30, 20, 40], [11, 31, 21], [12]];
 for (number of numbers) {
   for (value of number) {
     console.log(value);
   }
 }
}

function lesson3_13_e() {
 const members = [[10, 30, 20, 40], [11, 31, 21], [12]];
 for (number of members) {
   for (value of number) {
     console.log(value);
   }
 }
}

XXX of XXXs
value of XXX
num of XXX
のいずれかになる、ってことなんでしょうか?

さらに入れ子が深くなったときはどう名付けるんでしょうか?
2階層以上はfor of しないとか、設計がおかしいと考えたほうがいいのかもですが...
そもそも3次元配列をGASでどうするんだとか、ちょっと沼ってきたので、いったんここまでにしておきます!

続く。

【課題2-4】4.オブジェクト

【課題2-5】5.スプレッドシート・シート・セルの操作

【課題2-6】6.スプレッドシートの操作(実践編)

【課題3】全員参加型FizzBuzz問題リレー

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

good-sun(a03)
いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!