こんにちは、ウィルゲート開発グループの岡田/おかしょい(@okashoi)です。
今から 1 年以上前の話ですが、新規事業に関する検証やプロトタイプの開発を行っていました。 本記事では、その際に素早い仮説検証サイクルを実現するために活用していた Google Apps Script(GAS)について解説します。
Google Apps Script の概要
Google Apps Script(以下、GAS) は Google が提供するローコードプラットフォームで、Web ブラウザ上でスクリプトの記述および実行ができます。 V8 ランタイムをサポートしており、普段の開発で JavaScript を書くのとほぼ同じ感覚でプログラミングできます。
いくつかの制限事項*1はあるものの
- お手軽な JavaScript 実行環境
- Web ブラウザと Google アカウントさえあれば OK
- 各種 Google サービスとの API 連携が簡単
- カレンダー、スプレッドシート、Google Analytics 等
- 認証、認可の仕組みを実装しなくてよい
- 所定のトリガーに基づいて関数を実行できる
- 時間ベース、Google カレンダーベース、Google フォーム送信時等
といった機能や利点を備えており、検証用途などの規模が小さいものや寿命が短いものであれば充分使用に耐えうる実行環境です。
エンジニアでない人たちにとっても親しみ深いデータベース(広義)である Google スプレッドシートとの組み合わせが強力で、堅牢な仕組みを必要としないコンセプト検証段階ではサーバコスト等をかけずに目的を実現できる GAS はとても重宝しました。
また、下手にシステム化されていないので「プロトタイプのつもりで雑に開発したものが、そのままうっかり本番運用されてしまう」ということも起こりづらい、というのも利点かもしれません。
GAS をより活用するための Tips
そして、GAS のポテンシャルは単に処理(データの取得、計算、更新等)を実行するだけではありません。
ここからは「GAS って実はこんなこともできるよ!」という Tips を 3 つ紹介します。
Web ページの表示
GAS をウェブアプリとしてデプロイすることで、Web ページを表示することができます。
まず、以下のコードのように doGet
という名前で HtmlOutput
オブジェクトを返す関数を定義します。
const doGet = () => HtmlService.createHtmlOutput('<html><body>Hello World!</body></html>')
続いて画面右上の「デプロイ」から「新しいデプロイ」を選択し、デプロイタイプとして「ウェブアプリ」を選択したうえでデプロイします。
発行された URL にブラウザからアクセスすると定義した HTML に基づく Web ページを表示できます。
この Web ページについては HtmlTemplate
オブジェクトを介してテンプレートエンジンを利用できます。
また、GAS プロジェクト側に定義した関数をブラウザ上の JavaScript から実行することも可能で、お手軽 RPC(Remote Procedure Call)としても活用できます。
これらを組み合わせることで Web UI 上からユーザ操作を受け付け、任意の処理を実行するアプリケーションを作ることさえもできます*2。
スプレッドシートの画面にメニューを追加する
スプレッドシートのデータ更新処理を GAS 経由で行うといったケースはよくあるでしょう。 その処理を起動するためのメニューをスプレッドシートに追加できます。
以下は既存のスプレッドシートに新規の GAS のプロジェクトを作成、バインドするパターンの手順を説明します。
まずは対象のスプレッドシートのメニュー「拡張機能」から「AppScript」を選択してスプレッドシートにバインドされた GAS プロジェクトを作成します。
GAS プロジェクトが作成されたら実行したいロジックのコードを書きます。
ここでは例として先頭のシートの A1 セルの内容を「finished」という文字列に書き換える処理を考えます。 コードとしては次のようになります(本記事ではこの処理の詳細の解説はしません)。
const execute = () => { SpreadsheetApp.getActiveSpreadsheet() .getSheets()[0] .getRange(1, 1) .setValue('finished') }
スプレッドシートの画面上にこの処理を実行できるメニューをに追加するには onOpen
という名前の関数を定義し、その中で Spreadsheet
クラスの addMenu
メソッド)を呼び出します。
const onOpen = () => { SpreadsheetApp.getActiveSpreadsheet() .addMenu('カスタムメニュー', [{name: '実行', functionName: 'execute'}]) }
第一引数はメニューの名前、第二引数の配列の要素として与えるオブジェクトの内訳は以下の通りです。
name
:メニュー内の項目名functionName
:実行する(GAS プロジェクト上で定義した)関数名
これを保存したのちにスプレッドシートのページを再読み込みすると、メニューバーに「カスタムメニュー」の項目が追加され、さらにその中に「実行」の項目が存在しています。
この「実行」の項目をクリックすると*3 GAS プロジェクト上で定義した execute
関数が実行され、A1 セルの内容が「finished」に書き換わります。
なお、上述の例とは異なり
- 既存の GAS プロジェクトを後からスプレッドシートに紐づけたい
- 複数のスプレッドシートにまたがって処理を実行したい
といった場合にはSpreadsheetApp.getActiveSpreadsheet()
の代わりに SpreadSheetApp.openById
や SpreadSheeApp.openByUrl
を用いて対象のスプレッドシートを明示的に指定して取得し、同様の処理を書けば OK です。
GAS のコードをローカルに pull & ローカルから push する
基本的には GAS のコードはブラウザからアクセスできるオンラインエディタ上で書くことになります。
ですが、clasp というツールを使うことで GAS のコードを JavaScript ファイルとしてローカルに pull & ローカルから push できるようになります。
ローカルにコードを引っ張って来れるということは、
- コードを Git で管理できる
- 任意のエディタ・IDE でコーディングができる
- Linter やテストコードフレームワークが使える
- TypeScript でもコーディングができる*4
- @types/google-apps-script も提供されている
ということであり、開発効率を上げたり、チームでの開発がしやすくなるというメリットが得られます。
まとめ
GAS はスプレッドシートなどと組み合わせることで、社内のちょっとした業務改善や、プロトタイピングの作成に使えます。
機能を調べてみると、意外と幅広いことができるのでケースバイケースで「GAS で小さく検証を回してみる」というのを試してみてください!
なお、2022 年のウィルゲートアドベントカレンダー内でも、GAS の使用例について記事を書いている(個人ブログ)のであわせて読んでみてください。