元建築系エンジニアのBLOG

ゼネコン退職して、クラウドエンジニアやってます。

読んでみた(詳解! Google Apps Script完全入門 [第3版])Part1(JavaScript基本機能)

はじめに

こんにちは、fujiokaです。
ついに始まりましたね、10連休ゴールデンウィーク..!🏖


そんな中でもまだまだコロナ禍の影響もあるので、
ジョギングしたり🏃🏻‍♂️早く寝たりと健康的に過ごしたり、
家でまったり過ごそうと思っています

連休でまとまった時間が取れるので、
昨年に続いてプロジェクトで利用している(※過去ブログ)、
GoogleAppsScript(GAS)を腰を据えてGASを体系的に学習しました😆

これまでは、必要な機能をその都度Webサイトで調べながら作っていましたが、
開発が膨れてきて、
「GAS特有の機能を使ったら、実はもっと効率的に書けるんじゃね?🤔」
と思い、今更ながら、専門書を読んでみたので、まとめてみました。
(まずは各章のポイントをピックアップしていきます)

第0章:前提

普段プロジェクトで使っている略記を用いて、以降をまとめていきます。

    • SS:SpreadSheet
    • GD:GoogleDrive

第1章:GASの注意点

  • GASは、ガスと読む。(ギャスではない)
  • GASは、13のGoogle Appsと連携できる。
    ⇒Advanced Google Serviceを使うと、20以上のサービスと連携できる。
  • ブラウザオブジェクトとDOMオブジェクトは利用できない。
  • GASには、制限&クオータがある。(P23)

第2章:プロジェクトとスクリプト

第3章:(JSの)基本構文

  • 基本構文
    • 変数:let   ⇒V8ランタイムをオンにしていればvarでなくてOK
    • 定数:const
  • 記法
    • キャメル ⇒ メソッド、変数/定数
    • スネイク ⇒  グローバル定数、プロパティのキー名
  • 文字列
    • console.log('this is ${val}')  (Pythonで言うf文字列)
  • 配列
    • ...{list} (i for i in list と同じ)

第4章:(JSの)制御構文

  • 論理演算子
    • ”==”と”===”は異なる。
      • ”==”  :データ型は考慮せずに比較する
        Ex) ”10”==10 ⇒ Trueである
      • ”===”:データ型を含んで比較する
    • AND:&&、 OR:||、 NOT:!
  • 条件分岐(Switch)
    • Switchは、break が無いと、全ケースを通過してしまう

      switch() {
         case "case1" {
           console.log("this is case1");
           break
        } case "case2" {
           console.log("this is case2");
           break      
        } default {
            console.log("this is default")
        }
      }

       

  • ループ文
    • while
    • for (let i = 1; i < 5; i++) {}
    • for (i of list)  :配列に使用(値で回す)
    • for (i in object)  :オブジェクトに使用(キーで回す)
  • ループにラベルを貼って、任意のループをbreakすることができる

第5章:(JSの)関数

  • プライベート関数には、末尾にアンスコを1つ付けるPythonと逆)
    ∵コンソールでのプルダウン関数検索から除外するため
  • GoogleのJSスタイルガイドでは、privateもprotectedも、末尾アンスコらしい。

    w.atwiki.jp

  •  (Pythonと同じではあるが、)
    変数をイコールでコピーした場合には、それぞれ別メモリとして値が管理される。
    (いわゆる値渡し
    一方で、配列/オブジェクトの場合には参照渡しが起きるので、
    値渡しの場合には以下のようなコードが必要。

    let arr2= arr1.concat();

  • JSのドキュメンテーション(コメント)は、以下を参考にすること。

    jsdoc.app

  • アロー関数を利用することで、いちいちfunction 〜〜と書く手間を減らすことができ、コードの軽量化ができる。
    ただメソッドレベルの作成は、リテラル関数かメソッド定義が望ましい。(P.155)
  • グローバルに定義しているものは、ファイル上に集めること。

第6章:(JSの)クラスとオブジェクト

  • JSにおける、プロトタイプ
    • インスタンスで、プロパティは個別にあって良いが、メソッドは1つで十分
      (それぞれに定義する必要はなく、どれか1個あればOK)
    •  
  • クラスは、以下の通り

    class ClassName {
      constructer(param1, param2) {  ⇦
          this.val1 = param1;
          this.val1 = param2;
      }
       someMethod {
           (something is occured);
       }
    }

     

第7章:(JSの)組み込みオブジェクト

  • V8ランタイムに設定しないと利用できないStirngメソッドやArrayメソッドなどが多数ある
    (Ex. StartWith、repeat)
  • Arrayメソッド
    • アクセサメソッド
      • push ⇄ shift:配列の後・前に値を追加
      • slice、splice:インデックスを指定して配列を抽出・置換する

その他

  • GASには以下がある。
    • スクリプト
      ⇒gs、htmlファイル
    • ライブラリ
      ⇒Script IDを指定することで、他のプロジェクトを引用できる?
    • サービス
      Googleに用意されているAPIを利用できる?
  • 改善案
    • ボタン押下ではなく、定期投入に変える?
    • Googleのコード規約に合わせて修正する。
      • プライベートメソッドには、末尾にアンスコを付ける。
    • クラスが利用されていないので、使用する
      • AWSへの送信オブジェクトを、クラス化する
        • 例)生産者の登録オブジェクト
          class RequestObject {
           constructor (tenant_id, tenant_name, detail) {
            this.tenant_id  = tenant_id;
            this.tenant_name  = tenant_name;
            this.detail = detail;
           }
          }
    • ループの基本記法を決める
      • 基本ループ(for i in range(n):)
        • for (let step = 0; step < n; step++) { }
      • whileループ(while i < n:)
        • while (let i < n) { } 
      • 配列ループ(for i in list:)
        • array.forEach( { } )
      • 連想配列ループ(for key, value in dict.items():)
        • 連想配列が明示的にMapの場合、プロトタイプを利用する
          array.forEach(function (value, key) { } )
      • 配列+インデックスループ(for i, val in enumerate(list):)
        ⇒forEachの方が、〜2倍くらい性能が良いので利用すること。
        • array.forEach*1 { }

*1:value, index) { } )

  •  for (const (index, value) of array.entries(