GAS基本(学習備忘録)

-
- 「GAS リファレンス」で検索すると出てくるはず
-
ショートカットキー
- ⌘+R
- 関数実行
- 実行したい関数を選択してから⌘+Rで実行しないと、先頭のコマンドが実行される感じになる
- 関数実行
- ⌘+S
- 保存
- 単語を選択してから、⌘+D(escで解除)
- 複数行にまたがる同一の単語を一気に変えられる
- ⌘+F
- 検索と置換
- ⌘+/
- コメント
- ⌥+↓
- 行の移動
- F1でGASで使えるコマンドを表示できる
- ⌘+R
-
GASのプロジェクトタイトルは、紐づくスプレッドシートのファイル名と一致させておくと分かりやすい
-
関数名を決める際は、動詞+名詞で関数名を決めると、どのような関数かイメージしやすい
- getEventsとか
-
ファイル名は、関数名と同じ名前を付けると、どのファイルにどの関数が記載されているかわかりやすい

基本説明
大きく分けて、GASは以下の二種類に分かれる
- スタンドアローンスクリプト
- コンテナ(googleサービス)に接続しないスクリプト
- コンテナバインド
- コンテナ(スプレッドシートとか)に結合したスクリプト
画面説明
- ファイルというのは、プロジェクトに紐づいているファイルのこと
- GASのファイルは「.gs」になっている
- オレンジ色の●は、未保存のコードがある状態を指す
コーディング関連
基本的なところ
- javascriptは、文の終わりに「;」をつける(つけなくても基本的に動くが、動かないことがあるらしい)
変数
-
const(定数のように使う)
- 基本的に値の上書きができない
- 上書きされるとどんな値になっているか分かりづらくなるので、なるべく再代入しないconstを使う
-
let(変数として使う)
- 値の上書きができる
-
変数にvarは使わない
※基本的にconstを使う(上書きされるとどんな値になっているか分かりづらくなるので、なるべく再代入しないconstを使う) -
変数で文字列を代入する場合は、は’か”で囲む(どっちを使うかは、チームによって変わる)
-
定義した変数が使われていない時は、グレー色になる
-
変数・定数を定義する際の注意
- 大文字と小文字は区別される
- 数字、一部を除いた記号は、先頭の文字に使用不可
- 予約後(あらかじめ定義されている単語)は使用不可
- javascriptの予約後が使えない
-
変数・定数を命名する際のコツ
- 英単語を使用する。日本語は使用しない
- 中身・役割がわかるような意味のある名前をつける
- チームの場合は、変数名のルールを決めておく
- 先頭文字だけ大文字にするとか
- GAS,JavaScriptの推奨ルール
- 変数名・関数名:キャメル記法にする
- キャメル記法(キャメル=ラクダ):単語を連結する場合は2単語目以降の頭文字を大文字にする
- sheetName
- userName
- emailList
- user
- キャメル記法(キャメル=ラクダ):単語を連結する場合は2単語目以降の頭文字を大文字にする
- 定数名:スネーク記法にする
- スネーク記法:単語をアンダースコア(_)で連結してすべて大文字にする
- USER_ID
- USER_PASWORD
- ID
- スネーク記法:単語をアンダースコア(_)で連結してすべて大文字にする
- 変数名・関数名:キャメル記法にする
ログ見たいとき
- Logger.log();
- console.log();
↑console.logがjavascriptで使われていて、loggerのほうがGASで使われているイメージ。どっちを使ってもいい
データ型
- コンピュータが扱っているデータの型(特徴)のこと
- 数値型(number型):数値を扱う
- a = 7525
- 文字列型(string型):テキストを扱う
- Name = "佐藤”
- 配列型(object型):複数の数値を扱う(書き方が2種類ある)
- const data = [3, 4, 5];
- ↑わかりやすいようにスペースを空けているが、空けなくてもいい
- const data = {'name':'いまにゅ'};
- const data = [3, 4, 5];
- 真偽型(boolean):真偽を判定する
- true/false
typeofでデータ型を確かめられる
- true/false
- 数値型(number型):数値を扱う
配列(リスト)
-
複数の値をまとめて扱いたい場合に便利なデータ型
-
例1:イベント参加者100名の名前をまとめて管理
-
例2:自分の5科目のテスト結果をまとめて扱いたい
-
配列の0列目の要素を取りたい場合(1次元配列)
function myFunction() {
const data = [1, 2, 3];
Logger.log(data[0]);
}
- 配列の2列目(つまり三列目)の要素を取りたい場合(2次元配列)
function myFunction() {
const data = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]];
Logger.log(data[2]);
}
- 配列の2列目(つまり3行目)の中の1行目(つまり2行目)要素を取りたい場合(2次元配列)
function myFunction() {
const data = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]];
Logger.log(data[2][1]);
}
オブジェクト
- オブジェクト:プロパティと値をもった複数のデータのこと
- プロパティ:keyとも呼ぶ。値:valueとも呼ぶ
- keyには基本的に日本語を使わない(コードの見た目がかっこ悪くなるので)
※配列は[]で囲む、オブジェクトは{}で囲む
function myFunction() {
const scores = {
'japanese': 50,
'english': 70,
'math': 88,
'science': 34,
'society': 90
};
Logger.log(scores);
}
↓の用な感じでも書ける(クォーテーションで囲まなくてもOK)
※他の言語だと、クォーテーションで囲まないといけなかったりするので、囲むのが一般的な書き方
function myFunction() {
const scores = {
japanese: 50,
english: 70,
math: 88,
science: 34,
society: 90
};
Logger.log(scores.japanese);
}
japaneseのvalueを取得したい場合①(オブジェクトは、配列のような順番の概念が無い)
(この書き方はブラケット記法と呼ぶ)
※Loggerの部分の書き方が二種類ある
function myFunction() {
const scores = {
'japanese': 50,
'english': 70,
'math': 88,
'science': 34,
'society': 90
};
Logger.log(scores['japanese']);
}
japaneseのvalueを取得したい場合②
※Loggerの部分の書き方が二種類ある(この書き方はドット記法と呼ぶ)
function myFunction() {
const scores = {
'japanese': 50,
'english': 70,
'math': 88,
'science': 34,
'society': 90
};
Logger.log(scores.japanese);
}
比較演算子と論理演算子
- 比較演算子:2つの値を比較して結果を真偽で判断する
- 2<100:真(true)
- 2<0.1:偽(false)
- 論理演算子:複数の条件を組み合わせて、結果を真偽で判断する
↓numに格納した100が3より大きいか
function myFunction() {
const num = 100;
Logger.log(num > 3);
}
↓等しいか(等しいとture)
function myFunction() {
// const num = 1;
Logger.log(3 == 3);
}
↓等しくないか(等しくないとture)
function myFunction() {
// const num = 1;
Logger.log(3 != 3);
}
- 論理演算式
↓2つを満たしているか(どちらもtureならture)
function myFunction() {
// const num = 1;
Logger.log((3 > 1) && (5 > 1));
}
↓どちらか片方を満たしているか(どちらかtureならture)
- 制御構文
プログラムを構成する上で重要な役割を果たす構文
- 条件分岐
- 繰り返し処理
- IF文の書き方
- ()の中には条件を書く
- {}の中には条件に合致した場合の処理を書く
function myFunction() {
const a = 7;
if(a>5){
Logger.log('aは5より大きいです。')
}
}
↓falseの場合の処理を書きたい場合は、続けてelseを書いていく
function myFunction() {
const a = 1;
if(a>5){
Logger.log('aは5より大きいです。')
}else{
Logger.log('aは5以下です。')
}
}
複数の条件に分岐したい場合は、else ifと記述し、()と[]の形式にして記述していく
上から順に条件分岐していくので、注意する
function myFunction() {
const a = 0;
if(a>5){
Logger.log('aは5より大きいです。');
}else if(a<=5 && a>1){
Logger.log('aは5以下かつ、1より大きいです。')
}else{
Logger.log('aは1以下です。');
}
}
for文
for文も、if文と同じように()と{}になっている
function myFunction() {
const nums = [1, 2, 3]
for(let i=0; i<3; i++){
Logger.log(i);
}
}
【実行ログ】
14:06:08 お知らせ 実行開始
14:06:08 情報 0.0
14:06:08 情報 1.0
14:06:08 情報 2.0
14:06:08 お知らせ 実行完了
let i=0;で変数を初期化している。
i<3;で「いつまで」の条件を入れている
i++で、「1回ごとの処理」を入れている。i++は「iに1を足す」という意味
変数はiから始める風習がある(indexから来ている説がある)
3になった時点で、i<3の条件を満たさなくなるので、2までしかログに出てこない
↓配列の中身を出力したい場合
function myFunction() {
const nums = [1, 2, 3]
for(let i=0; i<3; i++){
Logger.log(i);
}
}
【実行ログ】
14:16:00 お知らせ 実行開始
14:16:00 情報 0.0
14:16:00 情報 1.0
14:16:00 情報 2.0
14:16:00 お知らせ 実行完了
↓1つ目の配列の二倍の値を格納した配列を用意したい場合
pushというのは、メソッドと呼ばれるもので、配列に対して、要素を新しく追加するということ
function myFunction() {
const nums = [1, 2, 3]
const nuweNums = [];
for(let i=0; i<3; i++){
nuweNums.push(nums[i]*2);
}
Logger.log(nuweNums);
}
【実行ログ】
14:20:04 お知らせ 実行開始
14:20:04 情報 [2.0, 4.0, 6.0]
14:20:04 お知らせ 実行完了
↓配列の個数分処理したい場合は、「.length」と記述するとよい
「.length」で、numsという配列の長さを取ってきている。
配列がlengthというプロパティを持っている。lengthが配列の長さを保持している
function myFunction() {
const nums = [1, 2, 3, 4, 5] ;
for(let i=0; i<nums.length; i++){
Logger.log(nums[i]);
}
}
【実行ログ】
14:28:43 お知らせ 実行開始
14:28:42 情報 1.0
14:28:42 情報 2.0
14:28:42 情報 3.0
14:28:42 情報 4.0
14:28:42 情報 5.0
14:28:43 お知らせ 実行完了
for…in文
- 配列(オブジェクト)の長さ分を繰り返し処理する
- 配列の場合はindexを取り出して、
- オブジェクトの場合は、プロパティを順番に取り出す
※scoresという配列から、順番にindexへ要素番号を代入している
function myFunction() {
const scores = {
japanese: 50,
english: 70,
math: 88,
science: 34,
society: 90
};
for(let key in scores){
Logger.log(key);
}
}
【実行ログ】
14:49:00 お知らせ 実行開始
14:49:00 情報 japanese
14:49:00 情報 english
14:49:00 情報 math
14:49:00 情報 science
14:49:00 情報 society
14:49:00 お知らせ 実行完了
for…of文
for…in文同様に、配列(オブジェクト)の長さ分を繰り返し処理する
for...in文では、インデックス・プロパティを取り出していたが、
for...of文では、要素そのものを取り出す際に使う
配列は基本的に複数なので、命名も複数形にしたほうがわかりやすい
関数
関数とは、あらかじめ決めておいた処理をまとめた機能のこと
↓基本的にはLoggerの部分を、Returnで使っていく
// 三角形の面積を返す関数
function calcTri(base, height) {
Logger.log(base*height/2);
}
function mainFunc(){
calcTri(3, 10)
// Calctri関数のbaseに3、heightに10が入って計算される
}
【実行ログ】
15:12:55 お知らせ 実行開始
15:12:55 情報 15.0
15:12:55 お知らせ 実行完了
↓アロー関数という書き方で書かれる場合もある(比較的主流かつ新しい書き方)
// 三角形の面積を返す関数
const calcTri = (base, height) =>{
return(base*height/2);
}
function mainFunc(){
calcTri(3, 10)
// Calctri関数のbaseに3、heightに10が入って計算される
}
メソッド
オブジェクトがプロパティとして格納している関数
オブジェクト:操作できるもの
オブジェクトの情報の中に関数があり、それをメソッドと呼んでいる
- 配列が持つメソッド:forEachメソッド
- 配列に対して行うfor文の処理を使いやすくした機能
- 色々書き方はあるが、とりあえずforEachだけ使ってればどうにかなる。
- 他のfor文系はあまり使わないかも
※for...in、for...ofと同様の処理ができる
↓今までのfor文
function myMethod() {
const usernames =['いまにゅ','さとう', 'すずき'];
for(let username of usernames){
Logger.log(username+'さん');
}
}
【実行ログ】
15:51:24 お知らせ 実行開始
15:51:24 情報 いまにゅさん
15:51:24 情報 さとうさん
15:51:24 情報 すずきさん
15:51:24 お知らせ 実行完了
↓for Eachで書いた処理
function myMethod() {
const usernames =['いまにゅ','さとう', 'すずき'];
usernames.forEach(function(username, index){
Logger.log(username+'さん');
})
}
【実行ログ】
15:54:13 お知らせ 実行開始
15:54:13 情報 いまにゅさん
15:54:13 情報 さとうさん
15:54:13 情報 すずきさん
15:54:13 お知らせ 実行完了
↓indexも取得したもの
function myMethod() {
const usernames =['いまにゅ','さとう', 'すずき'];
usernames.forEach(function(username, index){
Logger.log(index+1+'番目の'+username+'さん');
})
}
【実行ログ】
15:56:31 お知らせ 実行開始
15:56:31 情報 1番目のいまにゅさん
15:56:31 情報 2番目のさとうさん
15:56:31 情報 3番目のすずきさん
15:56:32 お知らせ 実行完了
↑の処理をアロー関数で書いたもの
function myMethod() {
const usernames =['いまにゅ','さとう', 'すずき'];
usernames.forEach((username, index) => {
Logger.log(index+1+'番目の'+username+'さん');
});
}
文字列の中に変数を埋め込みたい場合、↓のような書き方をよく用いる
function myMethod() {
const usernames =['いまにゅ','さとう', 'すずき'];
usernames.forEach((username, index) => {
Logger.log(`${index+1}番目の${username}さん`);
// Logger.log(index+1+'番目の'+username+'さん');
});
}
【実行ログ】
16:02:18 お知らせ 実行開始
16:02:18 情報 1番目のいまにゅさん
16:02:18 情報 2番目のさとうさん
16:02:18 情報 3番目のすずきさん
16:02:18 お知らせ 実行完了
「.push」で配列に値を追加することができる
function myMethod() {
const usernames =['いまにゅ','さとう', 'すずき'];
usernames.push('たかはし');
usernames.forEach((username, index) => {
Logger.log(`${index+1}番目の${username}さん`);
});
}
【実行ログ】
16:03:58 お知らせ 実行開始
16:03:58 情報 1番目のいまにゅさん
16:03:58 情報 2番目のさとうさん
16:03:58 情報 3番目のすずきさん
16:03:58 情報 4番目のたかはしさん
16:03:59 お知らせ 実行完了
組み込みオブジェクト
- 標準で組み込まれている便利な機能、便利なオブジェクト
- Math:数学でよく用いる定数や関数を標準で搭載している
↓Math.PI(円周率)
function myFunction() {
Logger.log(Math.PI);
}
【実行ログ】
16:15:38 お知らせ 実行開始
16:15:38 情報 3.141592653589793
16:15:38 お知らせ 実行完了
↓Math.abs(絶対値)
function myFunction() {
Logger.log(Math.abs(-100));
}
実行ログ
16:17:43 お知らせ 実行開始
16:17:43 情報 100.0
16:17:43 お知らせ 実行完了
↓Math.max(一番大きい値を取ってくる)
function myFunction() {
Logger.log(Math.max(100, 20, 3));
}
実行ログ
16:19:10 お知らせ 実行開始
16:19:10 情報 100.0
16:19:11 お知らせ 実行完了