#4. サンプルデータをランダムにpickする

Updated
2022/2/4 0:44
Author
Jumpei IkegamiJumpei Ikegami
 
前回は、スプレッドシートに任意の行数だけ通し番号を付けることに成功しました。テストデータ生成ツールの実装に大きく近づきました。
この記事では、別で用意したサンプルデータを使ってランダムにテストデータを生成します。

前提知識

この記事は次のチュートリアルの続きとなっています。
#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
 
実際、変数valuesrandomRowNum番目のデータが問題なく取得できていることを確認してみましょう。先ほどのプログラムには、次のようにコンソールにログを出す処理が書かれていました。
JavaScript
 
次の手順で関数getRandomAddressをテスト実行して、ログに出力された結果を見てみましょう。
  • 関数getRandomAddressを追記した後で、プロジェクトを保存する
  • 実行する関数をgetRandomAddressに変更し、 [デバッグ] ボタンを押す
  • 実行ログにrandomRowNumvalues[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つをランダムに選ぶ場合、処理の流れは次の図のようになります。雰囲気を感じてください。
(例)2〜5までの整数からランダムに1つ選ぶ
(例)2〜5までの整数からランダムに1つ選ぶ
新しい関数getRandomAddressを使うことで、実行する度に結果をランダムに出力してくれるようになりました。
 

出力する件数をユーザーに入力させる

ここまでで、いったんのやりたいことは実現できました。今回は通し番号と住所の2列しか出力していませんが、学んできたことを応用すればさらに多くの列を含むテストデータを生成できるはずです。
最後に、また1つ便利機能を追加しておきます。
関数genTestDataの冒頭を、次のように修正します。
 
JavaScript
プロジェクトを保存して独自メニューボタンから処理を実行すると、なんとモーダルから出力したい件数を入力できるようになります。
 
試しに30などと入力して [OK] を押してみると、入力した行数だけ結果が出力されます。便利ですね!
プログラムの主な変更点は次の部分です。
JavaScript
  • ui.promptで入力モーダルを表示
  • 条件分岐
    • OKボタンが押された場合
      • 入力値を数値に変換し、変数DATA_COUNTに格納
    • それ以外
      • 後続の処理をせずにreturn
 
完成したプログラムは、次の通りです。こんな長いプログラムも、それぞれの処理を理解できるとそれほど怖く感じないのではないでしょうか?
JavaScript

応用例

ここまでのチュートリアルで作成した機能をカスタマイズしたり、実際の業務に応用したりするためのアイデアをいくつか紹介します。
 
  • テストデータの生成
    • 住所だけではなく、氏名やメールアドレスなども含める
    • ランダムでデータを欠損させる