Google Apps Script (GAS) の基本構文についてまとめます。
GASは、JavaScriptをベースに作られていますので、JavaScriptの経験のある方はすでにご存知の内容と思います。
チートシートとしてもご利用ください。
Google Apps Scriptの基本的な使い方については下記をご覧ください。
- Google Apps Scriptのデータ型
- Google Apps Scriptの変数宣言
- Google Apps Scriptの文字列表現
- Google Apps Scriptの配列
- Google Apps Scriptのオブジェクト
- Google Apps Scriptの条件分岐
- Google Apps Scriptの繰り返し処理(ループ)
- Google Apps Scriptの算術演算子・代入演算子関連
- Google Apps Scriptの比較演算子
- Google Apps Scriptの論理演算子
- Google Apps ScriptのTry…Catch文
- Google Apps Scriptの関数
- Google Apps Scriptのクラス
- まとめ
Google Apps Scriptのデータ型
GASの主なデータ型には下記があります。
・数値型(number):整数や小数を表す型
・文字列型(string):文字列を表す型
・真偽型(boolean):true(真)とfalse(偽)を表す型
・null:値がないことを表す型
・undefined:値が定義されてないことを表す型
・配列型(array):複数のデータ群を表す型。インデックス番号で制御する。
・オブジェクト型(object):複数のデータ群を表す型。プロパティ名で制御する。
変数を利用する場合、データ型を宣言する必要はありません。変数に値を代入したタイミングで、自動的に型が選ばれます。
変数がどのデータ型になっているか確認するには、typeof関数を利用します。
例えば、下記のコードを実行します。
1 2 3 4 5 6 |
let testNumber = 123; let testString = "abc"; let testArray = ["aaa","bbb","ccc"]; console.log(typeof(testNumber)); console.log(typeof(testString)); console.log(typeof(testArray)); |
実行結果は下記になります。自動で型が設定されていることがわかります。
1 2 3 |
number string object |
なお、配列型の場合は、arrayではなくobjectと表示されます。配列もオブジェクト型の一種のためです。
また、配列型とオブジェクト型については、別の章で詳細を後述します。
Google Apps Scriptの変数宣言
GASの変数宣言にはデータ型は指定する必要はないですが、宣言にはlet、const、varの3種類があります。それぞれの違いは下記です。
項目 | let | const | var |
---|---|---|---|
再代入 | 可 | 不可 | 可 |
再宣言 | 不可 | 不可 | 可 |
スコープ | ブロック | ブロック | 関数 |
再代入は、値が代入されている変数に値を上書きすることです。
再宣言は、宣言された変数を別途新たに同じ名前の変数で宣言することです。
スコープは、変数を利用できる範囲です。
varが自由度が高いのですが、その分不具合が起きやすいため利用しない方が良いです。
そのため、基本的に変数にはletを利用して、値を変更しない定数として扱う場合はconstを利用するのがいいでしょう。
Google Apps Scriptの文字列表現
文字列は、「’」(シングルクォーテーション)、「”」(ダブルクォーテーション)「`」(バッククォート)のいずれかで囲んで表現します。
「’」と「”」で囲む場合は、下記のようにお互いの記号を文字列に含めることができます。
1 2 |
console.log('This is the "TEST".'); console.log("I'm ok."); |
「バッククォート」で囲む場合は、文字列の中に下記の書式( ${変数名} )で変数の値を含めることができます。
1 2 |
let place = "Kyoto"; console.log(`This is ${place}.`); |
実行結果は下記になります。
1 |
This is Kyoto. |
Google Apps Scriptの配列
配列の代入
配列に値を代入する場合、下記のような形式で行います。
1 2 |
const testArray = [10,20,30,40]; console.log(testArray); |
実行結果には下記が出力されます。
1 |
[ 10, 20, 30, 40 ] |
要素を指定して値を代入する場合は、下記のようになります。途中の要素を飛ばしても代入できます。飛ばされた要素にはnullが入ります。
1 2 3 4 |
const testArray = [10,20,30,40]; testArray[0] = 100; testArray[8] = 99; console.log(testArray); |
実行結果は下記になります。
0番目は100で上書きされます。8番目は99、空だった4番目〜7番目の要素はnullになります。
1 |
[ 100, 20, 30, 40, , , , , 99 ] |
配列の分割代入
分割代入とは、複数の変数に、配列の各要素をまとめて代入することです。
下記の構文で利用できます。
1 2 3 4 5 6 |
let [a, b, c, d] = [10, 20, 30, 40] console.log(a, b, c, d); const testArray = ["aaa", "bbb", "ccc"]; let [stringA, stringB, stringC, stringD] = testArray; console.log(stringA, stringB, stringC, stringD); |
実行結果は下記になります。
a,b,c,dに配列の各要素が代入されます。
stringA,stringB,striingC,stringDには、配列testArrayの各要素が代入されます。
ちなみに、stringDは要素がないためundefiendになります。
1 2 |
10 20 30 40 aaa bbb ccc undefined |
配列のスプレッド構文
スプレッド構文とは、配列や文字列などを展開するための構文です。
下記のように、変数の前にドットを3つ付与して記述します。
1 2 3 4 5 |
const testArray = ["aaa", "bbb", "ccc"]; console.log(testArray); console.log(...testArray); console.log("000", ...testArray, "ddd"); |
実行結果は下記です。下記のように配列の各要素の値が展開されます。
1 2 3 |
[ 'aaa', 'bbb', 'ccc' ] aaa bbb ccc 000 aaa bbb ccc ddd |
また、下記のように文字列に対してスプレッド構文を使うと、
1 2 |
const testArray = "文字列"; console.log(...testArray); |
下記のように1文字ずつ展開されます。
1 |
文 字 列 |
Google Apps Scriptのオブジェクト
オブジェクトの代入
オブジェクトに値を代入する場合、下記のような形式で行います。
1 2 3 4 5 6 7 |
const testObject = { name: "Tanaka", age: 32 }; console.log(testObject); testObject.name = "Suzuki"; //プロパティnameが上書きされる testObject['age'] = 33; //プロパティageが上書きされる testObject.from = "Tokyo"; //プロパティfromが新規追加される console.log(testObject); |
実行結果は下記になります。
1 2 |
{ name: 'Tanaka', age: 32 } { name: 'Suzuki', age: 33, from: 'Tokyo' } |
上記のように、値の参照には、「testObject.プロパティ名」の書き方と「testObject[‘プロパティ名’]」の2つの書き方があります。
オブジェクトの分割代入
分割代入とは、複数の変数に、オブジェクトの各要素をまとめて代入することです。
下記の構文で利用できます。変数の名前と、オブジェクトのプロパティ名は一致させる必要があります。
1 2 3 4 5 6 |
let {a, b, c, d} = {a:10, b:20, c:30, d:40}; console.log(a, b, c, d); const testObject = {stringA:"aaa",stringB:"bbb",stringC:"ccc"}; let {stringA,stringB,stringC} = testObject; console.log(stringA,stringB,stringC); |
実行結果は下記になります。
変数a,b,c,dにオブジェクトの同じ名前の値が代入されます。
変数stringA,stringB,striingCには、オブジェクトの同じ名前の値が代入されます。
1 2 |
10 20 30 40 aaa bbb ccc |
オブジェクトのスプレッド構文
スプレッド構文とは、配列や文字列などを展開するための構文です。
下記のように、変数の前にドットを3つ付与して記述します。
1 2 3 4 5 6 |
let testObject = { a: "aaa", b: "bbb", c: "ccc" }; console.log(testObject); testObject = { 0: "000", ...testObject, d: "ddd" }; console.log(testObject); console.log(...testObject); //オブジェクトのスプレッド構文はconsole.logではエラーになる |
実行結果は下記です。
オブジェクトの各要素の値が展開され再代入されます。
また、console.log内でオブジェクトのスプレッド構文を利用した場合はエラーになります。
1 2 3 |
{ a: 'aaa', b: 'bbb', c: 'ccc' } { '0': '000', a: 'aaa', b: 'bbb', c: 'ccc', d: 'ddd' } TypeError: Found non-callable @@iterator |
Google Apps Scriptの条件分岐
指定した条件式の結果がtrue(真)かfalse(偽)かによって、その後の処理を分岐する構文です。
if文の条件分岐
ifの後に条件式を記載し、trueであればブロック内の処理を実行して終了し、falseであれば後続の条件式へ進みます。
下記のように記述します。不要であればelse以降は省略可能です。
1 2 3 4 5 6 7 |
if (x > 10) { console.log(x + "は、10より大きい"); } else if (x > 5) { console.log(x + "は、5より大きくて10以下"); } else { console.log(x + "は、5より小さい"); } |
xが12の場合、「12は、10より大きい」と出力、
xが6の場合、「6は、5より大きくて10以下」と出力、
xが1の場合、「1は、5より小さい」と出力されます。
xが12の場合は、(x > 5)も満たしていますが、(x > 10)の処理で終了するため、(x > 5)の処理は実行されません。
このように、上から順番に条件式が判定され、条件式を満たせば処理を実行してif文を終了します。
switch文の条件分岐
switchの後に条件式を記載し、caseで指定した値と一致した場合にその処理を実行します。
処理実行後にswitch文は終わらず、それ以降の全ての処理を実行します。
下記のように記述したとします。defaultはいずれも一致しなかった場合という意味です。
1 2 3 4 5 6 7 8 9 10 |
x = "A"; switch (x) { case "A": console.log("Aと一致しました"); case "B": console.log("Bと一致しました"); default: console.log("何も一致しませんでした"); } |
実行結果は下記になります。case “B”やdefaultの処理も実行されています。
このように該当したところ以降の処理が実行されるのがswitch文です。
1 2 3 |
Aと一致しました Bと一致しました 何も一致しませんでした |
しかし、実際には、該当した部分の処理だけを実行してほしいことがほとんどだと思います。
そのため、下記のように各処理の後にbreak文を入れます。break文の時点でswitch文は終了します。
1 2 3 4 5 6 7 8 9 10 11 12 |
x = "A"; switch (x) { case "A": console.log("Aと一致しました"); break; case "B": console.log("Bと一致しました"); break; default: console.log("何も一致しませんでした"); } |
実行結果は下記になります。
1 |
Aと一致しました |
Google Apps Scriptの繰り返し処理(ループ)
同じ処理を繰り返す際に利用する構文です。
while文の繰り返し処理
whileの後の条件式がtrue(真)の間、ブロック内の処理を繰り返します。
1 2 3 4 5 |
x = 10; while (x < 15) { x++; console.log(x); } |
実行結果は下記になります。
1 2 3 4 5 |
11 12 13 14 15 |
for文の繰り返し処理
指定したカウンタ変数の条件式がtrue(真)の間、ブロック内の処理を繰り返します。
1 2 3 |
for (let i = 1; i < 5; i++) { console.log(i); } |
実行結果は下記になります。
1 2 3 4 |
1 2 3 4 |
for…of文の繰り返し処理
配列のすべての要素に対して処理を行います。文字列に対しても利用できます。
1 2 3 4 |
const testArray = [10,20,30]; for (const value of testArray){ console.log(value); } |
下記の実行結果になります。
1 2 3 |
10 20 30 |
また、文字列に対して利用した場合は下記のようになります。
1 2 3 4 |
const testString = "test"; for (const value of testString){ console.log(value); } |
実行結果は下記です。
1 2 3 4 |
t e s t |
for…in文の繰り返し処理
オブジェクトのすべての要素を順不同で取得して処理を行います。
下記のように実行します。
1 2 3 4 |
const testObject = { name: "Suzuki", age: 32 }; for (const value in testObject) { console.log(`${value}の値は${testObject[value]}`); } |
下記の実行結果になります。valueにはプロパティの名前が入っています。
1 2 |
nameの値はSuzuki ageの値は32 |
Google Apps Scriptの算術演算子・代入演算子関連
四則演算などには下記の記号を利用できます。
演算子 | 説明 | 例 | 結果 |
---|---|---|---|
+ | 足し算または文字列の連結 | 1 + 3 “abc” + “def” | 4 abcdef |
– | 引き算 | 4 – 1 | 3 |
* | 掛け算 | 3 * 3 | 9 |
/ | 割り算 | 12 / 4 | 3 |
% | 割り算の余り | 15 % 12 | 3 |
** | べき乗 | 2 ** 4 | 16 |
下記のように計算結果を直接変数に代入できる演算子もあります。
演算子 | 説明 | 例 | 結果(xの値) |
---|---|---|---|
+= | 値を足し算して代入 | x = 1; x += 3; x = “abc”; x += “def”; | 4 abcdef |
-= | 値を引き算して代入 | x = 4; x -= 1; | 3 |
*= | 値を掛け算して代入 | x = 3; x *= 3; | 9 |
/= | 値を割り算して代入 | x = 12; x /= 4; | 3 |
%= | 値を割り算した余りを代入 | x = 15; x %= 12; | 3 |
**= | 値をべき乗して代入 | x = 2; x **= 4; | 16 |
また、下記のような1足したり1引いたりする演算子もあります。
演算子 | 説明 | 例 | 結果(xの値) |
---|---|---|---|
++ | 1足す | x = 10; x++; | 11 |
-- | 1引く | x = 10; x-- ; | 9 |
Google Apps Scriptの比較演算子
条件式に利用できる比較演算子は下記が利用できます。
演算子 | 説明 | 例 | 結果 |
---|---|---|---|
== | 左辺と右辺が等しい場合に true | 10 == 10 10 == “10” | true true |
!= | 左辺と右辺が等しくない場合に true | 10 != 9 | true |
< | 左辺が右辺より小さい場合に true | 2 < 3 | true |
<= | 左辺が右辺以下の場合に true | 2 <= 2 | true |
> | 左辺が右辺より大きい場合に true | 3 > 2 | true |
>= | 左辺が右辺以上の場合に true | 3 >= 2 | true |
=== | 左辺と右辺がデータ型も含め等しい場合 true | 10 === 10 10 === “10” | true false |
!== | 左辺と右辺がデータ型も含め等しくない場合 true | 10 !=== 10 10 !=== “10” | false true |
イメージしにくい「==」「!=」と「===」「!==」の違いについて実際に実行してみます。
下記を実行してみると、
1 2 3 4 5 6 7 8 |
console.log(`10 == 10 は、${10 == 10}`); console.log(`10 == "10" は、${10 == "10"}`); console.log(`10 === 10 は、${10 === 10}`); console.log(`10 === "10" は、${10 === "10"}`); console.log(`10 != 10 は、${10 != 10}`); console.log(`10 != "10" は、${10 != "10"}`); console.log(`10 !== 10 は、${10 != "10"}`); console.log(`10 !== "10" は、${10 !== "10"}`); |
下記の実行結果になります。
1 2 3 4 5 6 7 8 |
10 == 10 は true 10 == "10" は、true 10 === 10 は、true 10 === "10" は、false 10 != 10 は、false 10 != "10" は、false 10 !== 10 は、false 10 !== "10" は、true |
Google Apps Scriptの論理演算子
複数の条件式を組み合わせたり、trueとfalseを反対にする論理演算子には下記を利用できます。
演算子 | 説明 | 例 | 結果 |
---|---|---|---|
&& | いずれもtrueの場合 true | 10 == 10 && 9 == 9 10 == 10 && 9 == 8 10 == 9 && 9 == 8 | true false false |
|| | どちらかがtrueの場合 true | 10 == 10 || 9 == 9 10 == 10 || 9 == 8 10 == 9 || 9 == 8 | true true false |
! | trueとfalseを反対にする | !(10 == 10) !(10 == 9) | false true |
Google Apps ScriptのTry…Catch文
スクリプト実行時に例外エラーが発生すると処理が停止してしまいます。
例外エラーが発生しても、発生したエラーに応じて何らかの処理を継続するにはTry…Catch文を利用します。
下記のように記述します。
1 2 3 4 5 6 7 8 9 |
let testArray = { name: "Suzuki", age: 32 }; try { console.log(...testArray); } catch (e) { console.log("エラーが発生しました: " + e); } finally { console.log("スクリプトが完了しました。"); } |
tryブロックには、実行したい処理を入れます。ここでは、console.logにオブジェクトのスプレッド構文を入れることで例外エラーを出しています。
catchブロックには、エラーが発生した場合に実行したい処理を入れます。eとはエラーメッセージの内容が入った変数です。
finallyブロックには、エラーが発生するかしないかにかかわらず実行したい処理を入れます。finallyブロックは省略可能です。
実行結果は下記になります。エラー停止することなく最後まで実行されます。
1 2 |
エラーが発生しました: TypeError: Found non-callable @@iterator スクリプトが完了しました。 |
なお、独自の例外エラーを出したい場合は、下記の構文で例外エラーを発行できます。
1 |
throw new Error("○○○のエラーが発生しました"); |
Error関数の部分は、RangeError、ReferenceError、SyntaxError、TypeErrorなどエラーの種類を指定した関数でも同じように実行できます。そうすることで、何の種類のエラーなのかがわかりやすくなります。
Google Apps Scriptの関数
GASにおける関数に関する構文についてです。
function文による関数宣言
基本的な関数の宣言方法です。
下記のように関数を宣言します。
1 2 3 4 5 6 7 |
function myFunction() { console.log(testFunction(2, 3)); } function testFunction(num1, num2) { return num1 + num2; } |
testFunctionという関数を宣言しています。
num1とnum2は引数です。不要であれば省略できます。
return文で戻り値を指定できます。不要であれば省略できます。
実行結果は下記になります。
1 |
5 |
なお、下記のように関数名の末尾に「_」(アンダースコア)をつけることでプライベート関数になり、プロジェクト外からは見えない関数にできます。
1 2 3 4 5 6 7 |
function myFunction() { console.log(testFunction(2, 3)); } function testFunction_(num1, num2) { return num1 + num2; } |
下記のように実行する関数の選択からも見えなくなります。
関数リテラルによる関数宣言
関数を変数に代入したり、オブジェクトの要素として追加したり、引数としても利用できる宣言方法です。
下記のように関数を宣言します。下記は変数に代入する場合の例です。
1 2 3 4 5 6 7 |
function myFunction() { console.log(test(2, 3)); } const test = function (num1, num2) { return num1 + num2; }; |
関数名は不要です。関数を変数に代入しており、変数名で関数を呼び出せます。
関数名が不要なため、関数名が重複してしまうことを防げるのがメリットです。
変数名の末尾に「_」(アンダースコア)をつけることでプライベート関数にできます。
アロー関数による関数宣言
関数リテラルをよりシンプルにした宣言方法です。
下記のように関数を宣言します。下記は変数に代入する場合の例です。
1 2 3 4 5 6 7 |
function myFunction() { console.log(test(2, 3)); } const test = (num1, num2) => { return num1 + num2; }; |
「function」も不要になります。「=>」で引数と処理ブロックをつなぎます。
アロー関数には条件次第でさらに省略形があります。
■引数が一つの場合の省略形
下記のように、引数の前後の括弧「()」を省略できます。
1 2 3 4 5 6 7 |
function myFunction() { console.log(test(2, 3)); } const test = num1 => { return num1 + 2; }; |
■処理が1行の場合の省略形
下記のように、処理ブロックの括弧「{}」を省略できます。
1 2 3 4 5 |
function myFunction() { test(2); } const test = num1 => console.log(num1 + 2); |
■処理が一つでreturn文のみの場合の省略形
下記のように、「return」という文字は不要で戻り値を指定できます。
1 2 3 4 5 |
function myFunction() { console.log(test(2)); } const test = num1 => num1 + 2; |
なお、引数がない場合は、下記のように括弧が必要です。
1 2 3 4 5 6 7 |
function myFunction() { console.log(test()); } const test = () => { return 3; } |
デフォルト引数
GASでは、関数を呼び出す際の引数の数と、関数で宣言された引数の数が不一致でもエラーにはなりません。
引数の数が異なる下記を実行したとします。
1 2 3 4 5 6 7 8 9 |
function myFunction() { testFunction(1); testFunction(1, 2); testFunction(1, 2, 3); } function testFunction(x, y) { console.log(x, y); } |
実行結果は下記です。
1 2 3 |
1 undefined 1 2 1 2 |
引数が足りない場合は、undefinedになります。
引数が多い場合は、後ろの引数は無視されます。
引数が足りないケースでもundefinedにならないよう、デフォルト引数でデフォルトの値を設定できます。
下記のようにデフォルト値を設定したい引数に「=」を付けて値を指定します。下記の場合はyのデフォルト値を2に設定しています。
1 2 3 4 5 6 7 8 9 |
function myFunction() { testFunction(1); testFunction(1, 2); testFunction(1, 2, 3); } function testFunction(x, y = 2) { console.log(x, y); } |
同じコードを実行すると、今度は実行結果は下記になります。
1 2 3 |
1 2 1 2 1 2 |
残余引数
引数が多すぎると、超えた引数は無視されると説明しましたが、すべての引数を受け取る関数を作りたい場合は、残余引数というもので実現できます。
下記のように、引数名の前にドットを3つ付けた引数を残余引数と呼びます。
1 2 3 4 5 6 7 8 |
function myFunction() { testFunction(1, 2, 3); testFunction(1, 2, 3, 4, 5); } function testFunction(x, y, ...others) { console.log(x, y, others); } |
実行結果は下記になります。
残余引数の部分は、引数の数を超えて呼ばれたとしても配列としてすべて受け取れます。
1 2 |
1 2 [ 3 ] 1 2 [ 3, 4, 5 ] |
ドキュメンテーションコメント
関数の内容がわかるよう、関数の直前に下記のような書式でコメントを残します。
1 2 3 4 5 6 |
/** * 足し算をする関数 * @param {number} x - 足し算する一つ目の数値 * @param {number} y - 足し算する二つ目の数値 * @return {number} 足し算の結果を返す */ |
上記の書式で記載しておくことで、下記のようにコード入力時に説明が表示されるというメリットもあります。
Google Apps Scriptのクラス
クラスの定義
GASでのクラス定義の構文を説明します。
クラスは、下記の構文で作成します。
1 2 3 |
class クラス名{ //クラスの内容 } |
プロパティ
クラスでプロパティを定義するには、コンストラクタ関数を利用します。
class文の中に下記の構文で記述します。
1 2 3 |
constructor(仮引数1, 仮引数2, …){ //必要な処理 } |
メソッド
クラスでメソッドを定義するには、class文の中に下記の構文で記述します。
1 2 3 |
メソッド(仮引数1, 仮引数2, …){ //必要な処理 } |
静的プロパティ
静的プロパティは、クラスをインスタンス化しなくても直接使用できるプロパティです。
クラスで静的プロパティを定義するには、class文のあとに下記の構文で記述します。
1 |
クラス名.プロパティ = 値; |
静的メソッド
静的メソッドは、クラスをインスタンス化しなくても直接使用できるメソッドです。
クラスで静的メソッドを定義するには、class分の中に下記の構文で記述します。
1 2 3 |
static メソッド(仮引数1,仮引数2,…){ //必要な処理 } |
クラスのインスタンス化
クラスをインスタンス化するには、下記の構文で記述します。
1 |
new クラス(引数1, 引数2, …) |
実行例
ここまで説明した構文を実際のコード例は下記です。
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 |
function myFunction() { const test = new TestClass("apple", 1000); //クラスのインスタンス化 console.log(test.product); //プロパティの呼び出し console.log(test.getPriceWithTax()); //メソッドの呼び出し console.log(TestClass.tax); //静的プロパティの呼び出し console.log(TestClass.getTax()); //静的メソッドの呼び出し } //クラスの定義 class TestClass { constructor(product, price) { this.product = product; //プロパティ this.price = price; //プロパティ } //メソッド getPriceWithTax() { return this.price * 1.1; } //静的メソッド static getTax() { return this.tax; } } TestClass.tax = 1.1; //静的プロパティ |
実行結果は、下記になります。
1 2 3 4 |
apple 1100 1.1 1.1 |
まとめ
Google Apps Script (GAS) の基本構文についてまとめました。
GASは無料で利用できてとても便利なツールです。
Googleスプレッドシート等のGoogleアプリケーションを利用されている方は、GASを習得することで作業を大きく効率化できます。
プログラミングの考え方や基礎について体系的に学びたい方は、プログラミングスクール「デイトラ」がおすすめです。
「Web制作コース」では、Google Apps ScriptのベースとなるJavaScriptを学べます。
■おすすめポイント①:圧倒的なコストパフォーマンス
3カ月で数十万円かかることも珍しくない中で、デイトラは、10万円以下という業界最安級の価格で提供されています。
■おすすめポイント②:1日1題形式のため継続しやすい
1日1題形式のため、初心者の方でも継続しやすい学習形式になっています。1年間のメンターによるサポートも付いており、わからないところもアドバイスしてもらえるため、自分で調べて学ぶよりも理解を深められます。
■おすすめポイント③:教材を無期限で閲覧可能
教材は、1年間のサポート期間終了後も閲覧でき、いつでも復習に利用できます。教材がアップデートされた場合も、常に最新版を閲覧できます。コース費用に無期限で利用できる教材が含まれていることを考えても、コストパフォーマンスの良いスクールと言えます。
興味のある方は、コース内容を確認してみてください。