AQ Tech Blog

プログラミングど素人がChatGPTにGoogle App Scriptを書いてもらう

作成者: yuki.sato|2023年12月29日

本記事はAsiaQuest Advent Calendarの22日目です。

私の趣味のコミュニティは毎回出欠をGoogleフォームで確認するのですが、100人規模の名簿から手動で作成しているという話を小耳に挟みました。
運営の人たちがかなり大変そうだったので、頑張ってなんとかしてみようとした思いつきの見切り発車がこの記事になります。

自己紹介

アジアクエストで、インフラをメインに開発している佐藤 侑紀です。
昨今、認知が広がり続けるChatGPTですが、デスクトップアプリがあることはご存知でしょうか。
使い勝手が非常に良く、リリース当初から個人的にChatGPTにお世話になっている身として、使ってみた所感と私個人の使い方を記載させていただければと思います。

想定読者

  • ChatGPTに興味がある人
  • 生成AIでコードを書いてみたい人

結局何がやりたいか

まずは状況を以下に整理します。

  1. 参加者(100人前後)がMailなどでエントリーを行う
  2. 受付担当者からExcelベースのエントリーリストがで運営メンバに共有される
  3. Googleフォームを作成しプルダウンの選択肢を手動(コピペ)で作成する
  4. 全員に公開し当日の参加者を把握

どうみても3が引っかかりますよね、、、
今ここでやりたいこととしては、
・Googleフォームを自動生成
これ一択です。

GoogleのサービスだからGoogle App Script(以下:GAS)を使えばなんとかなる気がするという安易な考えでネット検索することしばし。
確かにGASを使った自動生成に関する記事はあるのですが、当方、初プログラミングでして解読できなければカスタムする箇所もわからない。
最近ChatGPTも使ってみたかったことですし、ちょうどいいので対話しながら実装にこぎつけてみようとなったわけです。

とりあえず聞いてみる

何はともあれChatGPTに実現できるかどうか聞いてみないことには始まりません。

Q,
Excelファイルを選択しGoogleフォームを自動生成する方法を教えてください。
また、そのコードの使い方を教えてください。

A,
はい、GASを使用して、Google Drive上に配置されたExcelファイルを選択することで自動的にGoogleフォームを生成し、公開時間を指定する機能を実装することは可能です。

そこそこ長い回答が帰ってきたので一部のみですが、注釈つきで用意してくれるということに衝撃です。
ChatGPT側は回答する際に文字制限があるようで途中でコードが途切れるのですが「続きをお願いします」の一言で問題なく進めます。

使えるようにしてみる

作ってもらったコードをChatGPTに解説してもらいながらGASのエディタにコピペしながら考えることしばし。
GASでファイルを指定するときにオブジェクトIDを利用するならExcelよりもスプレッドシートのほうが後々楽になる!っと。
生成されたコードからちょっと路線変更してスプレッドシートを作成、必要な部分を補完しながら進めていきます。
オブジェクトIDも間違ってないしこれで動く!と思いながら意気揚々と実行ボタンをクリックするとエラーが、、、
一発で動けばどんなエンジニアも苦労しないなと思いつつChatGPT先生にエラーを報告します。

なるほど古い情報を元にコードを書いたのかと納得しつつ、どうしてこうなるのか気になったのでOpenAIのFAQを再確認

2021年以降の世界や出来事に関する知識は限られており、時折、有害な指示や偏った内容を出すことがあります。(DeepL翻訳)
What is ChatGPT? - OpenAI

最新情報に関しては不安が残るというのはこのことか!

打てば響くように回答がきますが、トライアンドエラーの繰り返しだなと腰を据えて対応することにします。
どんなコードもそうですが、一行目から順番に処理してエラーのたびにストップするので繰り返すこと10数回。
大体2時間ほどでGoogle Driveのrootディレクトリに生成されるようになりまして、とりあえずの目標は達成です。

追加の要望①

最初の狙い通り自動で作成されることはすごくありがたいのですが、rootディレクトリに作成された物を毎回移動させるのは非常にめんどくさい。
次へ、次へと欲張ってしまうのが人の性ですね。
Google Drive内に「checkin」というフォルダを作成したので、そこに作成物が置かれるようにしましょう。
早速ChatGPT先生にお願いです。

さて、ここで問題発生です。
これまでの会話を学習し回答精度を向上させる性質が悪い方に出たようで、エラーが出る作成途中のコードに追加機能が実装されてしまいました。
当然「このエラーさっきも見たんだけど、、、」という状態になります。
知らないエラーが出たかと思えばPDF化させるようなオーダーしてないコマンドも一緒に入っている、、、
先読みしすぎたのか自分のお願いの仕方が悪いのか悩んだ末に解決策を発見しました。
ChatGPTが回答する際に文字数制限があるのは先に述べた通りですが、こちらが入力する際の文字数制限は多分なさそう。
改変して欲しいコードごと貼り付けるという力技で解決です。

要望を記載してコードの全文を貼り付けることで必要な箇所だけに手を加えてくれることが判明。狙ったところだけを編集してくれます。

ここまでくると私も学びまして、エラー行が書かれただけのエラー文章を貼り付けていては非効率的だと今更学習。
問題のある部分を含めて丸ごと教えてあげることで解決が格段に早くなることが判明しました。

うまくいけばいいなと思いつつ先ほどと同じようにトライアンドエラーを続けること数回…

これで2つ目の目標も達成!と思い込んでおりました。

追加の要望②

何回実行しても同じフォルダに格納される!と思い込んで複数回実行するとあらびっくり、実行するたびに同名のフォルダが出来上がる、、、
しかもフォームと回答スプレッドシートそれぞれでフォルダがあるせいで視認性が非常に悪い状況です。
同じ階層に同じ名前のフォルダを作成することはできない認識だったのですがしれっと増えています。
裏側は人間がつけた名前じゃなくてオブジェクトIDで管理されているから名前は関係ないのかと思いつつも不思議な感覚になりますね。

さて、ここから2点改修です。

  1. 実行後に作成されるフォルダは1つにし、フォームと回答スプレッドシートを格納する
  2. 作成されるフォルダ名はyyyy/mm/ddとなるようにする

小規模のコードとはいえ、度重なる改修、追加実装なんて自分が担当エンジニアだったら怒り爆発してそうな感じですが、
ChatGPT先生には顧客の要望に最大限応えてもらおうと思います。

学習効果もあり今回はエラーなく実装完了。狙った通りの動きをしてくれるようになりました。

完成

最終的に出来上がった構成はこんな感じです。
作業開始からおおよそ6時間、ノンストップ深夜テンションで作っていたためこの辺りで一旦ストップです。
後から見返しやすいように簡単に設計内容を記載したドキュメントとパラメータシートもどきを作って作業終了となりました。

実際に使ってみて

ChatGPTとGASを利用してみた率直な感想としては、「コード書ける人は自分で書いたほうが絶対に早い」というのが一番です。
一番難しいのはやりたいことを言語化してChatGPTに正しく認識させることです。
学習のさせ方に対するハードルはありますが、自分自身の聞き方、使い方によっては非常に強力なツールとなることは間違いないです。
しかし、一度すれ違うといらないコマンドが勝手に追加されたり、全然違うフォルダを作ったりと、「違う!そうじゃない!」と言いたくなるようなことになるので要注意ですね。
今回は見切り発車のせいもあってだいぶ遠回りをした感じが強いですが、きちんと要件定義、設計をすることで業務利用に十分使える性能かと思います。

ChatGPTを使って誰が見ても綺麗で読みやすいコードを目指してこれからも精進していきます。