初めてGAS開発をする方のための最低限のJS講座

##はじめに
JavaとJavaScriptはインドとインドネシア並に違います。
それぞれプログラミング言語という意味では同じですが、使いどころや書き方が大きく異なります。

この記事では、[Google Apps Script(以下GAS)](https://developers.google.com/apps-script/)を使って
初めてプログラミングを学ぶ方[^1]でもわかりやすいように、
ざっくりとですが[JavaScript(以下JS)](https://developer.mozilla.org/ja/docs/Learn/Getting_started_with_the_web/JavaScript_basics)のコードの読み方を説明します。

プログラミング経験者の方は、当記事よりも以下サイトを見てもらえれば事足りると思います。
JSについて→[JavaScript - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript)
GASについて→[Reference Overview](https://developers.google.com/apps-script/reference/)

Reference Overviewの左メニューから「G Suite Service」を押すと
おそらくGASで操作したいと思われるGoogleサービス名が見えると思います。
[Spreadsheet](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app)、[Gmail](https://developers.google.com/apps-script/reference/gmail/gmail-app)、[Drive](https://developers.google.com/apps-script/reference/drive/drive-app)、[Calendar](https://developers.google.com/apps-script/reference/calendar/calendar-app)

開発者が本当に欲しいのってこのページへの直リンなんですが
なんかこんなん作ってみましたってページしか検索結果に出てこないよね。
「GAS カレンダー」とかの検索条件で上記ページが当たるようにしてくださいGoogle先生:clap:

[^1]: LineBot開発を始めた友達や、昼夜問わず開発依頼してくる方が、僕がいなくても自力で開発できるようになってほしいとの願いを込めて作成

##JSとGASの関係
GASとJSは厳密には違うものですが、GASはJSベースに作られているプログラミング言語です。
そのため、GASの開発で何か困った事があれば、JSの記事を調べると解決できる事があります。

~~ただし2018/08現在、JSは[ES6(=2015年版)](https://ja.wikipedia.org/wiki/ECMAScript)と呼ばれるバージョンで使える機能が増えていますが、
GASではJSの[ES5(=2011年版)](https://ja.wikipedia.org/wiki/ECMAScript)相当の機能しかありません。~~

~~時々、ネットで調べた内容が使えない！なんてことがあるかもしれません。
しかし最新の機能がなくても十分にプログラムは書けますので、あまり気にせずに進めていきましょう。~~


Google Chromeで使われているV8エンジン相当の機能が使えるようになりました！素晴らしい！


##コードの種類
コードには、おおよそ6つの種類があります。

- 変数
- 式
- コメント
- 命令
- 関数
- プロパティ、メソッド

もちろん、他にも色々あるのですが、最初はこれだけわかれば十分かと思います。
順番に見ていきましょう。

##変数
プログラムにはいろいろな作り方や考え方がありますが
JSでは、変数にデータを設定(以下、代入)して、あとから使えるようにします。
数学の方程式でいうところの、「y = 2x;」の「y」とか「x」のところですね。

```javascript
var x = 3;
```

変数には、数字だけではなく、文字列[^2]でもなんでも代入する事ができます！

```javascript
var myBike = '750RS';
```

↓↓↓
読み方は以下の通り

```
var(変数) myBike(マイバイク) = (代入する) '750RS'(文字列) =>変数myBikeに文字列750RSを代入する
```

[^2]: プログラミング言語では「文字」というと一文字だけ、二文字以上の文や単語を「文字列」として区別することが多いです。JSでは、「文字列」と表現しています。

一度変数に代入したものは、あとから内容を変更したり、使うこともできます。

```javascript
Logger.log(myBike); //=> 750RSと表示される

myBike = 'ZX-10RR';

Logger.log(myBike); //=> ZX-10RRと表示される
```

※Logger.log()は、変数の中身を確認するときに使う関数(後で説明)です。
　alert()やconsole.log()など、色々な方法もあるのですが、GASではこれを使うと覚えてください。

文字を設定するときは、周りをシングルクオート'で囲う必要があります。
囲わない場合は、変数に他の変数の内容を代入する処理になります。

```javascript
var x = 3;
var y = x; //=> yに3が設定される
var y = 'x'; //=> yにxという文字が設定される
```

シングルクオートの有無で、文字の代入なのか変数を代入するのかを判断するわけですね。

##式
数学でいうところの式、そのものです。
「y = ax」みたいなものですね。
Excelでいうと「=A1+A2+A3...」が式に該当します。

数値同士の計算はもちろん、変数を混ぜたり、変数同士で足し算とか割り算とかできます。
足し算用の+、引き算用の-、掛け算用の*、割り算用の/などなど、これらの記号を演算子といいます。

何があるかは知りたい人はこちら→[式と演算子の一覧 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators)

```javascript
var a = 3;
var sum = a + 5; //=> sumには8が代入される
```

ちなみに、これはどういう意味でしょうか？

```javascript
x++;
```

↓↓↓
こういう意味になります。

```javascript
x = x + 1;
```

プログラムを書く量を減らし、見やすくするために省略して書けるようにもなっています。

でも、JSでは文字と数値の計算はできないので気を付けてください！

```javascript
'ABC' * 3 //=> エラー！ 文字列に数字を掛け算しようとしても、ABCABCABCにはならない！
```

##コメント
コードに、説明をつけたいときに使います。
何を書いても、プログラムの動きには影響がありません。

複雑な処理だと、コードを読むのに時間がかかると思います。
そんな時、コメントがつけられていると読むのが少し楽になります！
全部つければいいというわけでもないですが、
将来の自分がコードを読み直すときに備えて、積極的にコメントをつけていきましょう！

###１：スラッシュが２個続く形式
スラッシュ以降の１行分だけコメントとして扱われます。

```javascript
var bikeCount = 3; // 今持っているバイクの台数
```

###２：スラッシュとアスタリスクの組み合わせの形式
コメントが複数行になる場合に使うとよいでしょう。

```javascript
/**
 * 当日の天文イベントを返却
 * イベントがない場合はnullを返却する
 *
 * @return {string} 当日の天体情報
 */
function getTodayAstronomEvent() {
```
##命令
色々ありますが、まずはよく使うifとforを覚えましょう。
###１：if(条件分岐)の使い方
「もし～の場合(if)～をする、違う場合(else)は～をする」といった分岐をしたいときに使います。

```javascript
var x = 3;
if(x === 3){
    // xが3の時だけ実行される
    x = 5;
} else {
    // xが3じゃない場合に実行される
    x = 4;
}
```

「～の場合...」が並ぶ場合は、else ifが使えます。

```javascript
var x = 2;
if(x === 3){
    // xが3の時だけ実行される
    x = 5;
} else if(x < 3){
    // xが3未満の時だけ実行される
    x = 0;
} else {
    // xが4以上の場合に実行される
    x = 4;
}
```
↓↓↓
読み方は以下の通り　※if文で()を使うので、読み方を[]で囲みます。

```
if [もし] (x [変数xが]  === [同じ]  3 [数字の3と]) {[場合] =>もし、変数xが数字の3と同じ場合
  x = 5; [変数xに5を代入する]
}
```

else ifやelseは、要らなかったら書かなくても大丈夫です。
詳しくは→[if...else - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/if...else)

###２：for(繰り返し)の使い方
「～回まで～の処理を繰り返す(for)」時に使います。
タイマーみたいなイメージですね。

```javascript
// iが5になるまで繰り返す
for (var i = 1; i < 6; i++){
    Logger.log(i + '回目');
}
// => 1回目 2回目 3回目 4回目 5回目と表示されます。
```
↓↓↓
読み方は以下の通り　※for文で()を使うので、読み方を[]で囲みます。

```
for[繰返]  (var i = 1; [変数iに1を代入して繰り返しを始める]
 i < 6; [変数iが6未満なら繰り返し続ける]
 i++ [一回実行するたびに変数iを+1する])
{ [{}までの処理を繰り返す]
    Logger.log(i + '回目');　[変数iの数を表示する]
}
```

これだけ見てもいまいち価値がわからないかもしれませんが
実際に使ってみると、便利なところがわかると思います。

詳しくは→[for - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for)

##関数
関数を使うと、プログラムの処理のかたまりを作って、他のところで呼び出す事ができます！
これを、関数の定義といいます。

Excelのsum()とか、vlookup()も関数ですね。
これを自分で作ると考えるとわかりやすいかもしれません。
関数を呼び出す時、数値や文字列、変数を設定する（渡すと表現することも）事ができます。
これを、引数といいます。

```javascript
/** 
* x,y,z３つの数字を合計する。
* Excelはもっと多くの引数を扱えるように作られている
*/
function sum(x, y, z) {
    // returnを書くことで、関数を呼び出したところに結果を戻す(教える)事ができます。
    // これを、戻り値といいます。
    return x + y + z;
}

var goukei = sum(1,2,3); // => goukeiに6が代入される
```
↓↓↓
読み方は以下の通り　※()を使うので、読み方を[]で囲みます。

```
function[関数] sum[変数名] ([()の中に引数を定義] x, y, z [変数x,y,zの3つ]) { [{}の間に書かれた処理をします]
    return x + y + z; [x+y+zの合計を、呼び出し元に戻す]
}
```
コードを書いていて、あれ？同じようなものさっき書いてなかった？とか思ったら
そのコードを関数として取り出す事で、同じプログラムを書く手間を減らす事ができます！

最初は気にせずに書いてしまって、後から見直したときに気づくこともあるかもしれません。
その時は、勉強のチャンス！
関数として取り出して、コードを書き直してみましょう！

詳しくは→[関数宣言 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/function)

##プロパティ・メソッド
時々、プログラムにx.aaa.bbbみたいな記述が出てくるかと思います。
これをプロパティやメソッドなどと呼んだりします。

厳密に説明しようとすると、[オブジェクト](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Working_with_Objects)とか、さらに新しい用語が出てくるのですがここでは置いておくとして…
実は、文字列や数値には最初から変数(プロパティ)や関数(メソッド)が定義されているのです！
これらをうまく活用していく事が、GASプログラミングでのポイントです！

例はこちら
↓↓↓

```javascript
// ContentServiceはMimeType変数を持っている、そこからさらにMimeTypeが持っているJSON変数を取り出す
ContentService.MimeType.JSON

// 文字列の変数sが持つ、indexOf関数を呼び出す
var s = 'ABCDEFG';
var index = s.indexOf('F');
```

.がついている場合、.より左側の変数(関数の場合はその戻り値)が、右側の変数(関数)を持っていると考えてみましょう。

Arrayのプロパティと関数→[Array - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array)
String(文字列)のプロパティと関数→[String - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String)

##おわりに
以上で、ざっくりな説明となります。

あとは、コードを見たり、書いたりしながら学んでいきましょう。

例えば、代入については、実はルールがあって、注意するべきポイントがあります。
今の段階では気にする必要はないと思いますが、困ったときは以下の記事を参考にしてみてください。
[【Javascript】値渡しと参照渡しについてあらためてまとめてみる](https://qiita.com/migi/items/3417c2de685c368faab1)

他にも、JavaScriptでハマりやすいポイントについて書かれた、以下のような記事があります。
[酒飲みがJavaScriptで個人的に気をつけている所](https://qiita.com/sakurasumizome/items/5df8477423659e969a90) ※ES6ベースなので、GASにそのまま適用できないものもあり

などなど。

Google先生に聞いたり、わかる人に聞きながら実際に手を動かして、トライしてみましょう！