GAS 基本文法 備忘録①【デバック 演算子 繰り返し処理 値渡し・参照渡し】

## 備忘録です。

[GoogleAppsScript 完全入門](https://www.amazon.co.jp/dp/B07BNB1Z9L/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)で学んだことを備忘録としてまとめていきます。

- 自分が知っていることや、解説、今は必要ないなと思ったことは省いています。
- 解説などは自分が分かりやすい言葉で書いているので厳密に違うこともあるかもしれません。

## 用語

### ステートメント
命令文の1行(最小単位)のこと

```javascript:例
Browser.msgBox("Hello");  // ステートメント
```

## クラス

### Browser

Googleスプレッドシートに固有のダイアログボックスへのアクセスを提供するクラス。

※ダイアログボックス
OSの操作画面で、入力やメッセージの確認のためにウィンドウとは別個に開くウィンドウのこと。

```javascript:構文
Browser.msgBox(text)
// メッセージボックスが表示される
```

<img width="597" alt="スクリーンショット 2020-08-03 9.32.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/c5b9d0fa-ad46-5574-a525-e381c0e9996c.png">

## ログを表示させる。

めちゃくちゃ使う。

```javascript:構文
Logger.log(data)
```

<img width="776" alt="スクリーンショット 2020-08-03 9.39.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/528d942c-663f-ed5a-3a8e-46c974fbc42a.png">

## デバック方法

### ブレークポイントの設置

※ブレークポイント
デバックを実行した際に処理が止まるポイントのこと。

赤い丸がブレークポイント⇩

<img width="368" alt="スクリーンショット 2020-08-03 9.41.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/aa8c49e1-f8ab-f701-1710-eb71bfa63aca.png">

### デバックの実行
:beetle:マークを押すとでバックウィンドウが表示され、変数の値の変化を確認できる。
<img width="997" alt="スクリーンショット 2020-08-03 9.42.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/48db8539-f081-76ef-8272-462712b34edc.png">


## オブジェクト(ハッシュ)から値を取り出す2種類の方法

### ①ドット記法

```javascript:例
function myFunction() {
  var person = {name: 'mike', age: '22'};
  Logger.log(person.name);
}
```

### ②ブラケット記法

```javascript:例
function myFunction() {
  var person = {name: 'mike', age: '22'};
  Logger.log(person['age']);
}
```

## インクリメント演算子・デクリメント演算子
### インクリメント
数値を1増加させる
記述例：`x++` `++x`

### デクリメント
数値を1減少させる
記述例：`y--` `--y`

<img width="398" alt="スクリーンショット 2020-08-03 11.06.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/415de568-fce3-ce2e-3087-f0f850effb35.png">

## 比較演算子

`==`
左辺と右辺が等しければtrue

`!=`
左辺と右辺が等しくなければtrue

`===`
左辺と右辺がデータ型も含め等しければtrue

`!==`
左辺と右辺がデータ型も含め等しくなければtrue

```javascript:例
function myFunction() {
  Logger.log(5 == '5');    //true
  Logger.log(5 === '5');   //false
  
  Logger.log(5 != '5');    //false
  Logger.log(5 !== '5');   //true
}
```

## switch文
条件分岐が可能

```javascript:例
function myFunction() {
  var rank = '100点';
  switch (rank) {
    case '100点':
      Logger.log('すごい！');
      break;
    case '70点':
      Logger.log('いい感じです。');
      break;
    dafault:
      Logger.log('頑張りましょう。');
  }
}

// すごい！
```

※switch文はbreakを記述しないとブロックから抜け出せない。

## 繰り返し処理(ループ処理)


### while文
条件式がtrueになるまで繰り返す。

```javascript:例
function myFunction() {
  var x = 1;
  while (x < 100) {
  x *= 3;
    Logger.log('xの値は%sです。', x);
  }
}
```

※`％s`はプレースホルダーで、値は可変で渡すことができる。(今回は第二引数で渡したxの値が％sに入る)

<img width="492" alt="スクリーンショット 2020-08-04 9.13.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/abafc967-3eef-1088-c4f0-d80c0286a1a8.png">

### for文
繰り返しの回数が決まっている時に使用。

```javascript:構文
for (①初期化式; ②条件式; ③増減式){
    // 条件がtrueの間、実行される処理
}
```

繰り返す回数を設定するための変数を**カウンタ変数**という。

```
①初期化式
カウンタ変数の初期値を決めるための式

②条件式
カウンタ変数を用いた条件式
この条件式がtrueだったときはfor文がループ処理される

③増減式
一般的にはカウンタ変数の値を増減させる式
```

```javascript:例
function myFunction() {
  for (var i = 1; i <= 5; i++) {
    Logger.log('値は%sです。', i);
  }
}
```

<img width="432" alt="スクリーンショット 2020-08-04 9.30.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/082324e6-79c7-68bf-260d-1a6afd5adb21.png">


### for...in文
オブジェクト(ハッシュ)の全ての**プロパティ(値に対応するキー)**を取り出すまでループ処理を行う。

```javascript:構文
for (変数 in オブジェクト) {
    // ループ内で実行する処理
}
```

```javascript:例
function myFunction() {
  var persons = {name: 'Mike', age: 25, job: 'Pastry chef'};
  for (var p in  persons) {
    // オブジェクトのpersonsから取り出した一つ一つのプロパティを、変数のpに代入
    Logger.log('%sは%sです！', p, persons[p]);
  }
}
```

<img width="402" alt="スクリーンショット 2020-08-04 9.44.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/6bed353d-09d1-f1c7-7cd9-672e0eb5dedf.png">

### 繰り返し処理の中断

break文を使用する。

```javascript:例
function myFunction() {
  var num = 1;
  for (var i = 1; i <= 10; i++){
    num *= 2;
    Logger.log('iの値は%sでnumの値は%s', i, num);
    if (num > 50) {
    break
    }
  }
}
```

<img width="469" alt="スクリーンショット 2020-08-04 9.51.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/7bea6b8f-f755-00d4-56a0-e4632e2bd27a.png">


### 繰り返し処理のスキップ

continue文を使用する。

```javascript:例
function myFunction() {
  for (var i = 1; i <= 10; i++){
    if (i % 3 === 0 || i % 5 ===0) {
      continue;
    }
    Logger.log('iの値は%s', i);
  }
}
```

<img width="366" alt="スクリーンショット 2020-08-04 9.58.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/7bd2efc0-eff6-0eb8-6d70-8029e349dfbe.png">


## 値渡し・参照渡し

### 値渡し
数値、文字列、真偽値などを引数に指定した時。
値をコピーして関数に渡す。コピー元となった値には上書きされない。

```javascript:例
function sum() {
  x = 10;
  Logger.log('num(y)の値は%sです。', num(x));
  Logger.log('xの値は%sです。', x);
}

function num(y) {
  y += 1;
  return y;
}
```

<img width="445" alt="スクリーンショット 2020-08-04 10.50.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/74fa6e9d-3bb9-3df2-81c4-3c00fb4b9062.png">

### 参照渡し
オブジェクト(ハッシュ)や配列を引数に指定した時。
値をそのまま使用する(参照値を渡す)。上書き保存される。

```javascript:例
function sum() {
  x = [10, 28, 30];
  Logger.log('xの値は%sです。', x);
  Logger.log('num(y)の値は%sです。', num(x));
  Logger.log('xの値は%sです。', x);
}

function num(y) {
  y[0] += 30;
  return y;
}
```

<img width="498" alt="スクリーンショット 2020-08-04 10.57.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646383/67b79aa9-f479-3470-d443-f9515c97d913.png">