初めに
ライブラリ等でメリットデメリットが大きく変わってくるため、
大雑把になっています
GoogleAppsScriptを書く手段
- 公式サイトで作成する
- 公式エディタ(https://script.google.com)でJavaScriptで記載する
- ローカルで作成する(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でも使えるようにされていれば可能
- 例: Cheerio
- ただし、ライブラリでGASでも使えるようにされていれば可能
- 複数人での開発が困難
- 2人以上が編集する場合、あるいは一人でも複数のブラウザで開いていると、
一人がアップデートしても、もう一人はリアルタイムで反映されず再度読み込む必要がある。
また、更新せずに、古い状態で実行すると古いもので上書きされてしまう
- 2人以上が編集する場合、あるいは一人でも複数のブラウザで開いていると、
ローカルでJavaScriptで記載し、そのままclaspでpushする
メリット
- Node.jsのパッケージを使うことができる(requireとかimportは使えない(後述するwebpack等でビルドすれば可能))
- ここでのパッケージが使えるは、あくまでコードフォーマッターやhuskyなどといった、コードに直接依存しない範囲の話
- @types/google-apps-scriptをインストールしておけば補完は公式と同様に使える
- 任意のコードフォーマッターを使うことができる(ESLint/Prettier...etc)
- CI/CDを使ってpushすることができる
- CI/CDやGitHubを使うことで複数人で開発することが可能
- ローカルで作成したデータをコンパイルされずにそのままpushできる
デメリット
- 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.4package.jsonは
typescript@4.7.4
,@google/clasp@2.4.1
になっていたが、
clasp pushではTypeScript 4.7.3
でコンパイルされていたVSCodeのTypeScriptのバージョンか何かに依存している???
確認方法がわからないので誰か教えてください
-
デメリット
-
import,export,requireが使えない(後述するコンパイルすれば可能)
-
引数のヘルプがObjectの場合,正しく出力されない(ただしコンパイルされたスクリプトに手動で記載することはないと思うのでほぼデメリットではない)
ローカルでJavaScript/TypeScriptで記載し、webpackでビルドしてからpushする
メリット
- import,export,requireが使えるため、さまざまなライブラリを使用することができるようになる
-
gas-webpack-plugin - npmを使えば
global.functionName
で表示する関数を選べるため、内部で使用する関数は非表示にすることができる
デメリット
- 引数はTypeScriptをそのままclasp pushでコンパイルされたものと同様
まとめ
Node.jsが使えるのであればローカルで使う方が無難、
複数人で開発する場合は尚のこと。
npmとかが使えないなら、公式のブラウザエディタを使った方が良い。
ローカルで開発する場合、
JavaScriptを使うか、TypeScriptを使うかは、好みにもよるが、
関数の引数をObjectにするとヘルプの表示はイマイチなので、
普通の引数として使用するならTypeScriptで問題ない。
どうしてもObjectで使用したい場合は、
JavaScriptで書いた方がまだわかりやすい(functionName(_a: any)
となると何もわからない)
個人的にはTypeScriptで作成し、ライブラリとしても使えるようになって欲しいが、
ReactでObjectの引数に慣れすぎたので、
通常の引数で作成することを心がけようと思います。
(通常の引数って言い方で良いのだろうか)