2021年3月30日火曜日

2021/03/30

 3限

引き続きユースケースについて考えました。半分以上考えることができているので、ユースケースについては、あとひと踏ん張りです。

また、初めてGoogleホームを使ってみました。まずは初期設定です(設定方法)。時間を使ってしまいましたが、何とか設定することができました。声をかけると反応してくれたことに感動しました。技術の進化はすごかった...。

4限も先週に引き続き、スプレッドシートを利用しました。日付を日本の時刻で表示する、個人データをJSON形式でかえすWebサービスについて学びました。


来週から授業が始まりますが、頑張りましょう~!!!



世界標準時刻(UTC)と日本標準時刻(JST)

GASの日時型を表示する際に注意しなければならないのは、日本標準時刻に変換しなければならない点である。これを行うのがUtilities.formatDate()関数である。

日付データdateを日本標準時刻(JST)の年月日に変換するには次のようにする。

Utilities.formatDate(date, 'JST', 'yyyy/MM/dd')

これを利用して前回作成したスプレッドシートから個人データを読み込む関数loadPersonalDataFromSpreadsheet()の個人情報の生年月日を日本標準時刻に変換するプログラムは次のようになる。attribute.birthの部分に注目して欲しい。スプレッドシートから読み込んだ日付データvalues[i][3]をUtilities.formatDate関数を使って年月日に変換している。

/**
 * スプレッドシートから個人データを読み込む
 */
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": Utilities.formatDate(values[i][3], 'JST', 'yyyy/MM/dd'),
          "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;
}

個人データをJSON形式で返すWebサービス

ここまででスプレッドシートに格納した個人データをオブジェクトに変換するプログラムが完成したので、指定した学籍番号の個人情報をJSON形式で返すWebサービスを作成する。

そのためにまず、idを指定して個人データを取得する関数getPersonById()を作成する。

/**
 * idを指定して個人データを取得する関数
 */
function getPersonById(id) {
  let person = null;
  const data = loadPersonalDataFromSpreadsheet();
  for(var i = 0; i < data.length; i++) {
    if(id == data[i].id) {
      person = data[i];
      break;
    }
  }
  return person;
}

これを利用してHTTPリクエストのGETメソッドで指定したidの個人データをJSON形式で返すWebサービスのエントリポイントをdoGet()関数で作成する。

function doGet(e) {
  const parm = e.parameter;
  const data = loadPersonalDataFromSpreadsheet();
  const person = getPersonById(parm.id);
  return ContentService.createTextOutput(JSON.stringify(person)).setMimeType(ContentService.MimeType.JSON);
}

これをデプロイしてWebアプリのURLを作成すれば下記のようなWebサービスが完成する。

図1.完成したWebサービス


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への変換が必要となるが、これは次回に行う。

2021/03/16

 3


宿題であったロゴとシステム名を持ち寄り、それぞれ考えてきたもので話し合いました。

また、前回書き出したユースケースについて、ユースケース記述をそれぞれ行いました。


4


SPIを前半にしました。私とは毎回相性が悪く途中で心が折れましたが、粘り強く取り組みたいと思います。

後半には久しぶりにプログラミングをしました。スプレッドシートから情報を取得できるようにしました。

Logger.log(JSON.stringify(data, null, ' ')); は、テストをするときに重要で、' 'の間に半角スペースを入れると実行結果が見やすく表示されます。



スプレッドシートから個人データを読み込む関数の作成

学生の基本情報(学籍番号、氏名、性別、生年月日、連絡先、血液型)を1行につき1学生分記録したシートを読み込んでJSON形式のデータを作成する関数loadPersonalDataFromSpreadsheetを作成した(下図)。

図1.基本情報

このプログラムのポイントは、データの領域をgetRange().getValues()メソッドでいったん2次元配列valuesに読み込んで、以降は、この配列から学生基本情報オブジェクトdataを作成している点である。このようにするのは1セルずつスプレッドシートにアクセスすると、大量にデータがある場合、時間がかかるからである。

/**
 * スプレッドシートから個人データを読み込む
 */
function loadPersonalDataFromSpreadsheet() {
  // シート「基本情報」からJSONJSONデータを作成する
  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]
        }
      }
    );
  }
  Logger.log(JSON.stringify(data, null, ' '));
  return data;
}

この関数を実行して得られる結果を下記に示す(下から3行目のLogger.logの出力)。

[
 {
  "id": "w3400000",
  "name": "川崎 太郎",
  "attribute": {
   "gender": "男",
   "birth": "1999-03-31T15:00:00.000Z",
   "phone_number": "086-462-1111",
   "blood_type": "A"
  }
 },
 {
  "id": "w3400001",
  "name": "倉敷 花子",
  "attribute": {
   "gender": "女",
   "birth": "1999-12-25T15:00:00.000Z",
   "phone_number": "086-462-1234",
   "blood_type": "O"
  }
 },
 {
  "id": "w3400199",
  "name": "岡山 大二郎",
  "attribute": {
   "gender": "男",
   "birth": "2000-03-10T15:00:00.000Z",
   "phone_number": "086-464-6532",
   "blood_type": "B"
  }
 },
 {
  "id": "w3400256",
  "name": "水島 夢子",
  "attribute": {
   "gender": "女",
   "birth": "1999-04-30T15:00:00.000Z",
   "phone_number": "080-1234-5678",
   "blood_type": "AB"
  }
 }
]

2021年3月11日木曜日

2021.3.11

 

1限は日本薬剤会の『電子版お薬手帳の現状と課題』を輪読し、電子お薬手帳のメリットやデメリットなどを知りました。また、システム作成に入る前にユースケース図ユースケース記述について学びました。
2限は実際に必要なアクターやユースケースを考えました。ユースケース図が今後のシステム作成にとても重要なので意見を出し合いながら作っていきましょう!


.
〈必要なアクターとユースケースの書き出し〉

〈大まかなユースケース図作成〉

電子お薬手帳調査結果

電子お薬手帳を実際にインストールしてどのような機能や特徴があるかを調べた。その結果を下表に示す。

表1.機能
また、実際にお薬を入力して登録所要時間や登録作業を通じて感じた印象をまとめた。結果を下表に示す。

表2.登録所要時間や登録作業を通じて感じた印象

 

2021年3月2日火曜日

2021/03/02

 3限は18種類のお薬手帳に記入する情報の違いについて調べました。

基本情報はほとんどのアプリで同じでしたが、QRカードの有無などに違いがありました。

4限は前回の続きをやりましたが、前回やった分のものが変わっていました…。

なぜでしょう⁇