GAS初心者が抑えるべきポイント徹底解説!

ビジネス

はじめに

今回のビジボットは、『GASで押さえておくべき使い方』を実際のコードを書いてログ結果も表示しながら、どういう動きをしているのか?を細かく説明しています。
正直、ここまで理解すればGASのベースは理解できるはずなので、簡単なコードを書いて遊び始める事はできます。GAS初心者にはおすすめの記事です。

まず、本記事を読んでから以下記事を読むと実際にどうやればいいのか?がわかってくると思います。

GASの初心者レッスン★☆☆ - ビジボット

GASの初心者レッスン★☆☆ – ビジボット

2019年2月23日

それでは早速始めていきます!

1.GASとは

POINT

GASとは、Googleが提供してるスクリプト『Google Apps Script』の略です。
このGASというスクリプトはGoogleが提供しているサービス(スプレッドシート等)をクラウド上で実行することで操作できるサービスを指します。

利用にお金は一切かからずGoogleアカウントがあれば無料で利用できるため、プログラマーを目指す初心者はまず学んで損はないです。
※GASとJavaScriptはイコールではありません!

2.GASのルール

POINT

GASは処理の時間が6分を超える事ができません。理由は単純にGoogle利用サービスを共通して使うクラウド上のリソースで動くスクリプトのため、一人特定の重たい処理が実行されないように、6分で処理が終了するようになってます。

他にも以下注意点が存在しています。

1.英数字、記号は全て半角で入力
2.アルファベットの大文字と小文字は区別される
3.初めて実行するスクリプトは都度『承認』が必要
4.ステートメント *1 の末尾にはセミコロン(;)を付ける
5.識別子 *2 は先頭文字は数字、一部アンダースコア、ドル記号($)をのぞいて記号は使えない
6.予約語 *3 は使えない
7.変数と関数名にはキャメル記法 *4、定数名にはスネーク記法 *5を使用
注意

*1 ステートメント…処理の最小単位の事
セミコロンがなくても自動でステートメントを判断して処理されるけど、絶対ではないので非推奨です!
*2 識別子…変数、定数、関数などの事
*3 予約語…すでに特別な意味を持つ単語として定められているものの事(var や function など)
*4 キャメル記法…単語を連結した時に、2つ目以降の単語の頭文字を大文字にする記法(maxRow など)
*5 スネーク記法…単語をアンダースコア(_)で連結しつつ全てを大文字にする記法(TAX_RATE など)

3.記述エディタ表示

POINT

GASを記述するスクリプトエディタを表示する方法です。エディタを表示する方法はスプレッドシートやGoogleFormサービスの様々なところにあるので、用途ごとに使い分ければOKです。

まず、GoogleDriveの画面から『新規』をクリックします。
すると、新規追加するべき項目の候補(フォルダやアップロード)が表示されるので、『その他』の中の『アプリ通知』をクリックします。

Google Apps scriptを追加する
Google Apps scriptを追加する

ドライブにアプリを追加が表示されるので、『+ 接続』をクリックして、Drive上に追加します。

Google Apps scriptを追加する
Google Apps scriptを追加する

接続が完了するとポップアップが表示され、完了です。
もう一度『新規』をクリックすると、『その他』の中にGoogle Apps Script が表示されている事が確認できます。

Google Apps scriptを追加完了
Google Apps scriptを追加完了

4.コードの実行

これから実際にコードを書いて進めますが、書いた処理を実行する方法が記載されていなかったので、記載します。
虫のマークの横に『function xxxxx』に記載されている『xxxxx』がプルダウンで表示されるので、実行したい処理を選択します。

関数の実行方法

5.変数とは

POINT

プログラムを記述する上で、変数は必ず使います!始めて聞く人もいると思いますが、実はみなさん一度は絶対学校で習っており、算数?数学?の時間で絶対やったアレです。
『1 + x = 3』
『y = 1 + 3』
『z = x + y』

GASでも同様に変数を使って複雑な処理などを行なっていきます。

変数を記述

以下GASで変数を記述してみました。まず前提として変数名は記述のルールを充たされていればどの単語でも大丈夫です。
例えば『var bzbot = 2』とか書いて、bzbotに『2』を代入する事も可能です。

GASコード
GASログ

変数の使い方

主にどのような使い方をすればいいか?ですが、始めて書く人はなかなかイメージするのが難しいと思います。

例えば、『スプレッドシートに入っているA列のアドレス宛に自動でメールを送信したい!』となった場合、A列に入っているアドレスを上から順番に入っているセル数を取得し、配信するアドレスが一体何件あるのか?を数える必要があります。

変数の特徴

POINT

GASに限らず、変数は値の上書きが行えます。
そのため、常に処理の中で一定の値が入っている。という訳ではありません。
処理をしていく中で入っている値が変わるパターンが一般的です。

GASコード
GASログ

定数の存在

POINT

定数とは、変数の特徴とは異なり一度変数にいれた場合処理が完了するまで入れた値の上書き処理ができません。
GASでは記述する際の注意として、通常変数とは異なり、『const 大文字変数名 = ~;』で記述します。

GASコード

通常の変数とは異なり上書きしても、結果を見ると反映されていない事がわかります。

GASログ

6.型とは

GAS以外にも変数には様々な型が存在しています。
数字を代入する数値型や文字を代入する文字列型はそのまま値を入れる事ができます。
配列やオブジェクト型は様々な情報(複数の情報を一つの変数に入れる)事ができる特徴があります。

数値型
整数値や浮動小数点値100,1.08
文字列型文字列‘ビジボット’
真偽型trueとfalseのどちらかの結果が入るデータ型true,false
配列型インデックスをキーとするデータの集合{10,20,30}
オブジェクト型
プロパティをキーとするデータの集合{x:10,y:20,z:30}
null値が何も入っていないことnull
undefined未定義であることundefined

7.配列とは

配列とは複数の箱が連なっている状態をイメージします。
これらのデータには必ず番号は振られており、入っているデータ以外に『インデックス』が振られています。
※インデックスの値は必ず『0』から始まります

GASコード

今回の例で言えば、numbers[0]は入っている値の最初を指すため、結果は10になります。[1]は20、[2]は30…と入っている値の場所を指定するイメージです。

GASログ

8.演算子とは

GASの演算は数字の計算をするため、記号を持ちます。足し算や引き算などの処理を変数に入れます。型で言えば、数値型を指しますが文字列型でも『+』演算子を使う事ができます。

“abc” + “def” = “abcdef”という数値や文字を結合する時にも使えます。

GASコード
GASログ

インクリメントとデクリメント

インクリメントとは、数字を1繰り上げる、デクリメントとは、数字を1繰り下げるといった処理を指してます。GASのインクリメントとデクリメントは、書き方が2通りあります。

インクリメント:『変数 ++』または『++ 変数』
デクリメント:『変数 –』または『– 変数』

演算子の『+』や『-』をつける位置が先か、後かによって処理結果が変わって来るので注意が必要です。

GASコード
GASログ

比較演算子

比較演算子とは、AとBのデータが正しいか?AとBは異なるか?AよりBは大きいか?、AよりBは小さいか?、AはB以上か?、AはB以下か?などを記述して比較して、その処理がTRUEだったら、FALSEだったらで処理を分けたりする時に使います。

==左辺と右辺が等しければtrue1 == 1 //true
1 == ‘1’ //true
!=左辺と右辺が等しくなければtrue1 != 1 //false
1 != 2 //true
<左辺が右辺より小さければtrue1 < 2 //true
2 < 2 //false
<=左辺が右辺以下であればtrue1 <= 2 //true
2 <= 2 //true
>左辺が右辺より大きければtrue1 > 2 //false
2 > 2 //false
>=左辺が右辺以上であればtrue1 >= 2 //false
2 >= 2 //true
===左辺と右辺がデータ型も含めて等しければtrue1 === 1 //true
1 === ‘1’ //false
!==左辺と右辺がデータ型も含めて等しくなければtrue1 !== 1 //false
1- !== ‘1’ //true

複合演算子

GASの複合演算子は以下を表現する時に簡単に表現できるメリットがあります。
x = x + 3;
この処理でも間違いないですが、複合演算子を使うともっとシンプルに表現する事ができます。

=左辺の変数に値を代入x = 3(xは3です)
+=左辺の値に右辺の値を加算して代入x += 3(xはx+3です)
-=左辺の値から右辺の値を減算して代入x -= 3(xはx-3です)
*=左辺の値に右辺の値を乗算して代入x *= 3(xはx*3です)
/=左辺の値を右辺の値で除算した値代入x /= 3(xはx/3です)
%=左辺の値を右辺の値で除算した剰余を代入x %= 3(xはx/3の余りです)
GASコード
GASログ

9.制御文

処理を記述する際に、コードはなるべく少ない方が可読性も高くメンテナンス性があがっていきます。
ここでは、分岐処理とループ処理を理解します。

if文

GASもif文を記述して様々な分岐処理を行う事ができます。
日本語で書く場合『もし〜だったら…処理A』という記述になります。
他にも先ほど紹介した比較演算子を使って様々な処理を記述する事ができます。

GASコード
GASログ

else文

GASのif文を応用した分岐処理を行うためにelse文を使います。
日本語で書く場合『もし〜だったら…処理A、そうでない場合は処理B』という記述になります。
上記if文と違うのは、TRUEだった処理に対してだけでなくFALSEだった場合の処理を記述できる部分です。

GASコード
GASログ

else if文

GASのさらにif文を応用した複数の分岐処理を行うためにelse if文を使います。
日本語で書く場合『もし〜だったら…処理A、もし〜だったら…処理B、もし〜だったら処理C…』という感じで複数条件で分岐を作る事が可能です。

GASコード
GASログ

switch文

if文による条件分岐では、条件式がtrueかfalseかといった2通りしか分岐を出来ずelse if~を使って条件式を追加することで実現しましたが、『switch文』を使うことでよりシンプルに表現することが出来ます。

※各caseの末尾にある『break』文は省略することが出来ますが、他のも実行されるケースがあるので省略非推奨です

GASコード
GASログ

while文

GASのwhile文は同じような処理を何度も繰り返し実行したい場合に、一つのスクリプトを記述することで指定する条件が来る(条件のtrueが終わる)まで処理を繰り返してくれます。

for文と違うのはfor文の場合、特定の数値が繰り上がってその数値まで実行するというものですが、while文の場合は条件式を指定することが出来ます。

※繰り返し処理を記述する場合、無限ループにならないように気をつけましょう

GASコード
GASログ

for文

GASのfor文は同じような処理を何度も繰り返し実行したい場合に、一つのスクリプトを記述することで指定する条件が来る(条件のtrueが終わる)まで処理を繰り返してくれます。

while文と違うのはwhile文の場合、特定の条件式を記述しその条件がまでtrueの間は実行するというものですが、for文の場合は特定の数値が繰り上がってその数値まで実行していきます。

※繰り返し処理を記述する場合、無限ループにならないように気をつけましょう

GASコード
GASログ

switch文の中で処理を中断するためにbreak文を使用しましたが、繰り返し処理の中でもbreak文を使用することが可能です。以下コードはiのカウント数が5だった場合にtrueとしてbreak文が実行する事ができます。

10.例外処理

GASも通常のプログラムもそうですが、想定しないエラーが発生することがあります。しかし発生する要因は様々あるため、それら要因を全て潰してコード書くのは現実的に不可能です。

本来やらないければいけないコードの記述が一切できなくなってしまいます。
そのため、この例外処理がとても便利なんです。

まずはエラーを発生させたいので、GoogleDriveからGoogle Apps Scriptを選択して、GASのコードを記述できるスクリプトエディタを開きます。

GoogleDriveからスクリプトを開く
GoogleDriveからスクリプトを開く
GASコード

Browser.msgBoxはスプレッドシートにポップアップを表示する処理ですが、スプレッドシート情報がないため、エラーが発生します。

GAS実行結果
GASのエラー表示

try…catch…finally文

GAS(JavaScript)で例外処理を行う場合は、『try…catch…finally文』を使います。

『try{}ブロック』内で例外が発生した場合、すぐに『catchブロック{}』に処理が移ります。
『finally{}ブロック』は例外が発生しなくても実行されるので、不要であれば省略可能です!

※この時、変数eには例外で発生したErrorオブジェクトが渡されて、Errorオブジェクトのmessageプロパティにあるエラーメッセージが表示されてます

GASコード

Browser.msgBoxはスプレッドシートにポップアップを表示する処理ですが、スプレッドシート情報がないため、エラーが発生します。

GASログ

throw文

GASの例外は発生したものを受動的に検知して利用するだけではなく、スクリプト内で自ら進んで発生されることもできます。その場合、『throw文』を使います。例外を発生されることを『例外をスローする』とも言います。

GASコード
GAS実行結果
例外をスローする - ビジボット

さまざまな処理の合間に例外処理を挟む事で、どの部分で処理が終わってしまったのか?なぜ終わってしまったのか?を確認できるようになります。
少し手間と感じる部分ですが、入れておくだけでその後のメンテナンス性も向上します。

11.関数の呼び出し

GASは変数、すでに用意されている関数などを使って記述していきますが、自分でも関数を作る事ができます。
関数の作り方は至ってシンプルで、『function xxx {}』だけで、この記述をする事で、xxxという関数を作成されました。

この作成した関数を呼び出す記述を行なっていきます。

GASコード
GASログ

戻り値

GASの関数を呼び出し方法は実施できましたが、ただ関数を作ってそこを呼び出す以外にも、関数Aで処理した結果を呼び出し先の関数Bに渡す事ができます。
まず渡す値のことを『引数』といい、呼び出した関数から受け取る値を『戻り値』と言いreturnを使います。

GASコード
GASログ

さて、同じ関数内で『callAction()』を呼び出した時の結果はx = 20になっているのに、そのあとの処理でx = 10になっているのでしょうか。
それは、この後に出てくる『値渡し』と『参照渡し』が関係してきます。

値渡しとは

まず、変数A(var x = 10)を宣言する時に値はどこに保存しているか?ですが、メモリ内に複数ある特定のアドレス(アドレスAAAとする)に値がセットされます。

しかし、別関数(action(x);)を呼び出すタイミングで引数に変数Aを渡した場合、アドレスAAAとは別のアドレス(アドレスBBBとする)に変数Aと同じ値がセットされます。

そのため、アドレスBBBにセットされている値を変更(y += 10;)しても、アドレスAAAには全く反映されず、『return y;』で戻った値は20でしたが、その後呼び出された変数Aは10のままなので、上記のような結果になってます。

※『数値』『文字列』『真偽』『null』『undefined』の『プリミティブデータ型』全て値渡しです

参照渡しとは

シンプルに値渡しとは逆の考え方です。
値渡しの場合は、値を別メモリアドレスに保存して別データとして取り扱っていましたが、参照渡しの場合はメモリアドレスごと引数として渡します。

そのため、別関数で値を変更した場合、メモリアドレスに入っている値ごと変更されます。

※『オブジェクト』『配列のデータ』は全て参照渡しです※『オブジェクト』、『配列のデータ』は全て参照渡しです

GASコード
GASログ