#4. サンプルデータをランダムにpickする
Updated
2022/2/4 0:44
Author

前回は、スプレッドシートに任意の行数だけ通し番号を付けることに成功しました。テストデータ生成ツールの実装に大きく近づきました。
この記事では、別で用意したサンプルデータを使ってランダムにテストデータを生成します。
前提知識
この記事は次のチュートリアルの続きとなっています。
#3. スプレッドシートに複数行のデータを書き込む2022/1/30 3:582022/2/4 0:41
作るもの
サンプルの住所データから指定行数分だけランダムに住所をpickしてテストデータを生成する機能を、独自メニューボタンに追加します。

体験すること
このチュートリアルによって、以下を体験します。
- スプレッドシートの指定した範囲から表データを読み込む
- JavaScriptである範囲の整数からランダムに1つ選ぶ
- ユーザーから受け取った入力値をApps Script中で使う
チュートリアルスタート!
ここからは、実際に手を動かしながら読み進めていきましょう。ただ読むだけよりも、実際に体験した方が内容を深く理解することができます。
住所マスタを用意する
一連のチュートリアルでは、業務で使えるサンプルの顧客データを用意する機能をスプレッドシートに追加することをゴールにしていました。
より現実的なデータにするために、世の中にあるサンプルのデータセットを活用しましょう。ここでは、住所マスタを用意します。
- 次のサイトにアクセスする
- 自分に縁のある都道府県を選んで、zipファイルをダウンロード
- 「全国」版を使ってもいいですが、ちょっと重いので。
- 例では、筆者である僕が埼玉出身なので埼玉県のデータを使います
- zipファイルを解凍してcsvファイルを得る
- スプレッドシートの [ファイル > インポート] を押す
- [アップロード] からcsvファイルをアップロードし、インポート場所に [新しいシートを挿入する] を選んで [データのインポート] を押す

- 挿入したシートの名前を
住所マスタ
に変更

住所マスタから指定した行数のデータを取ってくる
前回のチュートリアルの最後、Apps Scriptのプログラムは次のような状態でした。
JavaScript
まず、プログラムの末尾に次の関数
getRandomAddress
を追記します。JavaScript
これは、住所マスタから適当な1行を選んで返す関数です。今は固定で42行目を必ず返すようになっていますが、返す行をランダムに選ぶように後で作り変えます。
ここで重要なのは、すでにデータが入ったrangeに対して
getValues()
を呼び出すことでその範囲にあるデータを全て取得できるということです。実際、変数values
には次のような表形式のデータが格納されます。JavaScript
実際、変数
values
のrandomRowNum
番目のデータが問題なく取得できていることを確認してみましょう。先ほどのプログラムには、次のようにコンソールにログを出す処理が書かれていました。JavaScript
次の手順で関数
getRandomAddress
をテスト実行して、ログに出力された結果を見てみましょう。- 関数
getRandomAddress
を追記した後で、プロジェクトを保存する
- 実行する関数を
getRandomAddress
に変更し、 [デバッグ] ボタンを押す
- 実行ログに
randomRowNum
とvalues[randomRowNum]
の値が出力されることを確認する

住所を含めてテストデータを出力する
ひとます関数
getRandomAddress
ができたので、さっそくこれを使って出力データに住所を含めてみましょう。関数
genTestData
を次のように変更します。JavaScript
実際に実行してみると、同じ住所が指定行数の分だけ繰り返し出力されます。

プログラムの変更点は、次の通りです。
- 「住所マスタ」関連の定数を追加
PREF_COLUMN
: 「都道府県」の列番号CITY_COLUMN
: 「市区町村」の列番号TOWN_COLUMN
: 「町域」の列番号
- 繰り返し処理の中に、住所を行データに含める処理を追加
- 関数
getRandomAddress
で住所データを1行取得 - 1行の住所データから、都道府県、市区町村、町域を表す文字列を取得して連結
- 例:
'埼玉県' + 'さいたま市北区' + '大成町'
- その結果を、更新に使う行データにpush
JavaScript
なお、JavaScriptの配列内の順番は「0番目」から始まる点に注意してください。たとえば
address
の「8つ目」の値を取得したい場合、配列の中では1つ小さい「7番目」(address[7]
)を取得する必要があります。住所の取得を毎回ランダムにする
実装を後回しにしていた、「住所をランダムに選ぶ」処理を実装します。
関数
getRandomAddress
を次のように変更します。JavaScript
変更点は次の通りです。
- データが含まれる範囲の開始行の番号と終了行の番号を次の変数に入れる
- 変数
FIRST_ROW
- 1行目はヘッダー行なので、
2
- 変数
LAST_ROW
values.length
でvaluesに格納された要素(つまり行データ)の数から動的に取得している
- 開始行から終了行の中からランダムで1つの番号を選ぶ
Math.random()
- 0.00〜1.00までの小数を含む乱数を得る
Math.random() * (LAST_ROW - FIRST_ROW + 1) + FIRST_ROW
- 乱数の範囲を、指定した整数の範囲に揃える
Math.floor()
- 小数点以下を切り捨てる
ランダムに整数を生成する部分は、特に理解が難しいところです。たとえば、整数
2,3,4,5
から1つをランダムに選ぶ場合、処理の流れは次の図のようになります。雰囲気を感じてください。
新しい関数
getRandomAddress
を使うことで、実行する度に結果をランダムに出力してくれるようになりました。
出力する件数をユーザーに入力させる
ここまでで、いったんのやりたいことは実現できました。今回は通し番号と住所の2列しか出力していませんが、学んできたことを応用すればさらに多くの列を含むテストデータを生成できるはずです。
最後に、また1つ便利機能を追加しておきます。
関数
genTestData
の冒頭を、次のように修正します。JavaScript
プロジェクトを保存して独自メニューボタンから処理を実行すると、なんとモーダルから出力したい件数を入力できるようになります。

試しに
30
などと入力して [OK] を押してみると、入力した行数だけ結果が出力されます。便利ですね!プログラムの主な変更点は次の部分です。
JavaScript
ui.prompt
で入力モーダルを表示
- 条件分岐
- OKボタンが押された場合
- 入力値を数値に変換し、変数
DATA_COUNT
に格納 - それ以外
- 後続の処理をせずにreturn
完成したプログラムは、次の通りです。こんな長いプログラムも、それぞれの処理を理解できるとそれほど怖く感じないのではないでしょうか?
JavaScript
応用例
ここまでのチュートリアルで作成した機能をカスタマイズしたり、実際の業務に応用したりするためのアイデアをいくつか紹介します。
- テストデータの生成
- 住所だけではなく、氏名やメールアドレスなども含める
- ランダムでデータを欠損させる
- テストデータの活用
- 生成したテストデータをcsvファイルでダウンロードし、別の場所で活用する
- Googleの別のサービスに連携する
- Gmail
- Cloud Firestore