便利なGASレシピ集!に戻る場合は以下から
Contents
はじめに
今回のビジボットは、『GASで押さえておくべき使い方』を実際のコードを書いてログ結果も表示しながら、どういう動きをしているのか?を細かく説明しています。
正直、ここまで理解すればGASのベースは理解できるはずなので、簡単なコードを書いて遊び始める事はできます。GAS初心者にはおすすめの記事です。
まず、本記事を読んでから以下記事を読むと実際にどうやればいいのか?がわかってくると思います。
その他、レシピ集も作成中です!順次基礎から用意を進めてます!
それでは早速始めていきます!
1.GASとは
GASとは、Googleが提供してるスクリプト『Google Apps Script』の略です。
このGASというスクリプトはGoogleが提供しているサービス(スプレッドシート等)をクラウド上で実行することで操作できるサービスを指します。
利用にお金は一切かからずGoogleアカウントがあれば無料で利用できるため、プログラマーを目指す初心者はまず学んで損はないです。
※GASとJavaScriptはイコールではありません!
2.GASのルール
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.記述エディタ表示
GASを記述するスクリプトエディタを表示する方法です。エディタを表示する方法はスプレッドシートやGoogleFormサービスの様々なところにあるので、用途ごとに使い分ければOKです。
まず、GoogleDriveの画面から『新規』をクリックします。
すると、新規追加するべき項目の候補(フォルダやアップロード)が表示されるので、『その他』の中の『アプリ通知』をクリックします。

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

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

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

1 2 3 4 5 6 7 8 |
function myFunction() { //ここから /* *ここに処理を記述していきます * */ Logger.log('HELLO ビジボット'); } //ここまで |
5.変数とは
プログラムを記述する上で、変数は必ず使います!始めて聞く人もいると思いますが、実はみなさん一度は絶対学校で習っており、算数?数学?の時間で絶対やったアレです。
『1 + x = 3』
『y = 1 + 3』
『z = x + y』
GASでも同様に変数を使って複雑な処理などを行なっていきます。
変数を記述
以下GASで変数を記述してみました。まず前提として変数名は記述のルールを充たされていればどの単語でも大丈夫です。
例えば『var bzbot = 2』とか書いて、bzbotに『2』を代入する事も可能です。
1 2 3 4 5 6 7 8 9 10 |
function myFunction(){ // xという変数に1を代入しようとしている状態(コードが実行されたら代入された状態) var x = 1; // yという変数に2を代入しようとしている状態(コードが実行されたら代入された状態) var y = 2; Logger.log('x:' + x + ' , ' + 'y : ' + y); } |
1 |
[19-03-06 01:37:17:791 JST] x:1 , y : 2 |
変数の使い方
主にどのような使い方をすればいいか?ですが、始めて書く人はなかなかイメージするのが難しいと思います。
例えば、『スプレッドシートに入っているA列のアドレス宛に自動でメールを送信したい!』となった場合、A列に入っているアドレスを上から順番に入っているセル数を取得し、配信するアドレスが一体何件あるのか?を数える必要があります。
変数の特徴
GASに限らず、変数は値の上書きが行えます。
そのため、常に処理の中で一定の値が入っている。という訳ではありません。
処理をしていく中で入っている値が変わるパターンが一般的です。
1 2 3 4 5 6 7 8 9 10 |
// xという変数に1を代入しようとしている状態(コードが実行されたら代入された状態) var x = 1; // yという変数に2を代入しようとしている状態(コードが実行されたら代入された状態) var y = 2; // xという変数は1が入ってます // 右辺から計算が先に行われます(x + y) // よって、xは 1 + 2 の式が成立し、3という値に『変数x』上書きされます x = x + y; |
1 2 |
[19-03-06 01:37:17:791 JST] x:1 , y : 2 [19-03-06 01:37:17:791 JST] x:3 , y : 2 |
定数の存在
定数とは、変数の特徴とは異なり一度変数にいれた場合処理が完了するまで入れた値の上書き処理ができません。
GASでは記述する際の注意として、通常変数とは異なり、『const 大文字変数名 = ~;』で記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function myFunction(){ // Xという変数に1を代入しようとしている状態(コードが実行されたら代入された状態) const X = 1; // yという変数に2を代入しようとしている状態(コードが実行されたら代入された状態) var y = 2; Logger.log('x:' + X + ' , ' + 'y : ' + y); // xという変数は1が入ってます // 右辺から計算が先に行われます(x + y) // よって、xは 1 + 2 の式が成立し、3という値に『変数x』上書きされます X = X + y; Logger.log('x:' + X + ' , ' + 'y : ' + y); } |
通常の変数とは異なり上書きしても、結果を見ると反映されていない事がわかります。
1 2 |
[19-03-06 01:47:55:632 JST] x:1 , y : 2 [19-03-06 01:47:55:633 JST] x:1 , y : 2 |
6.型とは
GAS以外にも変数には様々な型が存在しています。
数字を代入する数値型や文字を代入する文字列型はそのまま値を入れる事ができます。
配列やオブジェクト型は様々な情報(複数の情報を一つの変数に入れる)事ができる特徴があります。
数値型 | 整数値や浮動小数点値 | 100,1.08 |
文字列型 | 文字列 | ‘ビジボット’ |
真偽型 | trueとfalseのどちらかの結果が入るデータ型 | true,false |
配列型 | インデックスをキーとするデータの集合 | {10,20,30} |
オブジェクト型 | プロパティをキーとするデータの集合 | {x:10,y:20,z:30} |
null | 値が何も入っていないこと | null |
undefined | 未定義であること | undefined |
7.配列とは
配列とは複数の箱が連なっている状態をイメージします。
これらのデータには必ず番号は振られており、入っているデータ以外に『インデックス』が振られています。
※インデックスの値は必ず『0』から始まります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function myFunction() { /* *一つの変数に複数の値を格納する */ //シンプルな配列 var numbers = [10,20,30,40]; Logger.log('numbers:' + numbers); //指定箇所の値のみを取得 Logger.log('numbers[0]:' + numbers[0]); Logger.log('numbers[1]:' + numbers[1]); Logger.log('numbers[2]:' + numbers[2]); Logger.log('numbers[3]:' + numbers[3]); } |
今回の例で言えば、numbers[0]は入っている値の最初を指すため、結果は10になります。[1]は20、[2]は30…と入っている値の場所を指定するイメージです。
1 2 3 4 5 |
[19-03-06 02:05:34:947 JST] numbers:10,20,30,40 [19-03-06 02:05:34:948 JST] numbers[0]:10 [19-03-06 02:05:34:948 JST] numbers[1]:20 [19-03-06 02:05:34:949 JST] numbers[2]:30 [19-03-06 02:05:34:949 JST] numbers[3]:40 |
8.演算子とは
GASの演算は数字の計算をするため、記号を持ちます。足し算や引き算などの処理を変数に入れます。型で言えば、数値型を指しますが文字列型でも『+』演算子を使う事ができます。
“abc” + “def” = “abcdef”という数値や文字を結合する時にも使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
function myFunction() { var x = 1; var y = 2; /* *x + yで足し算を実行 */ var z = x + y; Logger.log(z); /* *y - xで引き算を実行 */ z = y - x; Logger.log(z); /* *x/ yで割り算を実行 */ z = x / y; Logger.log(z); /* *x * yで掛け算を実施 */ z = x * y; Logger.log(z); /* *x % yで剰余を実施 */ z = x % y; Logger.log(z); } |
1 2 3 4 5 |
[19-03-06 02:29:52:125 JST] 3.0 [19-03-06 02:29:52:125 JST] 1.0 [19-03-06 02:29:52:126 JST] 0.5 [19-03-06 02:29:52:126 JST] 2.0 [19-03-06 02:29:52:127 JST] 1.0 |
インクリメントとデクリメント
インクリメントとは、数字を1繰り上げる、デクリメントとは、数字を1繰り下げるといった処理を指してます。GASのインクリメントとデクリメントは、書き方が2通りあります。
インクリメント:『変数 ++』または『++ 変数』
デクリメント:『変数 –』または『– 変数』
演算子の『+』や『-』をつける位置が先か、後かによって処理結果が変わって来るので注意が必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function myFunction() { var x = 5; Logger.log('x→' + x); Logger.log('++x→' + ++x); //変数の前にインクリメントの合図(数字が繰り上がる)・・・① Logger.log('x++→' + x++); //変数の後にインクリメントの合図(数字が繰り上っていない)・・・② Logger.log('インクリメント後→' + x); // ②の数字が通過する事で変数xは数字が繰り上がる var y = 5; Logger.log('y→' + y); Logger.log('--y→' + --y);//変数の前にデクリメントの合図(数字が繰り上がる)・・・① Logger.log('x--→' + y--);//変数の後にデクリメントの合図(数字が繰り上っていない)・・・② Logger.log('デクリメント後→' + y); //②の数字が通過する事で変数yは数字が繰り上がる } |
1 2 3 4 5 6 7 8 |
[19-03-06 02:42:25:782 JST] x→5 [19-03-06 02:42:25:782 JST] ++x→6 [19-03-06 02:42:25:783 JST] x++→6 [19-03-06 02:42:25:783 JST] インクリメントサーチ後→7 [19-03-06 02:42:25:785 JST] y→5 [19-03-06 02:42:25:786 JST] --y→4 [19-03-06 02:42:25:787 JST] x--→4 [19-03-06 02:42:25:787 JST] インクリメントサーチ後→3 |
比較演算子
比較演算子とは、AとBのデータが正しいか?AとBは異なるか?AよりBは大きいか?、AよりBは小さいか?、AはB以上か?、AはB以下か?などを記述して比較して、その処理がTRUEだったら、FALSEだったらで処理を分けたりする時に使います。
== | 左辺と右辺が等しければtrue | 1 == 1 //true 1 == ‘1’ //true |
!= | 左辺と右辺が等しくなければtrue | 1 != 1 //false 1 != 2 //true |
< | 左辺が右辺より小さければtrue | 1 < 2 //true 2 < 2 //false |
<= | 左辺が右辺以下であればtrue | 1 <= 2 //true 2 <= 2 //true |
> | 左辺が右辺より大きければtrue | 1 > 2 //false 2 > 2 //false |
>= | 左辺が右辺以上であればtrue | 1 >= 2 //false 2 >= 2 //true |
=== | 左辺と右辺がデータ型も含めて等しければtrue | 1 === 1 //true 1 === ‘1’ //false |
!== | 左辺と右辺がデータ型も含めて等しくなければtrue | 1 !== 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の余りです) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function myFunction() { var x = 3; Logger.log('x→' + x); x += 3; Logger.log('x += 3→' + x); // x = 6になる (3+3) x -= 3; Logger.log('x -= 3→' + x); // x = 3になる (6-3) x *= 3; Logger.log('x *= 3→' + x); // x = 9になる (3*3) x /= 3; Logger.log('x /= 3→' + x); // x = 3になる (9/3) x %= 3; Logger.log('x %= 3→' + x); // x = 0になる (3/3 余0) } |
1 2 3 4 5 6 |
[19-03-07 00:40:02:513 JST] x→3 [19-03-07 00:40:02:514 JST] x += 3→6 [19-03-07 00:40:02:514 JST] x -= 3→3 [19-03-07 00:40:02:514 JST] x *= 3→9 [19-03-07 00:40:02:515 JST] x /= 3→3 [19-03-07 00:40:02:515 JST] x %= 3→0 |
9.制御文
処理を記述する際に、コードはなるべく少ない方が可読性も高くメンテナンス性があがっていきます。
ここでは、分岐処理とループ処理を理解します。
if文
GASもif文を記述して様々な分岐処理を行う事ができます。
日本語で書く場合『もし〜だったら…処理A』という記述になります。
他にも先ほど紹介した比較演算子を使って様々な処理を記述する事ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function myFunction() { if(1 < 2){ //もし1が2より大きかったらTRUE→結果はTRUEです Logger.log('1 < 2の結果がTRUEだったら実行されます'); //結果が表示される } if(2 < 1){ //もし2が1より大きかったらTRUE→結果はFLASEです Logger.log('2 < 1の結果がTRUEだったら実行されます'); //結果が表示されない } var psn1 = "勇者"; var psn2 = "賢者"; if (psn1 === "賢者"){ Logger.log('psn1に入っている値は賢者です'); } if (psn2 === "賢者"){ Logger.log('psn2に入っている値は賢者です'); } } |
1 2 |
[19-03-07 01:12:41:783 JST] 1 < 2の結果がTRUEだったら実行されます [19-03-07 01:12:41:784 JST] psn2に入っている値は賢者です |
else文
GASのif文を応用した分岐処理を行うためにelse文を使います。
日本語で書く場合『もし〜だったら…処理A、そうでない場合は処理B』という記述になります。
上記if文と違うのは、TRUEだった処理に対してだけでなくFALSEだった場合の処理を記述できる部分です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function myFunction() { if(1 < 2){ //もし1が2より大きかったらTRUE→結果はTRUEです Logger.log('1 < 2の結果がTRUEだったら実行されます'); //結果が表示される } if(2 < 1){ //もし2が1より大きかったらTRUE→結果はFLASEです Logger.log('2 < 1の結果がTRUEだったら実行されます'); //結果が表示されない }else{ Logger.log('2 < 1の結果がFALSEだったら実行されます') //結果が表示される } var psn1 = "勇者"; var psn2 = "賢者"; if (psn1 === "賢者"){{ //もしpsn1に入っている値が賢者だったらTRUE→結果はFLASEです Logger.log('psn1に入っている値は賢者です');//結果が表示されない }else{ Logger.log('psn2に入っている値は賢者です'); //結果が表示される } } |
1 2 3 |
[19-03-07 01:22:17:676 JST] 1 < 2の結果がTRUEだったら実行されます [19-03-07 01:22:17:676 JST] 2 < 1の結果がFALSEだったら実行されます [19-03-07 01:22:17:677 JST] psn2に入っている値は賢者です |
else if文
GASのさらにif文を応用した複数の分岐処理を行うためにelse if文を使います。
日本語で書く場合『もし〜だったら…処理A、もし〜だったら…処理B、もし〜だったら処理C…』という感じで複数条件で分岐を作る事が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
function myFunction() { var x = 10; if(x < 2){ Logger.log('x < 2の結果がTRUEだったら実行されます'); }else if(x < 4){ Logger.log('x < 4の結果がTRUEだったら実行されます'); }else if(x < 6){ Logger.log('x < 6の結果がTRUEだったら実行されます'); }else if(x < 8){ Logger.log('x < 8の結果がTRUEだったら実行されます'); }else if(x < 10){ Logger.log('x < 10の結果がTRUEだったら実行されます'); }else if(x < 12){ Logger.log('x < 12の結果がTRUEだったら実行されます'); }else{ Logger.log('該当なしだったら実行されます'); } } |
1 |
[19-03-07 01:26:32:627 JST] x < 12の結果がTRUEだったら実行されます |
switch文
if文による条件分岐では、条件式がtrueかfalseかといった2通りしか分岐を出来ずelse if~を使って条件式を追加することで実現しましたが、『switch文』を使うことでよりシンプルに表現することが出来ます。
※各caseの末尾にある『break』文は省略することが出来ますが、他のも実行されるケースがあるので省略非推奨です
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
function myFunction() { var x = 10; switch (x){ case 2: Logger.log('x = 2の結果がTRUEだったら実行されます'); break; case 4: Logger.log('x = 4の結果がTRUEだったら実行されます'); break; case 6: Logger.log('x = 6の結果がTRUEだったら実行されます'); break; case 8: Logger.log('x = 8の結果がTRUEだったら実行されます'); break; case 10: Logger.log('x = 10の結果がTRUEだったら実行されます'); break; default: Logger.log('該当なしだったら実行されます'); break; } } |
1 |
[19-03-07 01:31:33:104 JST] x = 10の結果がTRUEだったら実行されます |
while文
GASのwhile文は同じような処理を何度も繰り返し実行したい場合に、一つのスクリプトを記述することで指定する条件が来る(条件のtrueが終わる)まで処理を繰り返してくれます。
for文と違うのはfor文の場合、特定の数値が繰り上がってその数値まで実行するというものですが、while文の場合は条件式を指定することが出来ます。
※繰り返し処理を記述する場合、無限ループにならないように気をつけましょう
1 2 3 4 5 6 7 8 9 |
function myFunction() { var x = 0; while(x < 50){ Logger.log('●処理前のx値→' + x); x += 10; Logger.log('■処理後のx値→' + x); } } |
1 2 3 4 5 6 7 8 9 10 |
[19-03-07 01:38:33:212 JST] ●処理前のx値→0 [19-03-07 01:38:33:212 JST] ■処理後のx値→10 [19-03-07 01:38:33:213 JST] ●処理前のx値→10 [19-03-07 01:38:33:213 JST] ■処理後のx値→20 [19-03-07 01:38:33:214 JST] ●処理前のx値→20 [19-03-07 01:38:33:214 JST] ■処理後のx値→30 [19-03-07 01:38:33:214 JST] ●処理前のx値→30 [19-03-07 01:38:33:215 JST] ■処理後のx値→40 [19-03-07 01:38:33:215 JST] ●処理前のx値→40 [19-03-07 01:38:33:216 JST] ■処理後のx値→50 |
for文
GASのfor文は同じような処理を何度も繰り返し実行したい場合に、一つのスクリプトを記述することで指定する条件が来る(条件のtrueが終わる)まで処理を繰り返してくれます。
while文と違うのはwhile文の場合、特定の条件式を記述しその条件がまでtrueの間は実行するというものですが、for文の場合は特定の数値が繰り上がってその数値まで実行していきます。
※繰り返し処理を記述する場合、無限ループにならないように気をつけましょう
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function myFunction() { var x = 10; for(i = 0; x > i; i++){ Logger.log('iの値がカウントされる→' + i); } Logger.log('------------------------------------'); //break var x = 10; for(i = 0; x > i; i++){ Logger.log('iの値がカウントされる→' + i); if(i === 5){ break; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[19-03-07 01:47:46:678 JST] iの値がカウントされる→0 [19-03-07 01:47:46:679 JST] iの値がカウントされる→1 [19-03-07 01:47:46:679 JST] iの値がカウントされる→2 [19-03-07 01:47:46:680 JST] iの値がカウントされる→3 [19-03-07 01:47:46:680 JST] iの値がカウントされる→4 [19-03-07 01:47:46:680 JST] iの値がカウントされる→5 [19-03-07 01:47:46:681 JST] iの値がカウントされる→6 [19-03-07 01:47:46:681 JST] iの値がカウントされる→7 [19-03-07 01:47:46:681 JST] iの値がカウントされる→8 [19-03-07 01:47:46:682 JST] iの値がカウントされる→9 [19-03-07 01:47:46:682 JST] ------------------------------------ [19-03-07 01:47:46:682 JST] iの値がカウントされる→0 [19-03-07 01:47:46:683 JST] iの値がカウントされる→1 [19-03-07 01:47:46:683 JST] iの値がカウントされる→2 [19-03-07 01:47:46:683 JST] iの値がカウントされる→3 [19-03-07 01:47:46:684 JST] iの値がカウントされる→4 [19-03-07 01:47:46:684 JST] iの値がカウントされる→5 |
switch文の中で処理を中断するためにbreak文を使用しましたが、繰り返し処理の中でもbreak文を使用することが可能です。以下コードはiのカウント数が5だった場合にtrueとしてbreak文が実行する事ができます。
10.例外処理
GASも通常のプログラムもそうですが、想定しないエラーが発生することがあります。しかし発生する要因は様々あるため、それら要因を全て潰してコード書くのは現実的に不可能です。
本来やらないければいけないコードの記述が一切できなくなってしまいます。
そのため、この例外処理がとても便利なんです。
まずはエラーを発生させたいので、GoogleDriveからGoogle Apps Scriptを選択して、GASのコードを記述できるスクリプトエディタを開きます。

1 2 3 |
function myFunction() { Browser.msgBox('ビジボット'); } |
Browser.msgBoxはスプレッドシートにポップアップを表示する処理ですが、スプレッドシート情報がないため、エラーが発生します。

try…catch…finally文
GAS(JavaScript)で例外処理を行う場合は、『try…catch…finally文』を使います。
『try{}ブロック』内で例外が発生した場合、すぐに『catchブロック{}』に処理が移ります。
『finally{}ブロック』は例外が発生しなくても実行されるので、不要であれば省略可能です!
※この時、変数eには例外で発生したErrorオブジェクトが渡されて、Errorオブジェクトのmessageプロパティにあるエラーメッセージが表示されてます
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function myFunction() { try{ //ここで例外が発生 Browser.msgBox('ビジボット'); //エラー変数eとしてcatchの引数に渡す } catch(e) { //logにエラーメッセージを出力 Logger.log('例外が発生しました:' + e.message); //例外の有無に関わらず実行する処理(なくてもいい) } finally { Logger.log('スクリプトの実行完了!!!'); } } |
Browser.msgBoxはスプレッドシートにポップアップを表示する処理ですが、スプレッドシート情報がないため、エラーが発生します。
1 2 |
[19-03-07 02:20:52:352 JST] 例外が発生しました:このコンテキストから Browser.msgBox() を呼び出せません。代わりに Logger.log() を試しましたか? [19-03-07 02:20:52:352 JST] スクリプトの実行完了!!! |
throw文
GASの例外は発生したものを受動的に検知して利用するだけではなく、スクリプト内で自ら進んで発生されることもできます。その場合、『throw文』を使います。例外を発生されることを『例外をスローする』とも言います。
1 2 3 4 5 6 |
function myFunction() { var x = 1; if(x === 1){ throw new Error('例外をスローする'); //エラーメッセージを表示する } } |

さまざまな処理の合間に例外処理を挟む事で、どの部分で処理が終わってしまったのか?なぜ終わってしまったのか?を確認できるようになります。
少し手間と感じる部分ですが、入れておくだけでその後のメンテナンス性も向上します。
11.関数の呼び出し
GASは変数、すでに用意されている関数などを使って記述していきますが、自分でも関数を作る事ができます。
関数の作り方は至ってシンプルで、『function xxx {}』だけで、この記述をする事で、xxxという関数を作成されました。
この作成した関数を呼び出す記述を行なっていきます。
1 2 3 4 5 6 7 8 9 |
function action(){ var y = 5; y += 10; Logger.log('y:' + y); } function myFunction(){ action(); //ここでaction()関数を呼び出す事が可能です } |
1 |
[19-03-07 02:39:41:079 JST] y:15 |
戻り値
GASの関数を呼び出し方法は実施できましたが、ただ関数を作ってそこを呼び出す以外にも、関数Aで処理した結果を呼び出し先の関数Bに渡す事ができます。
まず渡す値のことを『引数』といい、呼び出した関数から受け取る値を『戻り値』と言いreturnを使います。
1 2 3 4 5 6 7 8 9 10 11 12 |
//戻り値の指定 function action(y){ y += 10; Logger.log('y:' + y); return y; } function callAction(){ var x = 10; Logger.log('戻してきたx:' + action(x)); //ここでaction()関数を呼び出す Logger.log('x:' + x); } |
1 2 3 |
[19-03-07 02:48:27:101 JST] y:20 [19-03-07 02:48:27:102 JST] 戻してきたx:20 [19-03-07 02:48:27:102 JST] x:10 |
さて、同じ関数内で『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』の『プリミティブデータ型』は全て値渡しです
参照渡しとは
シンプルに値渡しとは逆の考え方です。
値渡しの場合は、値を別メモリアドレスに保存して別データとして取り扱っていましたが、参照渡しの場合はメモリアドレスごと引数として渡します。
そのため、別関数で値を変更した場合、メモリアドレスに入っている値ごと変更されます。
※『オブジェクト』『配列のデータ』は全て参照渡しです※『オブジェクト』、『配列のデータ』は全て参照渡しです
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//戻り値の指定 function action(y){ y += 10; Logger.log('y:' + y); return y; } //戻り値の指定 function actionArr(y){ y[0] += 1; Logger.log('y:' + y); return y; } function callActionArr(){ Logger.log('--値渡し-------------'); var x = 10; Logger.log('戻してきたx:' + action(x)); Logger.log('x:' + x); Logger.log('--参照渡し-------------'); var x = [10,20,30]; Logger.log('戻してきたx:' + actionArr(x)); Logger.log('x:' + x); } |
1 2 3 4 5 6 7 8 |
[19-03-07 03:25:50:189 JST] --値渡し------------- [19-03-07 03:25:50:190 JST] y:20 [19-03-07 03:25:50:190 JST] 戻してきたx:20 [19-03-07 03:25:50:190 JST] x:10 [19-03-07 03:25:50:191 JST] --参照渡し------------- [19-03-07 03:25:50:191 JST] y:11,20,30 [19-03-07 03:25:50:192 JST] 戻してきたx:11,20,30 [19-03-07 03:25:50:192 JST] x:11,20,30 |