【 GAS & Excel 】GAS(Google App Script)を用いたテストデータ生成

2024/07/28に公開

はじめに

様々な場面でテストデータが必要になるかと思われます。ChatGPTCludeを用いたデータ生成もありますが、個人的にはExcelのデータにも落とし込めるGASを用いた方法がやりやすいと感じたため、まとめている。

1. Apps Scriptを開く

  • スプレッドシートデータのメニューバーから「拡張機能」→「Apps Script」を選択する。

2.コードを貼り付け保存する

  • Apps Scriptが正しく開くか確認。

  • 以下のコードを貼り付ける。

医療に関連するデータが自動的に生成されるようになっている
function generateData() {
  // 列名の設定
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.appendRow(["ID", "氏名", "所属", "年齢", "性別", "疾患", "上限日数", "入院日", "入院時FIM-m", "入院時予測FIM-m", "退院日", "退院時FIM-m", "FIM利得", "在院日数", "在院日数/上限日数", "実績指数"]);

  // 列で変数や定数を定義する必要があるものはここで定義する
  const fullNames = [
    "佐藤太郎", "鈴木次郎", "高橋花子", "田中一郎", "伊藤二郎", "渡辺三郎", "山本四郎", "中村五郎", "小林六郎", "加藤七郎",
    "吉田八郎", "山田九郎", "佐々木十郎", "山口一花", "松本二花", "井上三花", "木村四花", "林五花", "斎藤六花", "清水七花"
  ];
  const departments = ["病棟①", "病棟②", "病棟③"];
  const diseases = ["①", "②", "③", "④", "⑤"];
  const genders = ["男性", "女性"];
  const maxDays = { "①": 150, "②": 180, "③": 90, "④": 60, "⑤": 90 };
  
  // 入院日の期間を定義
  const START_DATE = new Date(2023, 0, 1);  // 2023年1月1日
  const END_DATE = new Date(2023, 11, 31);  // 2023年12月31日
  
  // 定数に値を埋め込む
  for (let i = 1; i <= 100; i++) { 
    const fullName = fullNames[Math.floor(Math.random() * fullNames.length)];
    const department = departments[Math.floor(Math.random() * departments.length)];
    const age = Math.floor(Math.random() * 83) + 18; 
    const gender = genders[Math.floor(Math.random() * genders.length)];
    const disease = diseases[Math.floor(Math.random() * diseases.length)];
    const maxDaysForDisease = maxDays[disease];
    
    const admissionDate = randomDate(START_DATE, END_DATE);
    const dischargeDate = new Date(admissionDate.getTime() + Math.random() * (365 * 24 * 60 * 60 * 1000)); 
    
    const fimAdmission = Math.floor(Math.random() * 79) + 13; 
    const fimPrediction = fimAdmission + Math.floor(Math.random() * (91 - fimAdmission + 1));
    const fimDischarge = fimPrediction + Math.floor(Math.random() * (91 - fimPrediction + 1));
    
    const fimGain = fimDischarge - fimAdmission;
    const lengthOfStay = Math.ceil((dischargeDate - admissionDate) / (1000 * 60 * 60 * 24)); 
    const stayRatio = lengthOfStay / maxDaysForDisease;
    const performanceIndex = fimGain / stayRatio;

    sheet.appendRow([
      i, 
      fullName, 
      department, 
      age, 
      gender, 
      disease, 
      maxDaysForDisease, 
      formatDate(admissionDate), 
      fimAdmission, 
      fimPrediction, 
      formatDate(dischargeDate), 
      fimDischarge, 
      fimGain, 
      lengthOfStay, 
      Number(stayRatio.toFixed(2)),
      Number(performanceIndex.toFixed(2)),
    ]);
  }
}

// 指定された期間内でランダムな日付を生成する関数
function randomDate(start, end) {
  return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
}

// 日付を "YYYY-MM-DD" 形式でフォーマットするヘルパー関数
function formatDate(date) {
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  return `${year}-${month}-${day}`;
}
  • 保存するをクリックする。

3.権限関連の手続きを行う

  • 「権限を確認」をクリックする。

  • 自分のアカウントを選択する。

  • 「詳細を表示」をクリックする。

  • 無題のプロジェクト(安全ではないページ)に移動をクリックする。

  • アクセスリクエストを許可する。

4.実行結果を確認する

  • App sheet側のログを確認する

  • スプレットシート側の出力結果を確認する

5.Excelデータとして出力する

おまけ

個人情報のテストデータ作成は以下のサイトが素早く行ると思いました。
https://yamagata.int21h.jp/tool/testdata/

参考

https://learn.microsoft.com/ja-jp/office/vba/library-reference/concepts/getting-started-with-vba-in-office
https://note.com/naoki_35/n/n81631db25a34

Discussion