GASでプログラミング入門 Vol.10

# GASでプログラミング入門 Vol.10

社内サークルにてエンジニアから非エンジニアの方向けにプログラミングを教えるという活動を行っています。<br>
今回はその教材第10弾です。
前回の記事は[こちら](https://qiita.com/YoshinagaYuta/items/6a2001cd33d46c323021)

## 前回の演習問題の解答例

(1). 想定していた実行結果になるようにプログラムを修正して下さい。

```js
function myFunction(){
    let persons = [
        {name: "鈴木一郎", age: 30, birthday: "1990/04/02", hobby: "ドライブ"},
        {name: "山田太郎", age: 20, birthday: "2000/08/30", hobby: "登山"},
        {name: "佐藤花子", age: 24, birthday: "1996/05/10", hobby: "ショッピング"},
        {name: "田中次郎", age: 27, birthday: "1993/07/20", hobby: "スノーボード"},
        {name: "杉本沙耶香", age: 32, birthday: "1988/02/23", hobby: "アロマセラピー"},
        {name: "市井由美子", age: 26, birthday: "1994/03/03", hobby: "漫画"},
        {name: "鈴木一郎", age: 20, birthday: "2000/04/19", hobby: "ボルダリング"}
    ];
    let search = null;
    for(person of persons){
        if("鈴木一郎" == person.name){
            search = person;
            break;
        }
    }
    if(search == null){
        console.log("該当するユーザーが見つかりませんでした。");
    } else {
        console.log("ユーザー名：" + search.name);
        console.log("年齢：" + search.age);
        console.log("誕生日：" + search.birthday);
        console.log("趣味：" + search.hobby);
    }
}
```

想定していた実行結果

```
ユーザー名：鈴木一郎
年齢：20
誕生日：2000/04/19
趣味：ボルダリング
```

実際の実行結果

```
ユーザー名：鈴木一郎
年齢：30
誕生日：1990/04/02
趣味：ドライブ
```

解答例コード

```js
function myFunction(){
    let persons = [
        {name: "鈴木一郎", age: 30, birthday: "1990/04/02", hobby: "ドライブ"},
        {name: "山田太郎", age: 20, birthday: "2000/08/30", hobby: "登山"},
        {name: "佐藤花子", age: 24, birthday: "1996/05/10", hobby: "ショッピング"},
        {name: "田中次郎", age: 27, birthday: "1993/07/20", hobby: "スノーボード"},
        {name: "杉本沙耶香", age: 32, birthday: "1988/02/23", hobby: "アロマセラピー"},
        {name: "市井由美子", age: 26, birthday: "1994/03/03", hobby: "漫画"},
        {name: "鈴木一郎", age: 20, birthday: "2000/04/19", hobby: "ボルダリング"}
    ];
    let search = null;
    for(person of persons){
        if("鈴木一郎" == person.name && 20 == person.age){
            search = person;
            break;
        }
    }
    if(search == null){
        console.log("該当するユーザーが見つかりませんでした。");
    } else {
        console.log("ユーザー名：" + search.name);
        console.log("年齢：" + search.age);
        console.log("誕生日：" + search.birthday);
        console.log("趣味：" + search.hobby);
    }
}
```

(2). 下記のような実行結果になるようにプログラムを作成して下さい。
連想配列は下記のコードを使用して下さい。

```js
let persons = [
    {name: "鈴木一郎", age: 30, birthday: "1990/04/02", hobby: "ドライブ"},
    {name: "山田太郎", age: 20, birthday: "2000/08/30", hobby: "登山"},
    {name: "佐藤花子", age: 24, birthday: "1996/05/10", hobby: "ショッピング"},
    {name: "田中次郎", age: 27, birthday: "1993/07/20", hobby: "スノーボード"},
    {name: "杉本沙耶香", age: 32, birthday: "1988/02/23", hobby: "アロマセラピー"},
    {name: "市井由美子", age: 26, birthday: "1994/03/03", hobby: "漫画"},
    {name: "鈴木一郎", age: 20, birthday: "2000/04/19", hobby: "ボルダリング"}
];
```

実行結果

```
personsに含まれる人数は7人です。
personsの平均年齢は25.571428571428573才です。
```

解答例コード

```js
function myFunction(){
    let persons = [
        {name: "鈴木一郎", age: 30, birthday: "1990/04/02", hobby: "ドライブ"},
        {name: "山田太郎", age: 20, birthday: "2000/08/30", hobby: "登山"},
        {name: "佐藤花子", age: 24, birthday: "1996/05/10", hobby: "ショッピング"},
        {name: "田中次郎", age: 27, birthday: "1993/07/20", hobby: "スノーボード"},
        {name: "杉本沙耶香", age: 32, birthday: "1988/02/23", hobby: "アロマセラピー"},
        {name: "市井由美子", age: 26, birthday: "1994/03/03", hobby: "漫画"},
        {name: "鈴木一郎", age: 20, birthday: "2000/04/19", hobby: "ボルダリング"}
    ];
    let allAge = 0;
    let avgAge = 0;
    for(person of persons){
        allAge = allAge + person.age;
    }
    avgAge = allAge / persons.length;
    console.log("personsに含まれる人数は" + persons.length + "人です。");
    console.log("personsの平均年齢は" + avgAge + "才です。");
}
```

なお解答例はあくまで例なので、必ずしも上記のようになっていないといけないわけではありません。

## switch文

条件分岐にはif文以外にもswitch文というものがあります。
switch文は多分岐処理を書く際にif文よりも見やすくかけるメリットがあります。

```js
switch(変数名){
    case 条件式1:
        条件式1に合致した時に行う処理
        break
    case 条件式2:
        条件式2に合致した時に行う処理
        break
    ・
    ・
    ・
    default:
        いずれの条件にも合致しなかった時に行う処理
        break
}
```

switch文の文法は上記の通りです。
まずは条件式で比較する対象の変数名を記載し、case部にそれぞれの条件式を記載します。
そして、breakをcase内の最後に記載します。
breakは前回の講義でfor文の繰り返し処理を途中で終える際に使用するキーワードとして学習しましたが、switch文でもcase内の処理を終えた際に記載して、caseの処理を終えることを明示的にする必要があります。
なお、caseの最後にbreakを書かなかった場合には次のcaseも実行されてしまい、意図した動作にならないので、必ずbreakは記載します。

### if文で月判定処理を書いた例

```js
if(month == 1){
    console.log("1月です。");
} else if(month == 2) {
    console.log("2月です。");
} else if(month == 3) {
    console.log("3月です。");
} else if(month == 4) {
    console.log("4月です。");
} else if(month == 5) {
    console.log("5月です。");
} else if(month == 6) {
    console.log("6月です。");
} else if(month == 7) {
    console.log("7月です。");
} else if(month == 8) {
    console.log("8月です。");
} else if(month == 9) {
    console.log("9月です。");
} else if(month == 10) {
    console.log("10月です。");
} else if(month == 11) {
    console.log("11月です。");
} else if(month == 12) {
    console.log("12月です。");
} else {
    console.log("該当する月がありません。");
}
```

### switch文で月判定処理を書いた例

```js
switch(month){
    case 1:
        console.log("1月です。");
        break;
    case 2:
        console.log("2月です。");
        break;
    case 3:
        console.log("3月です。");
        break;
    case 4:
        console.log("4月です。");
        break;
    case 5:
        console.log("5月です。");
        break;
    case 6:
        console.log("6月です。");
        break;
    case 7:
        console.log("7月です。");
        break;
    case 8:
        console.log("8月です。");
        break;
    case 9:
        console.log("9月です。");
        break;
    case 10:
        console.log("10月です。");
        break;
    case 11:
        console.log("11月です。");
        break;
    case 12:
        console.log("12月です。");
        break;
    default:
        console.log("該当する月がありません。");
        break;
}
```

### switchであえてbreakを省略するパターン

breakをあえて省略することで、よりコードを簡潔にできる場合があります。
例えば、下記のような場合です。

```js
switch(month){
    case 3:
    case 4:
    case 5:
        console.log("春です。");
        break;
    case 6:
    case 7:
    case 8:
        console.log("夏です。");
        break;
    case 9:
    case 10:
    case 11:
        console.log("秋です。");
        break;
    case 12:
    case 1:
    case 2:
        console.log("冬です。");
        break;
    default:
        console.log("該当する季節がありません。");
        break;
}
```

上記のようにすると、変数monthが3,4,5のいずれかだった場合に「春です。」と出力されます。
もちろんbreakを省略せずに、それぞれのcaseに別々に処理を書くことで同一の結果を得ることも可能ですが、同じ処理を繰り返し書くことはプログラミングにおいてはあまりスマートではありません。
省略できるところは省略してコードを簡略化することを意識しましょう。

## 代入演算子

代入演算子の代表例は`=`で、今までにも沢山使用してきました。
基本ルールは左辺に対して右辺の式の結果を代入するというものでしたが、算術演算子と組み合わせることで、式を簡略化できます。

```js
let num = 1;
num += 1; // num = num + 1と同じ
num -= 1; // num = num - 1と同じ
num *= 2; // num = num * 2と同じ
num /= 2; // num = num / 2と同じ
```

また、前回の演習問題の平均年齢を出す計算式も下記のように簡略化することが可能です。

```js
function myFunction(){
    let persons = [
        {name: "鈴木一郎", age: 30, birthday: "1990/04/02", hobby: "ドライブ"},
        {name: "山田太郎", age: 20, birthday: "2000/08/30", hobby: "登山"},
        {name: "佐藤花子", age: 24, birthday: "1996/05/10", hobby: "ショッピング"},
        {name: "田中次郎", age: 27, birthday: "1993/07/20", hobby: "スノーボード"},
        {name: "杉本沙耶香", age: 32, birthday: "1988/02/23", hobby: "アロマセラピー"},
        {name: "市井由美子", age: 26, birthday: "1994/03/03", hobby: "漫画"},
        {name: "鈴木一郎", age: 20, birthday: "2000/04/19", hobby: "ボルダリング"}
    ];
    let allAge = 0;
    let avgAge = 0;
    for(person of persons){
        allAge += person.age; // 代入演算子で簡略化
    }
    avgAge = allAge / persons.length;
    console.log("personsに含まれる人数は" + persons.length + "人です。");
    console.log("personsの平均年齢は" + avgAge + "才です。");
}
```

## 演習問題

(1). 下記のような出力になるプログラムを作成して下さい。
なお、閏年の日数は考慮しないものとします。
※switch文を上手く活用しましょう。

```
 1月の日数は31日です。
 2月の日数は28日です。
 3月の日数は31日です。
 4月の日数は30日です。
 5月の日数は31日です。
 6月の日数は30日です。
 7月の日数は31日です。
 8月の日数は31日です。
 9月の日数は30日です。
10月の日数は31日です。
11月の日数は30日です。
12月の日数は31日です。
```

(2). 下記のような出力になるプログラムを作成して下さい。

```
 1〜12月の合計日数は365日です。
 1〜12月の平均日数は30.416666666666668日です。
```

## まとめ

いかがでしたでしょうか。
今回はswitch文と代入演算子について紹介しました。
いずれも今まで学習した記述でも表現可能な領域ですが、ケースバイケースでよりシンプルに記述できる方法を選択することが重要だということも覚えておくと良いと思います。
それではまた次の記事でお会いしましょう。