ミネムラ珈琲ブログ

AI画像Tシャツ屋/ITラノベ著者/さすらいのコーヒー屋/WEBサービス開発チームマネージャーの日記

関数とGASを使い分けてスプレッドシートでシステムを作る

昨日、株式会社はてなの京都オフィスで開催されたKyoto Tech Talk #4でちょっとしたトークをした。

hatena.connpass.com

タイトル「(新サービス|カクヨムネクスト)(オープン)?を支える スプレッドシート(芸|技術)」は、正直なところ決めるのがめんどくさくなったので、解釈の幅をもたせることで解決した。正規表現での発話を流行らせたい。

kakuyomu.jp

オフライン登壇だったので、だいぶ実地の言葉で補足をした、つまりスライドだけ読んでもだいぶ端折られてる。スライドもこの記事の最後で公開はしておくが、テキストで補足をする。

新サービス立ち上げ時の運用機能は、作り込みすぎないではじめられるスプレッドシートが使える

ぼくもそうだが、Excelスプレッドシートはノンエンジニアでもだいたい使うことができる。新サービス立ち上げのような局面では、できるだけユーザー向けの本質的な機能以外に使う工数は節約したい。そんなときに、ノンエンジニアでもさっと作れる手段で代替するのは悪くない選択になる。

単に工数の節約ではなく、もっとも大きい利点は、運用者と近い人間が直接システムを作れること。エンジニアが管理画面を作り込む場合、どうしても運用者→PdM→エンジニア、のような2ホップが発生する。これはエンジニアが運用者に直接ヒアリングすれば良いというほど単純な話ではない。日々やりとりしている距離が近いほうが、どのぐらいのクオリティを求めているのか、何が大事なのか、そういう機微がつかみやすいということになる。場合によってはPdM本人が運用者であるケースもあったりして、この場合は本人なのだから、自分のことは自分が一番よくわかっている。

GASと関数をハイブリッドに使う

Excel/スプレッドシート職人と一口に言っても、関数派とGAS派に大きく分かれるものではないかと思っている。別にいがみあっているわけではないが、なにか課題があったときにまずどっちを起点に解消しようかというのは分かれるのではないかと思う。

ちなみにぼくはゴリゴリの関数派だ、ということはまぁぼくの本を読んだことがある人はよくご存知だと思う。

が、今回はハイブリッドに使い分けることでうまいことやれたんじゃないかと思っている。その使い分けのポイントを書く。

即時反映したくないものはGASを使う

関数の最大の制約は、常に計算結果が即時反映されることだと思う。それは即時の反映を信頼できるという意味でもあるし、反映してほしくないタイミングをコントロールできないという意味でもある。

今回に関しては、データの更新者と運用者が別で、運用者の操作中にデータの更新が行われてしまうと厳し目の事故が発生する性質があったので、運用者の任意のタイミングでデータ更新をコントロールできるように、その部分をGASでカバーすることにした。

関数でできることは関数でやる

※関数派の意見です

GASはほとんどなんでも書けばできるのだが、それを書くのがまぁまぁめんどくさいという問題を抱えている。 これはぼくがGASを日頃そんなに書かないというだけではなくて、関数でやるのに比べるとどうやっても時間がかかるし記述量も増えるということがある。

単に処理を記述するのが大変なだけではない。複雑な処理を書けば書くほど、実行時間もどんどん伸びてくる。実行時間が伸びると、「これめちゃくちゃ待つんですけど」とか「タイムアウトしました」 とか「動いてません」みたいなことになり、そうなると処理速度の改善のための工夫をしないといけなくなったり、そうかと思えばその速度改善の結果でてきたバグを直すのに手間取ったり、まともに動かすためにかかる時間が無制限に取られていく。

ついでにいうと、スプレッドシートにおいてはGASよりも関数のほうが保守性が高い。スプレッドシートで参照している行や列は、列の追加等で場所が動いても、追従して書き換わってそのまま動いてくれる。立ち上げ当初の運用なんてのは始めてみたら「あのデータも見たいので追加しよう」なんてのは日常茶飯事。そのたびにGASでちまちまと行列指定の変数を修正するのは非常にめんどくさい。

そういうわけで、関数でできることは関数でやったほうがいい。

結果として、めちゃくちゃシンプルで短いGASができる

そうやって責務分割すると、GASでやることは非常にシンプルになる。今回で言えば、更新データの反映と、チェック結果の反映という2つの処理プラスアルファをGASでやっているのだが、やっていることが非常にシンプルになったので、GASファイルはコメント込みでも100行にも満たないものになった。

なんならこのぐらいシンプルだととてもうれしいことに、ChatGPTに内容を指示して書かせれば、ほとんどそのまま動く。複雑でない分そのチェックもしやすい。結果的にフィードバックからの調整含めても4時間もかからないぐらいでシステムが出来上がり、いまも元気に動かせている。

ARRAYFORMULAはメチャクチャ便利

これは登壇の中で時間をとって、スライドから離れてライブで実践をやったりしていた。

スプレッドシートでシステムを作るうえで、ARRAYFORMULAは重要な役割を果たす。

だいたいありがちなスプレッドシートを使ったシステムとして、データを貼り付けて、関数でそこに情報を付加、それらをまとめて集計したりフィルタみたいなものが多いんだけど、ARRAYFORMULAを使わないと、関数がデータの最下部まで及んでいなくて、処理に抜けが発生みたいなことが非常によくある。

ARRAYFORMULAをうまくつかっておけば、「関数を下までコピペしましょう」みたいな手順もなくなるし、それを忘れて発生する事故もなくなる。

カクヨムネクスト、4/17まで98円キャンペーン中です。

kakuyomu.jp