標準病名マスター

 標準病名マスター(第5.05版)はnmain505(病名基本テーブル)が26,646件ある。標準病名からICDコードを検索するプログラムを作る場合を考えると、もっとも安易なプログラムはGoogleスプレッドシートいnmain505をインポートし、GASで病名からICDコードを検索する関数を作ることが思い浮かぶ。この場合、2つの問題が発生する。一つは1件の検索に数秒(2~6秒)かかる問題で、もう一つは「不明なエラーが発生しました。しばらくしてからもう一度お試しください。」という原因不明なエラーが発生する問題である。前者の問題は検索アルゴリズムの問題ではなくスプレッドシートを読み込む処理自体に時間がかかっているようだ。後者の問題は原因不明で、どうもスプレッドシートの容量(テキストデータだけで4MB)に問題があるようだ。

そこで、スプレッドシートは諦めて、以下のようなJSONデータ(辞書データ、ハッシュ、あるいは仮想配列)を作成し、これを使って病名からICDコード等を検索するWebAPIを作成する戦略をとることにした。

const nmain505 = {
  "11β-水酸化酵素欠損症":{"id":"20100524","code":"QJ83","icd":"E250"},
  "17α-水酸化酵素欠損症":{"id":"20100530","code":"CP8K","icd":"E250"},
  "17β-ヒドロキシステロイド脱水素酵素欠損症":{"id":"20103377","code":"A1R3","icd":"Q561"},
  "18-水酸化酵素欠損症":{"id":"20100527","code":"KP6Q","icd":"E250"},
  ・
  ・
  ・
 ];

これを使うとWebAPIのプログラムは次のようになる。

/**
 * 標準病名マスターWebWebサービス
 * 【GETメソッド】
 * @input
 *  https://script.google.com/macros/s/{id}/exec?disease=顔面皮膚欠損創
 * @output
 *  {"id":"20094003","code":"M86F","icd":"S018"}
 */
function doGet(e) {
  const disease = nmain505[e.parameter.disease];
  return ContentService.createTextOutput(JSON.stringify(disease)).setMimeType(ContentService.MimeType.JSON);
}
/**
 * 【POSTメソッド】
 * @input
 *  {'disease':'顔面皮膚欠損創'}
 * @output
 *  {"id":"20094003","code":"M86F","icd":"S018"}
 */
function doPost(e) {
  const param = JSON.parse(e.postData.getDataAsString());
  const disease = nmain505[param.disease];
  return ContentService.createTextOutput(JSON.stringify(disease)).setMimeType(ContentService.MimeType.JSON);
}

このようにWebAPIはGETリクエストとPOSTリクエストの2通りを準備した。下記のプログラムはこの2通りでWebAPIを呼び出すプログラムのサンプルである。

GETリクエスト

  const url = 'https://script.google.com/macros/s/{id}/exec';
  const response = UrlFetchApp.fetch(url + '?disease=顔面皮膚欠損創');
  Logger.log(response);

POSTリクエスト

  const url = 'https://script.google.com/macros/s/{id}/exec';
  const data = {
    "disease": "顔面皮膚欠損創",
  };
  var options =
  {
    "method"  : "post",
    "contentType": "application/json",
    "payload" : JSON.stringify(data),
  };
  const response = UrlFetchApp.fetch(url, options);
  Logger.log(response);

0 件のコメント:

コメントを投稿