Closed2

GAS基本(学習備忘録)

HubHub
  • GAS公式ドキュメント

    • 「GAS リファレンス」で検索すると出てくるはず
  • ショートカットキー

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

  • 関数名を決める際は、動詞+名詞で関数名を決めると、どのような関数かイメージしやすい

    • getEventsとか
  • ファイル名は、関数名と同じ名前を付けると、どのファイルにどの関数が記載されているかわかりやすい

HubHub

基本説明

大きく分けて、GASは以下の二種類に分かれる

  • スタンドアローンスクリプト
    • コンテナ(googleサービス)に接続しないスクリプト
  • コンテナバインド
    • コンテナ(スプレッドシートとか)に結合したスクリプト

画面説明

  • ファイルというのは、プロジェクトに紐づいているファイルのこと
    • GASのファイルは「.gs」になっている
  • オレンジ色の●は、未保存のコードがある状態を指す

コーディング関連

基本的なところ

  • javascriptは、文の終わりに「;」をつける(つけなくても基本的に動くが、動かないことがあるらしい)

変数

  • const(定数のように使う)

    • 基本的に値の上書きができない
    • 上書きされるとどんな値になっているか分かりづらくなるので、なるべく再代入しないconstを使う
  • let(変数として使う)

    • 値の上書きができる
  • 変数にvarは使わない

    ※基本的にconstを使う(上書きされるとどんな値になっているか分かりづらくなるので、なるべく再代入しないconstを使う)

  • 変数で文字列を代入する場合は、は’か”で囲む(どっちを使うかは、チームによって変わる)

  • 定義した変数が使われていない時は、グレー色になる

  • 変数・定数を定義する際の注意

    • 大文字と小文字は区別される
    • 数字、一部を除いた記号は、先頭の文字に使用不可
    • 予約後(あらかじめ定義されている単語)は使用不可
      • javascriptの予約後が使えない
  • 変数・定数を命名する際のコツ

    • 英単語を使用する。日本語は使用しない
    • 中身・役割がわかるような意味のある名前をつける
    • チームの場合は、変数名のルールを決めておく
      • 先頭文字だけ大文字にするとか
      • GAS,JavaScriptの推奨ルール
        • 変数名・関数名:キャメル記法にする
          • キャメル記法(キャメル=ラクダ):単語を連結する場合は2単語目以降の頭文字を大文字にする
            • sheetName
            • userName
            • emailList
            • user
        • 定数名:スネーク記法にする
          • スネーク記法:単語をアンダースコア(_)で連結してすべて大文字にする
            • 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':'いまにゅ'};
    • 真偽型(boolean):真偽を判定する
      • true/false
        typeofでデータ型を確かめられる

配列(リスト)

  • 複数の値をまとめて扱いたい場合に便利なデータ型

  • 例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	お知らせ	実行完了
このスクラップは2023/11/30にクローズされました