ViedocでJavaScriptを使用する
はじめに
Viedoc Designerで、JavaScriptを使用して以下の項目を設定することにより、試験構築の柔軟性が大幅に向上します。
- 表示条件の設定 (項目、項目グループ、アクティビティ、イベント)
- 項目設定のバリデーションにデータチェックを記述
- 項目の自動計算やデフォルト値を設定
- アラートの条件を記述
重要! 使用されるシンタックス(構文)はECMAScript 5.1スタンダードに記載されているJavaScriptの構文です。そのため、ECMAScript 5.1の仕様や範囲以外の値に対して機能を検証することが重要です。
注意! 誤ったフォーマットで記述されたJavaScriptコードが試験のデザインに設定された場合、Clinicで実行されたJavaScriptコードの結果は、表示条件、データチェック、アラートにおいて「falseの結果」として処理されます。 項目の関数で使用された場合、その項目は入力されず、フォーム監査証跡に試験デザインの問題についてのメモが表示されます。
注意!例えばCOMMON_AE.AESPIDのようにアラート対象項目への完全なパスが使用され、参照内でイベントが指定され、それがCommonイベントやUnscheduledイベントのように繰り返し発生する可能性がある場合、返される値は、イベントの日付に基づく最新のフォームインスタンスからのものになります。
使用される変数は、デザインの項目で、以下、Viedocの項目を指定するのセクションで説明されています。
使用されるJava Script演算子については演算子のセクションをご覧ください。
Viedocの項目を指定する
別フォームからの項目(以下「クロスフォーム項目」とする)は、Viedocで次の形式で指定されます:Event.Form.Item.
このように、 "." で区切られた3つの識別子で構成されます。
注意!
- イベントとは、試験デザインの試験ワークフローで定義されたイベントのことです。
- JavaScriptの言語定義では、キーワード間のスペースは許可されていますが、変数内のスペースは許可されていません。これは、変数に特定の値を代入する際に、Viedocは前後の文脈関係を含む構文全体の表現を1つのまとまりとして解析しようと試みるからです。(詳細は以下をご覧ください。)
イベントの指定
イベントは、次のいずれかの方法で指定できます。
EventID- イベント設定で指定されたイベントID。EventID[StudyEventRepeatKey]- もしイベントが繰り返されるもので、特定の事象のみを指定したい場合は、
[ ] 内にStudyEventRepeatKey値を書き込むことで行います。- インデクサーを使用する。例として、
EventID$FIRSTn- を使用すると、指定されたフォームが複数のイベントに現れる場合、 n 番目に開始されたイベントが指定されます。インデクサーについては、以下相対パスセクションを参照してください。
フォームの指定
フォームの指定は、次のいずれかの方法で可能です。
FormID- Viedoc Designerのフォーム設定でフォームIDを指定できます。FormID[FormRepeatKey]- フォームが繰り返しフォームで、特定のインスタンスを指定したい場合は、そのFormRepeatKeyの値を[ ]内に記述します。FormID$ActivityID- オプションとして、同じイベント内の複数のアクティビティにそれぞれのフォームが出現する場合、そのアクティビティを指定することができます。
例として、DM$MORNING.WEIGHT- MORNINGアクティビティ内のDMフォームの項目WEIGHTを参照します。FormID$ActivityID[FormRepeatKey]- アクティビティと繰り返しフォームの特定のインスタンスの両方を指定したい場合は、この形式で指定します。
項目の指定
同一フォームの項目にアクセスするには、項目IDだけで十分であり、イベントやフォームを指定する必要はありません。この場合、Viedoc Clinicでインプットを変更すると、アウトプットも同時に更新されます。(インプットされた値次第)
同一フォーム内の項目に Event.Form.Itemを使用している場合、Viedoc Clinicでインプットを変更すると、フォームを保存して再度開いた後にのみアウトプットの値が更新されます。
別のフォームの項目(いわゆるクロスフォームアイテム)にアクセスするには、イベントとフォームを指定する必要があります。
EventID.FormID.ItemID
相対パス
相対パスを使用してクロスフォーム変数にアクセスすることもできます。 この場合、いくつかの特殊なキーワードを使用します。 StudyEventDefIdに追加できるキーワード。 これらのキーワードは、StudyEventDefIdがなくても、任意のイベントを選択するために使用することができます。
| キーワード | 説明 | 例 |
|---|---|---|
$FIRSTn |
開始されたフォームの最初のイベントを指定します。n は任意のインデックスで、最初から n番目のイベントを指定します。タイムライン上では$FIRST2が$FIRST3よりも前に来ることを意味します。 |
AE$FIRST.AEFORM.AEDATE |
$LASTn |
開始されたフォームの最後のイベントを指定します。n は任意のインデックスで、最後から n番目のイベントを指定します。タイムライン上では$LAST2が$LAST3よりも後ろに来ることを意味します。 |
AE$LAST.AEFORM.AEDATE |
$PREVn |
開始されたフォームの前回のイベントを指定します。n は任意のインデックスで、特定のイベントから前にさかのぼって n番目のイベントを指定します。タイムライン上では$PREV2が$PREV3よりも後ろに来ることを意味します。 |
WEIGHT < $PREV.DM.WEIGHT + 10 |
$THIS |
現コンテキストのイベントを指定します。 |
任意のインデクサの使用例
次に、任意のインデクサ(上の表の n を参照)の使用例を紹介します。
フォーム「Add patient 」には、別のフォーム「PROFILE」上に存在する「NAME」と呼ばれる別テキスト項目の最新の空白ではない値を持つテキスト項目が存在するとします。これは、すべての規定イベント(STARTと呼ばれる最初のもの)と予定外イベントにあります。
以下の式は、フォーム「Add patient 」の項目で使用できます。
if($LAST.PROFILE.NAME != null) return $LAST.PROFILE.NAME;
if($LAST2.PROFILE.NAME != null) return $LAST2.PROFILE.NAME;
if($LAST3.PROFILE.NAME != null) return $LAST3.PROFILE.NAME;
if($LAST4.PROFILE.NAME != null) return $LAST4.PROFILE.NAME;
if($LAST5.PROFILE.NAME != null) return $LAST5.PROFILE.NAME;
if(START.PROFILE.NAME != null) return START.PROFILE.NAME;
return 'NOT SET';
これにより、最後の4つのイベントで項目が空白で保存される、または開始イベントの項目の値を再度保持することが可能になります。
クロスイベント日付
別のイベントの日付にアクセスするには、他のクロスフォーム変数と同じ原理を使用し、固定フォームID $EVENTと項目ID EventDateを使用します。
例として、AESTDT > BL.$EVENT.EventDate は、AE開始日はBLビジット日以降でなければならない、ということを意味します。
演算子
以下のJavaScript演算子を使用しています。
- Arithmetic Operators(算術演算子)
- + (addition)
- - (subtraction)
- * (multiplication)
- / (division)
- Comparison (比較演算子)
- == (equal to)
- != (not equal to)
- < (less than)
- > (greater than)
- <= (less than or equal)
- >= (greater than or equal)
- Boolean logic (ブーリアン型)
- && (AND)
- || (OR)
- ! (NOT)
データ型
次の表は、Viedoc の項目とその JavaScript データタイプとデフォルト値の一覧です。
| Viedoc項目 | JavaScriptデータタイプ | デフォルト値 |
|---|---|---|
| 1行テキスト | String(文字列) | null |
| 数字 | Number (数値) | null |
| 日付 | Date object (日付オブジェクト)
注意! JavaScriptでは0から11で月をカウントします。1月は0、12月は11になります。 注意! new Date(2020,08,01)のような式では、08と01の部分は先頭にゼロがあるため、8進数として解釈されます。この解釈を避けるには、代わりに new Date(2020,8,1) と書きます。 注意! 古いViedoc Me UIでは、クロスフォームで参照される日付フィールドは文字列とみなされます。新しいViedoc Me UIでは、クロスフォームとフォーム内の日付の両方が文字列としてみなされます。 このため、JS式で使用する場合、日付フィールドは日付オブジェクトとして動作しません。このため、new Date()の入力として追加することで、日付文字列を日付オブジェクトに変換する必要があります。 これは、表示条件に日付を使用する場合にのみ使用されます。 注意! setMonth 関数で負の値を指定することはできません。この関数がサーバサイドで実行された場合、日付はシステムに正しく保存されません。 |
null |
| 時間 | Date object (日付オブジェクト) | null |
| パラグラフテキスト | String(文字列) | null |
| チェックボックス | Array of string/number* (文字列/数値数字の配列) | [ ] |
| ラジオボタン | String/Number* (文字列/数値数字) | null |
| ドロップダウン | String/Number* (文字列/数値数字) | null |
| ファイル |
以下のオブジェクト:
|
null |
| 範囲 | 範囲オブジェクトの文字列表現(詳細は範囲項目固有の式とプロパティのセクションを参照) | null |
*チェックボックス、ラジオボタン、またはドロップダウンの項目タイプは、選択コードのいずれかが数値でない限り、通常は数値です。
値による代入または参照による代入
JavaScripにおけるデータ代入方法は値、または参照の2つの方法により行うことができます。
値による代入
特定の値が代入されるJavaScriptのデータ型は以下の通りです。
- boolean
- null
- undefined
- string
- number
これは、上記のタイプのうちの2つの変数を比較した際、それらの値がそのまま比較されます。 たとえば次のコードの場合、
var a = 3;
var b = 'def';
var x = a;
var y = b;
aの値は3、bの値は'def'、xの値は3、yの値は'def'となります。変数 a と x は同じ値 3 を持ち、b と y は同じ値 'def' を持ちます。しかしこれら4つの変数はすべて独立したものです。なのでここで、a の値を 5 に変更した場合、3 の値を持っている 変数 x には何の影響もありません。
参照による代入
参照することにより値が代入される JavaScriptのデータ型は以下になります。
- array
- function
- object
これは、これらの型の変数は、値そのものではなく、参照先に存在する特定の値を取得することを意味します。
セクションデータ型にどのViedoc項目がオブジェクトなのか記載がありますのでご覧ください。
JavaScriptでは日付は必ずオブジェクトになります。例えば以下のようなものがあるとします。
var d=new Date();
var c=d;
d.setDate(10);
変数dは日付オブジェクトとして作成され、変数cはdの値を参照しています。この場合、dを変更するたびに、cも同時に変更されます。つまり、dを現在の月の10日に設定すると、cも自動的に同じ値を取得します。
システム変数
ある式が特定のフォームの文脈内で記載されるとき、次の変数を利用することができます。
| 変数名 | データ型 | デフォルト値 |
|---|---|---|
ItemId はViedoc Designerで設定 |
データ型の表で指定されている通り、項目の種類に応じて異なります。 | データ型にある表に記述されています。 |
SubjectKey |
String | 患者を追加した場合のみNULL |
SiteSubjectSeqNo |
Number | 施設内の患者のシーケンス番号(1から開始) |
StudySubjectSeqNo |
Number | 試験における患者のシーケンス番号(1から開始) |
SiteCode |
String | Viedoc Adminで設定された施設コード |
CountryCode |
String | 施設が存在する国の ISO国コード |
StudyEventDefId |
String | Viedoc Designerの試験ワークフローで指定された試験イベントのID |
StudyEventType |
String | 「規定イベント」「予定外イベント」「随時観察イベント」 |
StudyEventRepeatKey |
String | 繰り返しイベントの特定の再発を識別する番号(定期的なイベントや随時観察イベントなど) |
FormDefId |
String | Viedoc Designer > forms > settings で指定したフォームの ID |
FormRepeatKey |
String | 特定のアクティビティ内で繰り返しフォームの特定のインスタンスを識別するカウンター |
SubjectFormSeqNo |
String | 患者レベルで特定のフォームのインスタンスを一意に識別するカウンター。つまり、1から始まり、その患者に対してフォームの新しいインスタンスが作成されるたびに増加します。 詳細については、以下のフォームの通し番号 を参照してください。 |
OriginSubjectFormSeqNo |
String | コピーされたフォームのインスタンスに対して、データが最初にコピーされたフォームのインスタンスを識別します。フォームの最初のインスタンス(つまりコピーされていないもの)については、SubjectFormSeqNoの値を取得します。 詳細は以下のフォームの通し番号を参照してください。 |
SourceSubjectFormSeqNo |
String | コピーされたフォームのインスタンスに対して、コピーされたフォームインスタンスのソース(データがコピーされたフォームインスタンス)を特定するカウンター。 フォームインスタンスのコピー元のSubjectFormSeqNoの値を取得します。。フォームの最初のインスタンス(つまりコピーされていないもの)はnullです。詳細は以下のフォームの通し番号を参照してください。 |
EventDate |
Date object | 現在の随時観察イベント日付、他のすべての現在のイベント日付。 |
ActivityDefId |
String | Viedoc Designerの試験ワークフローで設定されたアクティビティのID |
|
注意! ダブルアンダースコアを使用する必要がありますのでご注意ください。 |
Date object |
日付の種類 0. 日付のみ 例 小数を含む数値 日付/時間変数のフォーマットを制御するのセッションもご覧ください。 |
BookletStatus |
String |
PMS試験のみに使用します! 分冊のステータスは、次のいずれかになります。
デフォルトのステータスは NotSubmitted となります。 <visit identifier>.$EVENT.BookletStatus 例: $THIS.$EVENT.BookletStatus, V1.$EVENT.BookletStatus, or $PREV.$EVENT.BookletStatus. |
フォームの通し番号
以下は、試験計画で使用できる統計変数の表です。
変数について、値はすべて評価発現時の現在値です。つまり、その値(例えば総数など)は、特定のイベントと結びついています。
変数は以下のフォーマットで利用できます。<イベント識別子> .$STATS.<下の表にあるような変数> $THIS.$STATS.QueryRaisedCount
|
Variable name |
Data type | Description |
|---|---|---|
|
|
Number | イベント内で発行されたクエリの総数。 |
|
|
Number | イベント内で解消したクエリの総数。 |
|
|
Number | イベント内でリジェクトされたクエリの総数。 |
|
|
Number | イベント内で承認されたクエリの総数。 |
|
|
Number | イベント内でクローズされたクエリの総数。 |
IncompleteFormsCount |
Number | イベント内で未完了のフォームの総数。 |
|
|
Number | イベント内でロックされていないフォームの総数。 |
|
|
Number | イベント内のCRAが未確認のフォームの総数。 |
|
|
Number | イベント内のデータマネージャがレビューしていないフォームの総数。 |
|
|
Number | イベント内のSDVがされていないフォームの総数(SDV: Source Data Verification)。 |
|
|
Number | イベント内のinvestigatorにより署名がれていないフォームの総数。 |
注意 ! これらの統計変数は、どのようなサマリーフォーマットでもサポートされていません。これらの変数に含まれる式は、カントが更新または変更されても再評価されません。
フォームシーケンス番号
フォームのインスタンスをフォームのシーケンス番号を使用して追跡する
以下のフォームの通し番号は、患者レベルで異なるフォームインスタンスを容易に追跡できるように使用されます。これらは、前のイベントからデータをコピーして開始したフォームインスタンスの場合、特に参考になります。
- FormRepeatKey - 特定のアクティビティにおける、繰り返しフォームの特定のインスタンスを識別するカウンター。これは、Viedoc出力バージョン4.39以降のエクスポート出力で利用可能です。
- SubjectFormSeqNo –患者レベルで特定のフォームのインスタンスを一意に識別するカウンター。1で始まり、その患者に対してフォームの新しいインスタンスが作成されるたびに数字がインクリメントされます。これは、Viedoc出力バージョン4.51以降のエクスポート出力で利用可能です。
- OriginSubjectFormSeqNo –コピーされたフォームインスタンスの場合、この番号でデータの最初のコピー元のフォームインスタンスを識別します。(コピーされていない)フォームの最初のインスタンスについては、
SubjectFormSeqNoの値を取得します。これは、Viedoc出力バージョン4.51以降のエクスポート出力で利用可能です。 - SourceSubjectFormSeqNo –コピーされたフォームインスタンス向けに参照する、コピーされたフォームインスタンス(データのコピー元のフォームインスタンス)のソースを識別するカウンター。フォームインスタンスのコピー元の
SubjectFormSeqNoの値を取得します。(コピーされていない)フォームの最初のインスタンスは、空の状態、つまりnullになります。これは、Viedoc出力バージョン4.51以降のエクスポート出力で利用可能です。
以下の例では、これらの通し番号の値がどのように付与されるかを示します。使用されているデモフォームは繰り返し・コピー可能で、イベント1、2、3に含まれる設定になっています。
Viedoc Clinicで以下の操作を実行します:
| 1 | イベント1を実施し、デモフォームの3つのインスタンスに入力します。これらのインスタンスには以下の通り、通し番号が付与されます。![]() |
| 2 | イベント2を実施します。イベント1の、事前に入力されたフォームインスタンスの1つからデータをコピーすると、デモフォームを開始できるようになり、3つのインスタンスはすべてゴーストフォームとして表示されます。![]() |
| 3 | イベント 1で入力されたフォームの3番目のインスタンスからデータをコピーして、イベント2のデモフォームのインスタンスを作成します。これにより、以下に示す通り、新しいフォームインスタンスに通し番号が付与されます。![]() |
| 4 | イベント3を実施します。次のように、イベント1とイベント2の、事前に入力されたフォームインスタンスのいずれかからデータをコピーすることにより、デモフォームを開始することができます。![]() |
| 5 | イベント2で入力したフォームからデータをコピーすることにより、イベント3のデモフォームのインスタンスを作成します。これにより、以下に示すように新しいフォームインスタンスに通し番号が付与されます。![]() |
これらの通し番号は、特定のフォームインスタンスの通し番号の値を取得する場合に限定して、式の中で使用できます。つまり、{SubjectFormSeqNo}、{OriginFormSeqNo}、{SourceFormSeqNo}を使用します。
上記の例では、これらの通し番号を次のように使用して、フォームのサマリー形式を構成しました。
Form Repeat Key {FormRepeatKey}, SubjectFormSeqNo {SubjectFormSeqNo}, OriginFormSeqNo {OriginFormSeqNo}, SourceFormSeqNo {SourceFormSeqNo}
注意!
- データインポート用のデータマッピングおよびJavaScriptで使用されるアイテム識別子(例:EventID.FormID $ ActivityID [FormRepeatKey] .ItemID)における、フォームの特定のインスタンスを識別するためには、FormRepeatKeyのみが使用されます。
- フォームをリセットしても、通し番号は引き続きフォームに割り当てられ、次に使用可能な通し番号は新しいインスタンスに使用されます。
以下のように、Excelのエクスポート出力では、これらのフォームの通し番号により、データの元となった前回のイベントからデータをコピーして開始したフォームインスタンスを追跡することができます。
フォームの通し番号の値を確認してみると、前回のイベントからデータをコピーして開始したフォームインスタンスのみが、ソース患者フォームの通し番号の列、つまりこの例の最後の2行に値が入力されています。 データは、同じ患者フォームの通し番号の値を持つフォームインスタンスからコピーされ、上記の画像で緑にハイライトされています。 データが初めてコピーされたフォームインスタンスは、元の患者フォームの通し番号の値、つまりこの例では「3」で識別されます。
関数
Viedocで記載された式は、JavaScript の function と同様に機能します。(ECMAScript 5.1標準に沿う)
例
return 2;
var a=2;
var b=3;
return a+b;
式は単一の文として書くことが可能で、Viedocはそれらを関数に変換します。
式は、戻り値(式)に変換されます。例:
2
は以下のように変換
return (2);
または、
VSDT <= now()
は以下のように変換
return ( VSDT <= now());
重要! ループ(for, for/in, while, do/while)を使用する場合は、以下を考慮してください。
- 動作を確認せずにコードをインターネットからコピーをしないでください。
- 無限ループになっていないか確認してください。
- JavaScript関数を使用する場合は、ブラウザの互換性を考慮してください。
- クライアント側とサーバー側の両方でシステムのメモリ問題を引き起こす可能性があるので、インライン/再帰関数は避けてください。
JavaScript式エディタ
JavaScript式エディタは、JavaScriptを書く際のヘルプツールです。主な機能は以下の通りです。
- オートコンプリートとルックアップ
- エラーのハイライト表示
- Viedocが提供するアイテムや機能について詳しく説明しているeラーニングのセクションへのリンク
JavaScript式エディタは、Viedocのフォーム設定、アラート設定、チェック式の編集、患者ステータス設定など、高度な条件をJavaScript式で入力する箇所すべてでご利用になれます。
JavaScript式エディタを開くには、JavaScriptテキストエディターのフィールドにあるJSボタンをクリックします。
エディターが開きます。
エディターウィンドウは画面上好きな場所に移動することができ、右下の矢印でサイズを変更することができます。
オートコンプリートとルックアップ
JavaScript式エディタは、オートコンプリートとルックアップに対応しています。
- クロスフォーム変数へのアクセス
- コンテキストフォーム変数へのアクセス
- Viedocが提供するヘルパー機能(例:
age、date、today)
JavaScript式エディタ・ウィンドウで入力を開始すると、ヘルプ・パネルにオートコンプリートの候補が表示されます。候補のリストにある項目の詳細を確認するには、その項目の上にマウスを置いて、ペインの右上にある > シンボルをクリックするか、Ctrl+スペースを入力します。
そして、ヘルプペインには、項目の構文やパラメータ、戻り値などの情報が表示されます。
ラジオボタン、チェックボックス、ドロップダウンメニューなどのアイテムでは、ヘルプペインにコードリストの値に関する情報が表示されます。
ヒント! 利用可能なすべてのアイテムのリストを表示するには、Ctrl+スペースを入力するか、入力を開始してください。
エラーのハイライト表示
コードにエラーがある場合は赤い下線が表示されます。その上にカーソルを置くと、エラーの詳細を確認することが出来ます。
青文字のPeekProblemをクリックするか、Alt+F8を入力すると、エラー情報がエディタ・ウィンドウにインラインで表示されます。エラー修正の提案を見たい場合はQuickFixをクリックします。
注意! JavaScriptの式エディタでは、ごくまれに式に誤ったフラグが立てられてしまう場合があります。しかし、変更内容を保存する際に実行される検証では、式が正しく検証されます。詳細については、下記サポートされていない式の種類を参照してください。
e ラーニングへのリンク
Viedocが提供するアイテムや機能については、ヘルプペインに、特定のアイテムや機能についての詳細な情報が掲載されているeラーニングのセクションへのリンクが表示されます。
| 重要!キーワード、letとconstは、PDF生成エラーの原因となる可能性があり、すべてのブラウザでサポートされているわけではありません。 |
サポートされていない式の種類
以下のタイプの式は、JavaScript式エディタではサポートされていませんが、これらの式は有効であり、変更を保存すると試験デザインが正しく検証されます。
- アクティビティ名を使用したクロスフォーム変数の参照 例 [$ActivityDefId]
- インデクサーによるクロスフォーム変数の参照 例 $FIRST[index]
ブール演算式
ブール演算は true または false を返す式で、表示制御やバリデーションで使用されます。
true-以下の様な実際の値を持つ場合はtrueになります。100"Hello""false"7 + 1 + 3.145 < 6
false- 以下の様な値を持たない場合は全てfalseになります。0Undefinednull""
例えば、体重が男性('M')で>65、女性で>45であることを確認するためのバリデーション表現。性別(ItemID=GENDER)はスクリーニングイベント(EventID=SCR)の患者情報フォーム(FormID=PI)に収集され、体重(ItemID=WEIGHT)はビジット毎にDemographicsフォームに収集されます。以下はWEIGHTの項目に書かれたエディットチェックです。
if (SCR.PI.GENDER == 'M')
return WEIGHT > 65;
else
return WEIGHT > 45;
日付の比較
JavaScriptでの日付はオブジェクトであり、利用可能な比較演算子は以下の通りです。
- >
- >=
- <
- <=
「==」または「!=」を使用する必要がある場合は、NULLをチェックする場合を除いて、下の画像の例のように、文字列に変換して比較します。 NULLをチェックするときは、NULLから別の値への変換中に、その値が変更されてしまう恐れがあるため、変換はしないでください。
2つの日付が同じかどうかの確認
Viedocで2つの日付が同じかどうかを確認するには、以下の関数を使用できます。
function sameDay(d1, d2) {
return d1.getFullYear() === d2.getFullYear() &&
d1.getMonth() === d2.getMonth() &&
d1.getDate() === d2.getDate();
}
return sameDay(Date1, Date2);
ここで、Date1とDate2は、比較対象の日付項目のためにViedocで使用される項目IDです。
最早/最新の日付を見つける
例えば3つの異なる日付のうち、最新の日付を取得するには
if(DATE1 != null && DATE2 != null && DATE3 != null)
{
var latestDate = Math.max(DATE1.valueOf(), DATE2.valueOf(), DATE3.valueOf());
return new Date(latestDate);
}
return null;
同様に最も早い日付を取得するには、Math.max式をMath.minに置き換える必要があります。
if(DATE1 != null && DATE2 != null && DATE3 != null)
{
var earliestDate = Math.min(DATE1.valueOf(), DATE2.valueOf(), DATE3.valueOf());
return new Date(earliestDate );
}
return null;
注意!.valueOf()関数は、プリミティブなデータ型では動作しません。javascriptエディタはこの関数をサポートしていますが、プリミティブなデータ型には使用しないでください。
ファイルのプロパティ
画像に示すように、ファイルデータタイプのメタデータ値には式でアクセスできます。
デフォルト値
デフォルトの値式が実行され、フォームが初期化されたときだけ結果の値が設定されます。
注意! 式やデフォルト値を持つ項目に表示条件が設定されている場合、項目が非表示になるたびにその値がデフォルト値にリセットされます。
Viedocが提供する式
| Function | Description | Implementation |
|---|---|---|
date(dateString) |
日付文字列をJavaScriptの日付オブジェクトに変換します。dateString は "yyyy-mm-dd" 形式でなければなりません。 | |
today() |
現在の施設の日付を返します。 | |
now() |
現在のサイトの日付と時刻を返します(施設があるタイムゾーン)。 | |
addDays (date, days) |
記入された日付オブジェクトに指定した日数を追加します。 | |
bmi ( weightInKg, heightInCM ) |
記入された体重(kg)と身長(cm)に基づいて計算された BMI(ボディマス指数)を返します。 | function bmi(weight, height) { |
days ( DateA, DateB ) |
入力パラメータとして入力された2つの日付間の日数を計算します。DateA と DateB を DateA - DateB として計算します。 注意! 結果は常に最も近い正数に四捨五入されます。(以下関数の実装を参照)日付と時刻の両方を含む少なくとも1つの入力パラメータを使用する場合、例えば、1.3日の場合は切り下げで1に、1.7日の場合は切り上げで2になります。 |
function days(endDate, startDate) { |
hours( DateTimeA, DateTimeB ) |
入力パラメータとして提供された2つの「日付と時刻」項目間の時間数を計算します:DateTimeAとDateTimeBを、DateTimeA - DateTimeBとして計算します。 | function hours(endDateTime, startDateTime) { |
minutes( DateTimeA, DateTimeB ) |
入力パラメータとして提供された2つの「日付と時刻」項目間の分を計算します:DateTimeAとDateTimeBを、DateTimeA - DateTimeBとして計算します。 | function minutes(endDateTime, startDateTime) { |
Array.contains 関数
チェックボックス項目(一般的には入れるタイプ)を処理する場合、表示条件およびエディットチェックの評価に特別なJavaScript関数、[].contains(x) が使用されます。
[].contains( x ) は、配列タイプが値を含むかどうかをチェックし、trueまたはfalseとして評価します。
例:
1. チェックボックス項目のオプションの1つが選択されているかテストするには、以下のようの式を記述できます。
ItemID.contains(CodeListValue)
ここで、ItemIDはチェックボックスのIDで、CodeListValueはそのチェックボックスのコードリストオプションのうちの1つのオプションのIDです。
2. 複数選択を許可することが意味をなさない「上記のいずれでもない」オプションがあるかもしれません。その場合は、以下のようなチェックを追加することが考えられます。
if(ItemID.contains(3))
return !ItemID.contains(1) && !ItemID.contains(2);
else return true;
上記の例では、3が上記の選択肢のどれにも該当しないコードリストで、1と2がリストの他の選択肢のコードリストです。また、感嘆符が使われていますが、これは「NOT」を意味し、「配列にこのコードリストの値が含まれてはならない」という意味です。
3. 特定のイベントやアクティビティにのみ表示したいものがあるかもしれません。イベントやアクティビティのリストを配列として定義し、その配列を評価に使用することができます:
var skipActivities = ['V1A1', 'V2A1', 'V3A1'];
skipActivities.contains(ActivityDefId);
上記をグループの高度な可視化条件として使用した場合、グループはそのアクティビティ内に存在する場合のみ表示されます。
範囲項目固有の関数とプロパティ
範囲項目は、範囲オブジェクトの文字列表現です。 それぞれの文字列を範囲オブジェクトに、またはその逆に変換するために使用できる関数を以下に説明します。
範囲オブジェクトで利用可能なプロパティは以下の通りです。
| プロパティ | 説明 | タイプ |
|---|---|---|
RangeObject*.Lower |
範囲の下限 | number |
RangeObject*.LowerFormat |
範囲の下限に使用される小数点以下の桁数 | number |
RangeObject*.Upper |
範囲の上限 | number |
RangeObject*.UpperFormat |
範囲の上限に使用される小数点以下の桁数 | number |
RangeObject*.Comparator |
範囲を定義するために使用される比較演算子。 利用可能な比較演算子は次のとおりです。
注意! 関数で比較演算子を使用する場合は、必ず引用符で挟んで記述してください。大文字小文字を区別しますので、上記の通り正確に入力してください。 |
string |
RangeObject*.StringValue |
それぞれの範囲項目の文字列表現 | string |
*RangeObjectは、後述する最初の2つの関数のアウトプットとして取得することができます。
範囲項目と組み合わせて使用できる関数を以下の表に示します。
| 関数 | インプット | アウトプット | 例 |
|---|---|---|---|
parseRangeValue(value) |
文字列としての値 | 範囲オブジェクト。未入力の場合、または解析できない場合はnull |
|
createRangeValue(lower, comparator,upper) |
- 文字列またはフロートとしての下限 - 文字列としてのコンパレータ - 文字列またはフロートとしての上限 |
範囲オブジェクト。未入力の場合、または解析できない場合はnull | createRangeValue("1.3", "InclusiveInBetween", "2.0") |
getRangeValue(rangeValue) |
範囲オブジェクトとしての範囲値 | 入力範囲オブジェクトによって定義された範囲の文字列表現 | function() { |
inRange(rangeValue, numericValue) |
- 範囲オブジェクトとして、又は文字列としての範囲値 - 数値 |
- 入力数値が入力範囲内にあるか(true)、否か(false)を示すブール値
|
|
Math ライブラリ
ECMAScriptには、計算に使用できるmath objectsが含まれています。
項目設定での関数
Viedocの項目に対して、他の項目や条件に応じて結果を返す関数を書くか、以下の画像のようにデフォルト値を割り当てることで、特定の値を代入するための関数を書くことができます。
注意!
- フォーム項目に値を返す関数は、データ型のセクションで指定されたデータ型と一致している必要があります。
- データ型の一致の必要性について述べましたが、一致しない関数を書くことを妨げるものは何もありません。小数点以下の数値や日付オブジェクトをテキストフィールドに返す場合、小数点以下の区切り文字や日付のフォーマットは、それぞれの関数がサーバー側で実行された場合、サーバー側で設定されたフォーマットになることに注意してください。例えば、
- 改訂版を適用するとき
- 「自動更新」フォーム
- 関数はViedoc Meのフォームでは利用できません
式のデバッグ
デバッグするには、式の中で次の式を使用することができます。
debugger;statement.
上記の記述は、Viedoc Clinicでそれぞれのフォームにデータを入力しているときにブラウザの開発者ツールを開いた場合にのみ有効です。
注意!
- デバッグ時には、単一行ステートメントを使用できません。
- ビジット/アクティビティの表示制御式はサーバー上で実行されるため、デバッグはできません。
バリデーション
Viedoc Designerでの変更の保存およびバリデーション中に、式はコンパイラを使用して検証され、ほとんどのエラーが検出されます。 ただし、JavaScriptは動的言語であるため、すべてをバリデーションできるわけではありません。
たとえば、AGE.foo ()はエラーをthrow(スロー)しません。これは、AGEはフォーム内の変数であり、コンパイラはその型を知らないためです。
| 重要! デザイナーは、プレビューまたはViedoc Clinicを使用して、考えられるすべてのパスで式をテストする必要があります。 |
例/使用例
JavaScriptの使用例については、以下のレッスンを参照してください。




