みなさん、Google Apps Script(GAS) は使っていますか?
私は、数年前に GAS を使ってから今まで触っておらず。Google Docs などでちょっとしたスクリクプトを、変な言語でかけるツールという印象を引きずっていました。
しかし、最近 GAS を触る機会があり、その非常に進化した環境に驚きました。
G Suite Developer Hub
昔の印象では、GAS はいずれ使われなくなるツールだと思っていました。
しかしそんなことは全く無く、最近は G Suite Developer Hub というものが作られており、GAS での自動化を推進しています。
機能も非常に充実しており、Google のほとんどのサービスを、簡単なスクリプトで操作することができます。もちろん REST API や SDK などで操作できる部分も多いですが、簡単さで GAS に勝るものはないと言う印象です。
clasp
Google Apps Script の特徴として、JavaScript のような謎の言語がありました。非技術者がちょっとしたスクリプトを書くには良いかもしれませんが、普段から他の言語を使っているエンジニア、とくに JavaScript に慣れているエンジニアにとっては、非常につらい環境でした。
clasp は、JavaScript を GAS にトランスパイルしてくれるツールです。これにより、JavaScript 風言語ではなく、本物の JavaScript を使用して GAS がかけるようになります。また、clasp は TypeScript にも対応しています。
clasp ハマりポイント
clasp はあくまで トランスパイラ であり、import/export などを使用するためには webpack 等のツールが必要です。また、TypeScript サポートについても、基本的にはトランスパイルのみであり、型定義が提供等はありません。
また、トランスパイルについても、最低限のことしかやってくれません。トランスパイルが通っても動作しないコードが出力されることがありますし、型チェックが通らないコードもトランスパイルが通ります(これによって、SpreadsheetApp 等の型定義がなくてもトランスパイルが通るというメリットもあります。
GAS でもテストがしたい
clasp はトランスパイラなので、テストを作るにも工夫が必要です。
今回は、テストのためのランタイムとして Deno を使用します。Deno とは、セキュアな TypeScript ランタイムです。
なぜ Deno なのか
GAS に最低限必要なのは clasp のみであり、clasp のみを使用する場合には npm のパッケージを作る必要はありません。しかし、テストを行うためには npm でテスト環境を作る必要が発生してしまいます。
もちろん、npm を使用してテスト環境を作っても良いのですが、面倒に感じたため、前々から興味のあった Deno を使用することにしました。
Deno を導入して TypeScript を直接動かすことによって、clasp と deno のみのシンプルな開発環境にできるというのは、大きなメリットだと思います。
Deno は安定版ではないため、本番で使用するべきではありませんが、今回はローカルでのテストのための簡単な TypeScript 実行環境としてのみに限定して導入しています。
deno でのテスト
deno には標準のテストライブラリ 'https://deno.land/std/testing/mod.ts' が用意されており、以下のように簡単にテストが書けます。
import { test, runIfMain } from 'https://deno.land/std/testing/mod.ts'
import { assertEquals } from 'https://deno.land/std/testing/asserts.ts'
test('test', () => {
assertEquals(1, 1)
})
スタブをつくる
clasp では型定義がないままトランスパイルしていましたが、deno ではエラーが出てしまいます。そのため、何らかの方法で型定義を作らなければなりません。
@types/google-apps-script を使用したところ、console を上書きしようとしており、deno ではエラーとなってしまいます。
なので一旦、今回は単純に any でスタブすることにしました。
declare var SpreadsheetApp: any;
このように使用する App を any でスタブし、このファイルを必要な部分で import します。
さいごに
TypeScript(clasp + deno) で Google Apps Script のツールを作る方法を簡単に紹介しました。
今回は周辺ツールの紹介であり、実際にどのようなスクリプト書くのかについては触れませんでしたが、それについてはいろいろな他にドキュメントがあるので、それに説明を委ねます。
TypeScript で GAS を書ければ、もっと楽しく、より強力なツールを簡単に作れるようになるはずです。