2021年3月23日火曜日

2021/3/23

3限

引き続き、システム名やロゴ、ユースケース図について考えました。

システム名は『家族で 薬シェア』に決定!!

ロゴも以下の案で構図が固まりました(清書はこれから)。

システム名も含めてのロゴも、これから考えていきたいと思います。

また、以下にリッチメニューにて用意予定のメニューを掲載します。

【リッチメニューにて用意する機能(現時点)とタップ後の操作】

・薬の情報を閲覧するメニュー ⇒ブラウザで登録した薬の一覧を表示⇒「くすりのしおり」にて自動検索

・身長・体重を閲覧するメニュー ⇒ブラウザでグラフを表示

・血圧を閲覧するメニュー ⇒ブラウザでグラフを表示

・個人情報を修正するメニュー ⇒LINEのメッセージにて操作

・服薬履歴を閲覧するメニュー ⇒ブラウザでカレンダーを用いて表示

・服薬完了を登録するメニュー


4限

 本日は key break処理 について学びました。

while をうまく活用することで、学籍番号をキーとし複数の情報をまとめることができます。

これからシステムの機能をプログラミングしていく上でとても重要そう。しっかり理解しておこうと思います。



シート名を指定してスプレッドシートから学籍番号をキーとした辞書形式のデータを読み込む関数

図1は、学生が取得した資格を整理したシートである。1列目に学籍番号を、2列目に資格を記入している。学生が複数の資格を持つ場合は、1行に1資格ずつ、必要な数だけ記録している。

図1.資格

このシートを読み込んで、次のようなJSON形式のデータに変換するプログラムを作成する。

{
 "w3400000": [
  "医療情報技師",
  "ITパスポート"
 ],
 "w3400001": [
  "医療情報基礎知識検定"
 ],
 "w3400199": [
  "医療事務",
  "介護福祉士",
  "簿記3級",
  "秘書検定2級"
 ],
 "w3400256": [
  "日商PC検定3級",
  "診療情報管理士",
  "二級ボイラー技士"
 ]
}

このデータは辞書形式(連想配列)の構造になっており、学籍番号をキーとしてその学生が所持している資格配列にアクセスできる。この辞書データを作成する関数loadDataFromSpreadsheetを以下に示す。

/**
 * シート名を指定してスプレッドシートから学籍番号をキーとした辞書形式のデータを読み込む
 */
function loadDataFromSpreadsheet(sheetName) {
  // シート名がsheetNameのシートからデータを読み込む
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  const numColumns = sheet.getLastColumn();
  const numRows = sheet.getLastRow() - 1;
  const values = sheet.getRange(2, 1, numRows, numColumns).getValues();
  const dic = {};
  let i = 0;
  while(i < values.length) {
    const id = values[i][0];
    const val = [];
    while(i < values.length && id == values[i][0]) {
      val.push(values[i][1]);
      i++;
    }
    dic[id] = val;
  }
  return dic;

}

このプログラムはデータがスプレッドシートに学籍番号順に格納されていることを前提としている。したがって、学籍番号が入れ子になっている場合はうまくいかない。それを改良したのが下のプログラムである。

/**
 * シート名を指定してスプレッドシートから学籍番号をキーとした辞書形式のデータを読み込む
 */
function loadDataFromSpreadsheet(sheetName) {
  // シート名がsheetNameのシートからデータを読み込む
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  const numColumns = sheet.getLastColumn();
  const numRows = sheet.getLastRow() - 1;
  const values = sheet.getRange(2, 1, numRows, numColumns).getValues();
  const dic = {};
  for(let i = 0; i < values.length; i++) {
    const id = values[i][0];
    if(!dic[id]) {
      dic[id] = [];
    }
    dic[id].push(values[i][1]);
  }
  return dic;
}

このプログラムは辞書変数dicに学籍番号idのデータdic[id]がなければ空の配列を作成し、その後、配列に資格を追加する。このようにすれば、スプレッドシートには必ずしも学籍番号順に資格情報が記録されていなくとも正しくJSONデータを作成できる。

基本情報に資格、趣味、部活・サークルを追加

作成した関数loadDataFromSpreadsheetを基本情報を作成する関数loadPersonalDataFromSpreadsheetに組み込んでプログラムを完成させる。

/**
 * スプレッドシートから個人データを読み込む
 */
function loadPersonalDataFromSpreadsheet() {
  // 資格、趣味、部活・サークルをスプレッドシートから読み込む
  const certification = loadDataFromSpreadsheet('資格');
  const hobby = loadDataFromSpreadsheet('趣味');
  const club = loadDataFromSpreadsheet('部活・サークル');
  // シート「基本情報」から個人データを読み込んでオブジェクトを作成する
  const kihon = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('基本情報');
  const numColumns = kihon.getLastColumn();
  const numRows = kihon.getLastRow() - 1;
  const values = kihon.getRange(2, 1, numRows, numColumns).getValues();
  const data = [];
  for(let i = 0; i < values.length; i++) {
    data.push(
      {
        "id": values[i][0],
        "name": values[i][1],
        "attribute": {
          "gender": values[i][2],
          "birth": values[i][3],
          "phone_number": values[i][4],
          "blood_type": values[i][5]
        },
        "certification": certification[values[i][0]],
        "hobby": hobby[values[i][0]],
        "club": club[values[i][0]],
      }
    );
  }
  Logger.log(JSON.stringify(data, null, ' '));
  return data;
}

関数loadDataFromSpreadsheetをシート「資格」、「趣味」、「部活・サークル」に適用して変数certification、hobby、clubにデータを格納し、それを学籍番号(values[i][0]に入っている)をキーに各基本情報オブジェクトへ設定する。この関数を実行することにより、次のようなJSON形式のデータが得られる。

[
 {
  "id": "w3400000",
  "name": "川崎 太郎",
  "attribute": {
   "gender": "男",
   "birth": "1999-03-31T15:00:00.000Z",
   "phone_number": "086-462-1111",
   "blood_type": "A"
  },
  "certification": [
   "医療情報技師",
   "ITパスポート"
  ],
  "hobby": [
   "読書",
   "映画鑑賞",
   "散歩"
  ],
  "club": [
   "軽音楽部"
  ]
 },
 {
  "id": "w3400001",
  "name": "倉敷 花子",
  "attribute": {
   "gender": "女",
   "birth": "1999-12-25T15:00:00.000Z",
   "phone_number": "086-462-1234",
   "blood_type": "O"
  },
  "certification": [
   "医療情報基礎知識検定"
  ],
  "hobby": [
   "音楽を聴くこと",
   "寝ること"
  ]
 },
 {
  "id": "w3400199",
  "name": "岡山 大二郎",
  "attribute": {
   "gender": "男",
   "birth": "2000-03-10T15:00:00.000Z",
   "phone_number": "086-464-6532",
   "blood_type": "B"
  },
  "certification": [
   "医療事務",
   "介護福祉士",
   "簿記3級",
   "秘書検定2級"
  ],
  "hobby": [
   "犬とお話しすること",
   "星を見上げること",
   "妄想"
  ],
  "club": [
   "華道部",
   "テニスサークル"
  ]
 },
 {
  "id": "w3400256",
  "name": "水島 夢子",
  "attribute": {
   "gender": "女",
   "birth": "1999-04-30T15:00:00.000Z",
   "phone_number": "080-1234-5678",
   "blood_type": "AB"
  },
  "certification": [
   "日商PC検定3級",
   "診療情報管理士",
   "二級ボイラー技士"
  ],
  "hobby": [
   "料理レシピの閲覧",
   "ポイント収集",
   "動画視聴",
   "プログラミング",
   "野球観戦"
  ],
  "club": [
   "吹奏楽部",
   "天文部",
   "囲碁サークル"
  ]
 }
]

ここで、生年月日(attribute.birth)が「1999-03-31T15:00:00.000Z」といった表示になっているが、これは日付と時刻に関する国際規格(ISO 8601)による表記である。この規格では日付と時刻を「T」を挟んで表記する。また、末尾のZは協定世界時(UTC)の時刻を表す。そのため、日本国内における日時(日本標準時JST)とは9時間の時差がある(UTC が午前0時の時、JST は午前9時)ので正しく表示するにはUTCからJSTへの変換が必要となるが、これは次回に行う。

0 件のコメント:

コメントを投稿