こんにちは〜
CYBIRD Advent Calendar 2025 22日目担当@cy-n_aoです。
前日21日目は@moffunnyaさんの「誰でも使えるログ調査環境をさわってみた(クラスメソッド様主催 ゲームクリエイターズキャンプ)」でした。
「誰でも使える」とても良い言葉です…!AIとも連携して使いやすく簡単にログ調査ができるのはいいですね!
はじめに
私は普段サーバサイドエンジニアをしていて、主にPHPを使ってコードを書いているのですが、要所要所でスプレッドシートを使用しています。
集計をしたり、仕様書や設計書を作ったり…なんらかの取りまとめをする時など、使う場面は多岐にわたります。
簡単な関数なら普段から使っていますが、スクリプトを書いてスプレッドシートを操作することはあまりやってこなかったので、今回は「GASでスプレッドシートを操作してみよう」をテーマに、記事を書いていきたいと思います。
作ったもの
ボタンを押すとGASが献立を決めてくれるスプレッドシートを作りました。
右の「抽選!」ボタンを押すとメイン料理、サブ料理(サラダ、スープ等)がランダムで決まります。
メイン料理の内容によっては合わないサブ料理があるので、その場合は除外処理が入るようになっています。
作ろうと思った経緯
毎日の献立を考えるのが面倒だな〜と日々思っていて、面倒すぎて何も決めたくない日に押してランダムに決めてもらえたら楽しいかも?と考えました。
余談ですが、記事の内容を考えている時にたまたま見たYoutube動画で、「献立を考えること」が食事を作る上で一番ストレスだと考える人は多いらしいということを話していました。
医学的な面でも脳のエネルギーを大きく消費するタスクの1つでもあるようです。
それでは、以下作り方です。
1. 献立一覧を作る
スプレッドシート上に抽選で出すものを書いていきます。
数は何個でもOK。
※画像の内容はイメージです
【メイン料理情報】
メインにする料理名(A列)と、スープ・サラダから除外するグループ(B列)を入力します。
除外したいグループがある場合、グループ名またはALL(全て除外)を入れます。
この仕様だと、0or1orALLしか設定できないんですが、構成を変えれば複数除外設定することもできます。今回は時間の都合上1枠での設定にしています。
【スープ・サラダ情報】
スープ・サラダ名(D列)と、所属するグループ(E列)を入力します。
…献立上スープとサラダは別枠でしょ?と思う方も多いと思いますが、ここも時間の関係でどれか1つが抽選で出てくる仕様にしています。
メイン料理とスープ・サラダでそれぞれシートを分けてもよかったのですが、
一覧としてどちらも見えていた方が作りやすかったので同じシートにしています。
もちろんここは分割して作っても大丈夫です。
DBで考えると、メイン料理の情報とスープ・サラダの情報は別テーブルになるイメージですね。
2. 結果表示ページを作る
抽選した結果を表示するシートを作ります。
ここは結果表示用のセルさえきちんと空欄で用意すれば、自分の好みのカラーやボタン、デザインで作れます。
表示するセルは結果で上書きされるので、何も書かない場所にします。
結果表示エリアと、抽選する時に押すボタンを作ります。
B5セルにメイン料理、C5セルにスープ・サラダを出力できるようにしています。
3. スクリプトを書く
コード全体はこんな感じに書きました。
メイン料理が決まってからスープ・サラダの除外処理をしています。
// 献立を返却する
function selectMenu() {
const spreadseet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadseet.getSheetByName('献立リスト');
const resultSheet = spreadseet.getSheetByName('抽選ページ');
// 初期化処理
resultSheet.getRange('B5').setValue('');
resultSheet.getRange('C5').setValue('');
// メイン料理
const mainMenu = selectMain(sheet);
// サブ料理
const subMenu = selectSub(sheet, mainMenu[0][1]);
// 出力
resultSheet.getRange('B5').setValue(mainMenu[0][0]);
if (subMenu) {
resultSheet.getRange('C5').setValue(subMenu[0][0]);
}
}
/**
* メイン献立を返す
*/
function selectMain(sheet) {
// 最終行の算出
var mainMenuLastRow = sheet.getRange('A:A').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
var mainMenuRange = 'A2:B' + mainMenuLastRow;
// 献立リストの情報を取得
const mainMenuList = sheet.getRange(mainMenuRange).getValues();
// ランダムに1つ取得する
var randomSelect = getRandomSelect(mainMenuList);
return randomSelect;
}
/**
* サブ献立を返す
*/
function selectSub(sheet, exclusionGroup) {
// 最終行の算出
var subMenuLastRow = sheet.getRange('D:D').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
var subMenuRange = 'D2:E' + subMenuLastRow;
// 献立リストの情報を取得
const tmpMenuList = sheet.getRange(subMenuRange).getValues();
// メイン献立を見て、除外グループを確認
if (exclusionGroup !== '') {
// 全て不要の場合はreturn
if (exclusionGroup === 'ALL') {
return '';
}
// 除外グループ以外を抽出
var subMenuList = tmpMenuList.filter(function(menu) {
return menu[1] !== exclusionGroup;
});
}
else {
var subMenuList = tmpMenuList;
}
// ランダムに1つ取得する
var randomSelect = getRandomSelect(subMenuList);
return randomSelect;
}
/**
* 配列の中からランダムに一つ取得する
*/
function getRandomSelect(menuList) {
var randomSelect = [];
const rand = Math.floor(Math.random() * menuList.length);
randomSelect.push(menuList[rand]);
return randomSelect;
}
内容はかなり簡単なので、するっと書けると思います!
今回はやっていませんが、献立の優先度を数値化したりジャンル分けをしたりすることでもう少し違った仕様になったり、除外処理の情報を増やしたり出力種類を増やすことで変化がつけられるかなと思います。
また、献立の内容のみの出力だけでなく作り方のページや動画用の列を追加してURLを返すのもありだなと思います。
4. スクリプトを割り当てて完成!
結果表示画面に作った「抽選!」ボタンに、スクリプトを登録します。
今回はスクリプト一番上のselectMenu()を割り当てます。
ボタンを押下して実行してみると、冒頭の画像のように結果画面に献立が出てきます!
他にもこんな使い方
ランダムで内容を返す処理には色々使い道があるので、
例えば一覧表を名簿にしてくじ引きツールにしたり、ビンゴの数字が出るように調整してゲームに使ったりもできそうだなと思いました。
まとめ
ツール作成を通して、GASの基本的な使い方や操作を習得できたかなと思います!
GAS&スプレッドシートはスプレッドシートの内容をDBデータに見立てて処理をつくることができ、見た目的にもわかりやすくてプログラミング経験が少なくてもとっつきやすいのではと感じました。
私自身の今の業務を鑑みてもスプレッドシートの操作ができるようになっていた方がいいと思うので、今後も勉強していきたいです!
CYBIRD Advent Calendar 2025 23日目は@ny512さんの「読みやすく伝わりやすい文章を書いてみよう!」です。
お楽しみに![]()



