Google Apps Script(GAS)をより活用するための Tips

こんにちは、ウィルゲート開発グループの岡田/おかしょい(@okashoi)です。

今から 1 年以上前の話ですが、新規事業に関する検証やプロトタイプの開発を行っていました。 本記事では、その際に素早い仮説検証サイクルを実現するために活用していた Google Apps Script(GAS)について解説します。

Google Apps Script の概要

Google Apps Script(以下、GAS) は Google が提供するローコードプラットフォームで、Web ブラウザ上でスクリプトの記述および実行ができます。 V8 ランタイムをサポートしており、普段の開発で JavaScript を書くのとほぼ同じ感覚でプログラミングできます。

workspace.google.co.jp

いくつかの制限事項*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.openByIdSpreadSheeApp.openByUrl を用いて対象のスプレッドシートを明示的に指定して取得し、同様の処理を書けば OK です。

GAS のコードをローカルに pull & ローカルから push する

基本的には GAS のコードはブラウザからアクセスできるオンラインエディタ上で書くことになります。

ですが、clasp というツールを使うことで GAS のコードを JavaScript ファイルとしてローカルに pull & ローカルから push できるようになります。

github.com

ローカルにコードを引っ張って来れるということは、

  • コードを Git で管理できる
  • 任意のエディタ・IDE でコーディングができる
  • Linter やテストコードフレームワークが使える
  • TypeScript でもコーディングができる*4

ということであり、開発効率を上げたり、チームでの開発がしやすくなるというメリットが得られます。

まとめ

GAS はスプレッドシートなどと組み合わせることで、社内のちょっとした業務改善や、プロトタイピングの作成に使えます。

機能を調べてみると、意外と幅広いことができるのでケースバイケースで「GAS で小さく検証を回してみる」というのを試してみてください!

なお、2022 年のウィルゲートアドベントカレンダー内でも、GAS の使用例について記事を書いている(個人ブログ)のであわせて読んでみてください。

blog.okashoi.net

blog.okashoi.net

*1:1 回のスクリプト実行は最大 6 分まで、など

*2:もしかしたら、そうなった時点で GAS から離脱すべきタイミングかもしれませんが。

*3:初回実行時は権限リクエストの画面が表示されるので、操作を許可してください。

*4:ただし癖があるので固有のノウハウは多少必要になります。本記事ではそのあたりの説明は割愛します。