【GAS】サンプルデータを作るプログラミングに挑戦してみよう!


今回は、サンプルデータを作ってみたいと思います。
こんにちは、モーです。
スプレッドシートなどでサンプルデータが欲しい時ありませんか?
私の場合、プログラミングの勉強をしているときや教養資料やプレゼン資料を作りたいときなど件数が多数あるサンプルデータがあれば楽なのになーなどと考えることがあります。
もちろん、サンプルデータについては、配布しているサイトなどもあるようなので、どこかで探してくることもできますが、形式や条件が異なっていて、なかなか欲しい形式になっていない場合もあると思います。
そんな場合、データ数が少なければ、「仕方ない、手入力で準備しようか」となり、頑張って準備するケースもあるようです。

そこで今回は、そんなサンプルデータを一瞬で作れるコードを作り、サンプルコードを一から準備するという作業から解放されたいと思います。
サンプルデータを作るために必要なのは、乱数を上手に活用することです。
- テーマは「商品の販売データ」
- データは、日付順で下に詰み上がっていく形式
- データ自体は数字が主要であり、商品もデータベース等で管理されたデータであること(今回は単純にするために、データベースを配列で代用)

数字や管理されたデータを中心としたデータであれば、特に作りやすいんだにゃ。うまく活用して欲しいんだにゃ。
STEP1:まずは、完成の確認

まずは、完成系を確認してもましょう。今回作るのは、フルーツを売ったという設定のサンプルデータです。
データには、販売日、商品名、単価、販売数、合計が入っていて、販売日は同じ日に複数回売れた可能性もあると言うことにして、準備しています。


上の表は、下のコードから作成されたものだにゃ。forループで一行目から順番に作っているんだにゃ。
const myFunction = () => {
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
//表のタイトルを入力
const arr = ["販売日","商品名","単価","販売数","合計"];
arr.forEach((ele, index) => {
sheet.getRange(1, index+1).setValue(ele);
});
//日付を変数に格納(2023年1月1日)
let dt = new Date(2023, 0, 1);
//商品名、値段のリスト
let item_list = [
{item: "バナナ", price: 300},
{item: "りんご", price: 150},
{item: "キウイ", price: 500},
{item: "梨", price: 250},
{item: "いちご", price: 350},
{item: "メロン", price: 700}
]
for(let i = 2; i < 100; i++){
//ずらす日付の範囲を乱数で準備し、一行目に入力
const adj_day = Math.floor(Math.random() * 2);
dt.setDate(dt.getDate() + adj_day);
sheet.getRange(i, 1).setValue(dt);
//乱数で商品名と値段のインデックスを決定し、二行目と三行目に入力
const item_s = Math.floor(Math.random() * item_list.length);
sheet.getRange(i, 2).setValue(item_list[item_s].item);
sheet.getRange(i, 3).setValue(item_list[item_s].price);
//乱数で販売数を決定し、四行目に入力
sheet.getRange(i, 4).setValue(Math.floor(Math.random() * 10 + 1));
//三行目と四行目を乗算する式を、五行目に入力
sheet.getRange(i, 5).setFormulaR1C1('=R[0]C[-2] * R[0]C[-1]');
}
}

詳しい作り方は、STEP2から見ていきます。内容は何度も同じことを繰り返しているだけで、乱数とループを多用しています。ここだけでわかる人は、参考にして、自分だけのサンプルを考えてみてください。それでは順番に見ていきましょう。
STEP2:販売日の入力
Date関数で基準となる日を決定する

まずは、販売日の開始時期を決めます。今回は、キリよく、2023年1月1日を基準としています。
//日付を変数に格納(2023年1月1日)
let dt = new Date(2023, 0, 1);

Date関数を使い、変数dtに日付を代入するんだにゃ。ここを基準として、どんどんずらしながら日付を入れるんだにゃ。
乱数でずれていく日付を決定する

次に、日付に日数を足していき、ずらしていきます。ここでは、乱数を使い、0〜2日を足して行くので、まずは、0〜2の乱数を生成し、変数adj_dayを作成します。
//ずらす日付の範囲を乱数で準備し、一行目に入力
const adj_day = Math.floor(Math.random() * 2);
//変数adj_dayにランダムに生成された数字を日付dtに追加し、シートへ記述する
dt.setDate(dt.getDate() + adj_day);
sheet.getRange(i, 1).setValue(dt);
STEP3:商品名と単価を入力
商品名と単価のオブジェクトを配列にして準備

今回販売した商品は、わかりやすいようにフルーツにしました。商品名と金額を持つオブジェクトを配列に入れて準備します。
//商品名、値段のリスト
let item_list = [
{item: "バナナ", price: 300},
{item: "りんご", price: 150},
{item: "キウイ", price: 500},
{item: "梨", price: 250},
{item: "いちご", price: 350},
{item: "メロン", price: 700}
]
乱数で配列にアクセスする

乱数を使って、配列にアクセスすることで、ランダムな商品名と値段がとれるんだにゃ。
//乱数で商品名と値段のインデックスを決定し、二行目と三行目に入力
const item_s = Math.floor(Math.random() * item_list.length);
sheet.getRange(i, 2).setValue(item_list[item_s].item);
sheet.getRange(i, 3).setValue(item_list[item_s].price);
STEP4:販売数を入力
販売数を乱数で準備する

これまでと同じように乱数を使って販売数も入力しましょう。ここでは、1回の販売で10個以下にするようにしています。
//乱数で販売数を決定し、四行目に入力
sheet.getRange(i, 4).setValue(Math.floor(Math.random() * 10 + 1));
STEP5:合計を入力
合計は式を入力して準備する

最後はすでに入力されている金額と販売数の掛け算を行う式を入れているんだにゃー。これでサンプルが完成だにゃ。
//三行目と四行目を乗算する式を、五行目に入力
sheet.getRange(i, 5).setFormulaR1C1('=R[0]C[-2] * R[0]C[-1]');

いかがでしょうか?全体を見てしまうと、難しく感じるかもしれませんが、一行ずつ作り込んでいくと、意外と簡単ではないでしょうか?
乱数を用いることで、簡単にサンプルデータを作ることができますね。あとは、ループする値を変えれば一万行なんていう数のサンプルデータも作ることができます。

今回は商品販売をテーマに作ったけど、データを変えることで色々なサンプルデータを作ることができると思うんだにゃ。数値やデータを変えて、試してみて欲しいんだにゃ。
プログラミングを学ぶならTechAcademy(テックアカデミー)がおすすめ!

独学で苦戦している人は、一度しっかりと基礎を学ぶと次のステップへ進めますよ。今のおすすめは、TechAcademy(テックアカデミー)ですね。
- オンラインで選抜された現役エンジニアから学ぶことができる
- 自宅からWeb制作・プログラミング・アプリ開発など幅広い分野を学べる
- 学ぶだけではなく、転職の支援、副業に活かせるスキルの習得、副業の仕事紹介まで行っている

無料体験や相談もあるから、一度試してみてもいいんだにゃ!
\無料体験、無料相談はこちらから/