4
1

More than 1 year has passed since last update.

GoogleAppsScriptは何で書くべきか(公式orローカル / JSorTS )

Last updated at Posted at 2022-08-25

初めに

ライブラリ等でメリットデメリットが大きく変わってくるため、
大雑把になっています

GoogleAppsScriptを書く手段

  • 公式サイトで作成する
  • ローカルで作成する(EditorはVSCode)
    • JavaScriptで記載し、そのままclaspでpushする
    • TypeScriptで記載し、そのままclaspでpushする(自動でトランスパイルされる)
    • JavaScript/TypeScriptで記載し、webpack等を使ってビルドして、claspでpushする

それぞれのメリット・デメリット

公式エディタを使って、JavaScriptを使う

メリット

  • ライブラリ,サービスの使用やデプロイを、GUIで書ける
  • JSDocで型を記載できる(paramとreturnしか使えない)
  • 一応Gitが使える(拡張機能をインストールする必要があるGoogle Apps Script GitHub アシスタント)

デメリット

  • 型チェックは行われない
  • フォーマットは公式エディタ依存(多分任意の設定はできない?)
  • 非推奨のメソッドが表示されない(リファレンスには書いてあるがエディタだけでは不明)
  • Node.jsのパッケージは使えない
    • ただし、ライブラリでGASでも使えるようにされていれば可能
  • 複数人での開発が困難
    • 2人以上が編集する場合、あるいは一人でも複数のブラウザで開いていると、
      一人がアップデートしても、もう一人はリアルタイムで反映されず再度読み込む必要がある。
      また、更新せずに、古い状態で実行すると古いもので上書きされてしまう

ローカルでJavaScriptで記載し、そのままclaspでpushする

メリット

  • Node.jsのパッケージを使うことができる(requireとかimportは使えない(後述するwebpack等でビルドすれば可能))
    • ここでのパッケージが使えるは、あくまでコードフォーマッターやhuskyなどといった、コードに直接依存しない範囲の話
  • @types/google-apps-scriptをインストールしておけば補完は公式と同様に使える
  • 任意のコードフォーマッターを使うことができる(ESLint/Prettier...etc)
  • CI/CDを使ってpushすることができる
  • CI/CDやGitHubを使うことで複数人で開発することが可能
  • ローカルで作成したデータをコンパイルされずにそのままpushできる
    • 引数のヘルプがObjectでも正しく表示される(TypeScriptでビルドされるとObjectは正しく表示されない)
      スクリーンショット 2022-08-26 0.55.48.png

    • ただし、ライブラリとしてインポートすると引数をオブジェクトにするとわからなくなる

      普通の引数にした場合
      スクリーンショット 2022-08-26 0.56.36.png

      Objectの引数にした場合
      スクリーンショット 2022-08-26 0.57.53.png

デメリット

  • import,export,requireが使えない(後述するコンパイルするライブラリを使えば可能)

ローカルでTypeScriptで記載し、そのままclaspでpushする

メリット

  • TypeScriptで書ける!(型補完)
  • claspでpushしてもトランスパイルされる
    • ただしTypeScriptのバージョンは公式に依存する
      2022/08/25時点でのtypescriptのサポートは3.8.2 clasp/typescript.md at master · google/clasp
      typescriptのlatestは4.7.4

      package.jsonはtypescript@4.7.4,@google/clasp@2.4.1になっていたが、
      clasp pushではTypeScript 4.7.3でコンパイルされていた

      VSCodeのTypeScriptのバージョンか何かに依存している???
      確認方法がわからないので誰か教えてください

デメリット

  • import,export,requireが使えない(後述するコンパイルすれば可能)

  • 引数のヘルプがObjectの場合,正しく出力されない(ただしコンパイルされたスクリプトに手動で記載することはないと思うのでほぼデメリットではない)

    JavaScriptでそのまま書いた場合
    スクリーンショット 2022-08-26 0.58.47.png

    TypeScriptでコンパイルされた場合(引数object)
    スクリーンショット 2022-08-26 1.00.09.png

    普通の引数にした場合は表示される
    スクリーンショット 2022-08-26 1.01.00.png

ローカルでJavaScript/TypeScriptで記載し、webpackでビルドしてからpushする

メリット

  • import,export,requireが使えるため、さまざまなライブラリを使用することができるようになる
  • gas-webpack-plugin - npmを使えばglobal.functionNameで表示する関数を選べるため、内部で使用する関数は非表示にすることができる

デメリット

  • 引数はTypeScriptをそのままclasp pushでコンパイルされたものと同様
    • ただし、書き方によっては引数が正しく機能しないので注意する必要がある
      TypeScript
      スクリーンショット 2022-08-27 16.18.37.png
      gas-webpack-pluginでビルドしたファイル
      スクリーンショット 2022-08-27 16.20.10.png

      ただimportしてきたものをglobalに入れただけでは、
      引数はないとみなされてしまうため(importFormatLogging)、
      globalにはちゃんと引数をいれた関数とした方がいい

まとめ

Node.jsが使えるのであればローカルで使う方が無難、
複数人で開発する場合は尚のこと。
npmとかが使えないなら、公式のブラウザエディタを使った方が良い。

ローカルで開発する場合、
JavaScriptを使うか、TypeScriptを使うかは、好みにもよるが、
関数の引数をObjectにするとヘルプの表示はイマイチなので、
普通の引数として使用するならTypeScriptで問題ない。

どうしてもObjectで使用したい場合は、
JavaScriptで書いた方がまだわかりやすい(functionName(_a: any)となると何もわからない)

個人的にはTypeScriptで作成し、ライブラリとしても使えるようになって欲しいが、
ReactでObjectの引数に慣れすぎたので、
通常の引数で作成することを心がけようと思います。
(通常の引数って言い方で良いのだろうか)

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1