きっかけ
専門学生時代、以下の記事を目にしたのがきっかけでした。
どうやら以下の投稿がきっかけでいろいろなエンジニア達の間で様々なプログラミング言語で湯婆婆を再現するチャレンジが5年以上前に流行していたようです。
当初IT用語辞典未経験で専門学校に進学していた自分には何がなんだかよくわかりませんでしたが(きっかけとなったMalbolgeに至っては今もよくわかっていない)、いずれ自分もこれを作ってみたい!!と考えて2年くらい温めていた末に、ようやく本日初めての自発開発経験としてチャレンジしてみようと思いました。
GASって?
ざっくりいうとGoogle版VBA。
JavaScriptをベースとしているため、JavaScriptを扱ったことがある方なら簡単に扱えるコードです。
といっても、スプレッドシート(Google版ExcelやWord等)からだけではなく、Google Driveから複数のスプレッドシートにアクセスできるGASを作成することも可能。(今回はスプレッドシートから直接立ち上げるため、そのあたりの細かい説明は割愛します)
なお、筆者はGASもこれが初めてです。(なんならJSも未経験)
色々調べつつなんとか形にしたものなので、あたたかい目で見ていただければと思います。
下準備
まずは湯婆婆召喚用のスプレッドシートを用意します。
上の欄にある「拡張機能」をクリックすると拡張機能の一覧が出てくるので、「Add Script」をクリック。
ここがGASを記入する場所みたいです。
ついでにスプレッドシートとGASのファイル名を「湯婆婆」などに変更しました。
せっかくのスプレッドシートなので、どうせなら契約書の書面も再現しちゃいましょう。
ただ、スプレッドシートにおけるセルをまたいだ状態で想定していた通りでの文章入力方法がわからず、直接テキストボックスを挿入したため、少し見栄え悪いのはご了承ください。
「乙」の右の黒枠セル(C14)に名前を入力して、右の「入力完了」ボタンで契約書への名前の記入を完了する想定です。
これで下準備は整いました。
契約書
まずはシートを開くたびに契約書を渡されるようにします。
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
function yubaba_Function() {
let name = sheet.getRange('C14').setValue(''); //初期化
Browser.msgBox('契約書だよ。そこに名前を書きな。');
}
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
このコードはGAS特有のシートを取得するコードです。(この記述がないとシートが取得できないエラーとなります)
このあと別の関数も作成するため、関数の外側に作成しています。
コード自体は至ってシンプルですが、実際にファイルを開くたびにこの契約書渡しを実行させるため「トリガー」を設定します。
トリガーの設定はAdd Scriptの左側にある時計のマークです。
「トリガーを追加」を押して起動時に適用させたい関数を選択、イベントの種類を「起動時」にして保存します。
これでファイルを開くたびに契約書が渡されるようになりました。
名前を奪う
シートを起動した際に最後まで実行されないよう、ここからは別の関数として実装します。
function create_newname() {
name = sheet.getRange('C14').getValue();
Browser.msgBox('フン。'+name+'というのかい。贅沢な名だねぇ。');
let leng = name.length; /*文字数を取得*/
let rand = Math.random();
rand = Math.floor(rand*(leng-1))+1; /*1以上(文字数-1)以下の乱数を取得*/
const newname = name.substr(rand,1); /*rand文字目の文字を1文字だけ取得してnewnameとする*/
Browser.msgBox('今からお前の名前は'+newname+'だ。いいかい、'+newname+'だよ。\\nわかったら返事をするんだ、'+newname+'!!');
sheet.getRange('C14').setValue(newname);
}
名前を取得
name = sheet.getRange('C14').getValue();
Browser.msgBox('フン。'+name+'というのかい。贅沢な名だねぇ。');
入力完了後、枠の中に入力された文字列を取得して湯婆婆がつぶやくようにします。
名前をランダムで奪う
let leng = name.length; /*文字数を取得*/
let rand = Math.random();
rand = Math.floor(rand*leng); /*1以上(文字数-1)以下の乱数を取得*/
const newname = name.substr(rand,1); /*rand文字目の文字を1文字だけ取得してnewnameとする*/
Browser.msgBox('今からお前の名前は'+newname+'だ。いいかい、'+newname+'だよ。\\nわかったら返事をするんだ、'+newname+'!!');
sheet.getRange('C14').setValue(newname);
GASでのランダム関数はこちらのサイトを参考にしました↓
newnameで宣言しているconst型は実は変数ではなく定数です。
おめでとう!お前は一生この名前として生きていくんだよ!
(……と言いたいところですが、実際はボタンを押すたびに関数が実行されるので別に一回きりの関数ではないです)
最後にこのcreate_newname()を入力完了ボタンに割り当てします。

終わりに
今回は自分が持っているPCがスペック悪めのChromebookだったのでスプレッドシート+GASでしたが、ExcelとVBAでも余裕で実装できると思います。
というか冒頭で紹介していた難関プログラミング言語やアセンブリですら実装できてしまうため、湯婆婆の実装には本来限界がないのでしょう。


