Expression Manager/ja

注意: この機能はLimeSurvey 1.92以降で利用できます.

=クイックスタート=

概要
アンケートをカスタマイズするには、通常次のことを決めます.
 * 1) ナビゲーション/分岐 - 質問の順番を変更します.
 * 2) テーラーリング/パイピング - 質問の文言調整（先行する回答の引用、数や性別による語句の変化など）、カスタムレポートの生成（評価点数、アドバイスの提示など）
 * 3) 検証 - 回答が条件（最大値、最小値、入力パターンなど）を満たすようにします.

式マネージャー（EM）では、各機能のロジックを指定する直感的な方法が提供されています. 関数を呼び出しているものであっても、標準的な数式として書くことができるものは、ほとんどが有効な式になります. EMは現在、70の関数が利用でき、より多くの機能をサポートするよう、簡単に拡張することができます. また、（SGQA名ではなく）人間が読める変数名を使用して変数にアクセスすることもできます.

以下のセクションで、式マネージャーを使う主な場面を紹介します.

関連（ナビゲーション制御／分岐）
アンケートによっては、"Gotoロジック"を使用して、質問1でCと答えた場合は質問5にジャンプしたりします. このアプローチは、検証が難しく、質問を並べ替えるときにロジックが壊れてしまうため、大きな制約があります. EMでは、質問が有効かどうかを決めるすべての条件を、ブール値の出現条件式を使用して指定します. 質問が出現条件を満たす場合は質問が表示され、それ以外の場合は「適用外」となり、データベースにはNULL値が格納されます. これは条件エディターで実行できるものと似ていますが、EMではより複雑で強力な条件を簡単に指定でき、さらにSGQA名ではなく変数名を使用できます.

この画像では、アンケートの関連性ロジックを確認する例を示しており、ここでは、体格指数（BMI）を計算します. 関連式は、変数名の直後の角カッコで示されています（緑色）. 体重、体重の単位、身長、身長の単位の関連式はすべて1です. つまり、これらの項目は常に質問されます. しかし、BMIの関連式は、 {!is_empty(height) and !is_empty(weight)}となっており、BMIは、身長と体重の両方を入力しないと計算しないようになっています（ゼロで割るリスクも避けています）. また、「Report」の質問は、主たる4つの質問（身長、身長の単位、体重、体重の単位）すべてに回答した場合にのみ表示されます.



関連は以下の場所て表示・編集ができます.

質問レベルの関連の閲覧／編集
この式は、体格指数（BMI）を計算します. 最初に身長と体重を入力した場合のみ対象となります.



こちらがBMI質問の編集画面です.



関連式を入力するときは中括弧を使用しないようにしてください.

グループレベルの関連の閲覧／編集
これは、国勢調査の調査例です. 最初のページで、回答者に同居人数を尋ね、結果が"cohabs"変数に格納されています. このページは、複数の同居人がいる場合（つまり、このページは同居している2番目の人物に関するもの）で、回答者と「人物1」の関係（p1_rel）を指定した場合にのみ表示されます.



ご覧のように、グループには質問レベルの関連基準もあり、こうした質問は、先行する質問に回答したときにのみ表示されます（例：{!is_empty(p1_sex)}）. EMは、グループと質問レベルの関連を結合します. グループ内の質問は、グループ全体が関連する場合にのみ尋ねられます. 次に、関連するグループ内の質問のサブセットのみが尋ねられます.

その質問のグループレベルの関連を編集する画面は次のとおりです.



関連式を入力するときは中括弧を使用しないようにしてください.

カスタマイズ／パイプ
EMを使用すると、単純な、または複雑な条件付きの質問を簡単に作成できます. 例えば、" [ 製品]を購入したと回答しました. よかった点は何ですか？"のように、単純な「置き換え」が必要な場合があります. また、" [ Mr./Mrs.] [ LastName]、アンケートを完了してもよろしいですか？"のように、条件付きの置き換えが必要な場合もあります. この場合、回答者の性別に基づいてMr.かMrs.を使用します. また、例えば、数学的計算に基づいてさらに複雑な置き換えが必要になることもあります. EMは、このような場合のカスタマイズ／パイプをサポートしています.

条件式
体格指数の例では、身長と体重の入力単位がメートル法であってもメートル法でなくても、BMIが計算できることを示しています.



ここで、weight_kgは、{if(weight_units == 'kg', weight, weight * .453592)}となっています. このif関数では、キログラムで体重が入力されていた場合は入力値をそのまま採用し、それ以外の場合は入力値（単位はポンド）に0.453592をかけてキログラムに変換します. 同様に、変数height_mは、身長がインチ単位で入力されていてもメートル単位の身長を計算するようになっています.

BMIは、{weight_kg / (height_m * height_m)}という式で計算されます.

最後に、回答者に対し、条件付きでカスタマイズして入力した内容を表示します. （"身長2メートル、体重70キロと回答しました. "）

上の画像ではわかりにくくなっていますが、weight_statusは入れ子のifステートメントを使用し、その人物がやせているのか肥満なのかを分類します. その式をロジックビューで見ることができます.



この質問の編集ウィンドウから、次の2つのことがわかります.
 * 1) 中括弧で表現を囲む必要があります
 * 2) 式は、例えばこの例のように、ネストされた条件付きロジックを読みやすくするため、複数の行にまたがって記述することができます.



カスタマイズされた質問・解答・レポート
注意: 同じ質問ページの選択ボックスで回答オプションを利用できるようにすると、動的カスタマイズが機能しないことがあります. これは、選択オプション内で使えない  タグを挿入してしまうことに起因しています.

この例は、BMIレポートを示しています.



同じ質問の編集ウィンドウです.



ご覧のように、中括弧で囲われた部分は式として扱われるので、前の画像では構文ハイライト（色分け）されています. タイプミスや定義されていない変数名や関数のような誤字があった場合、EMはこのようなエラーを表示します. 例えば、height_unitは未定義の変数名（実際はheight_units）、rndは未定義関数（正しくはround）です. いずれの場合も、エラーを赤い枠で囲み、見つけて修正しやすくなっています.



また、入力された値の一覧やカスタマイズされたアドバイスなど、複雑なレポートをすばやく作成できます.

質問のどの部分がフリーテキストで、どの部分が式マネージャーで解析する必要があるかをLimeSurveyが判断するため、すべての式をCurly Bracesで囲む必要があります.

検証
EMは、高度な質問オプションがどのように機能するかを制御します. 回答の数、個々の入力値や合計の最小値／最大値を制限したり、入力された値が指定された文字列パターンと一致していることを確認したりします. いつものように高度な質問オプションの入力を行いますが、これらのフィールドの値はどれも式と見なされるため、他の質問と複雑な条件で組み合わせ、最小値／最大値基準を設定することができます.

これらのすべてのケースでは、高度な質問オプションは常に式と見なされるため、中括弧を使用することはありません.

サンプルアンケートページには、検証のために式を使用した実例がたくさんあります.

=はじめに=

LimeSurveyでは、新しいExpressionScript（EM）モジュールを使用して、より複雑な分岐、評価、検証、およびカスタマイズがサポートされています. LimeSurveyがサーバー内で行う置換、条件、評価の管理方法を置き換えることができます. また、ランタイムデータベースの読み込みのほとんどが不要になるため、処理速度が大幅に向上します. EMはDr. Thomas White（TMSWhite）が開発しました.

このwikiページは、ExpressionScriptの構文と機能のリファレンスです.

主な定義

 * 1) 式:  中括弧で囲まれたもの
 * 2) *開く中括弧の直後または閉じる中括弧の直前に空白がない
 * 3) *式の内容はEMが評価するため、数式、関数、複雑な文字列と日付処理を含めることができます.
 * 4) カスタマイズ: "パイピング"とも呼ばれますが、これは条件付きでテキストを変更するプロセスです.
 * 5) *すべての'置換フィールド'、参加者データ、回答データにアクセスできます.
 * 6) *質問、回答、およびそのプロパティにも簡単にアクセスできます.
 * 7) 出現条件式:  質問を表示するかを制御する新しい質問属性
 * 8) *出現条件式がある場合、その出現条件が真と評価された場合にのみ質問が表示されます.
 * 9) *内部では、すべてのarray_filterコマンドとarray_filter_excludeコマンドがサブ質問レベルの出現条件になります.
 * 10) 式質問タイプ:  データベースに計算やレポートを保存する新しい質問タイプ
 * 11) *これはテキストを表示する質問のようなものですが、"この質問をいつも隠す"を設定しても、その内容はデータベースに保存されます.
 * 12) 質問コード:  EMでの使用が推奨される変数名
 * 13) *これは質問の目的を示すわかりやすい名前にすることができ、複雑なロジックを読みやすくなります.
 * 14) *質問コードは数字で始めることはできないので、質問番号を質問コードにするときは、単に"q1"、"q1a"、"g1q2"のようにしてください.
 * 15) *現在のところ、データをSPSSまたはRにエクスポートすると、これが変数名になります. したがって、統計分析を行う場合は、ユニークにしなければなりません.

EMを使わなければならないのか？
短い答えは「いいえ」ですが、「はい」でもあります.

EMは、既存のアンケートと完全に後方互換性があります. LimeSurveyバージョン1.91+以前で使用されていたスタイルの条件と評価は、引き続き使うことができます.

ただし、EMでは、LimeSurveyが内部的にどのように条件を処理するかについて完全に置き換えられています. 条件エディタを使用して条件を作成したり管理したりすることはできますが、LimeSurvey 1.92ではそれらは同等の関連式に変換されます. アップグレードの一環として、LimeSurvey 1.92では既存のすべての条件が関連式に自動変換されます.

これにより、新旧のいいとこ取りができます. これまで通りLimeSurveyを使い続けることもできますが、同等の関連式が表示されるので、関連式に徐々に移行することもできます.

条件と関連の両方を使えるか？
はい. 質問によって条件エディターを使用することも、出現条件エディターを使用することもできます. 質問を保存すると、条件は自動的に出現条件に変換されます.

条件エディターを使用している場合、手動で入力した関連式は上書きされます. したがって、すでに条件があって、関連を手動で編集したい場合は、まずその質問の条件を削除してください. 具体的には、生成された関連式をテキストエディターにコピーし、条件メニューからその質問の条件をすべて削除し（関連も削除）、質問を編集し、テキストエディタからその質問の関連フィールドに貼り付け、質問を保存します. 生成された関連式を削除せずに条件を削除したいというニーズが場合、一括変換プロセスの追加開発を検討します.

条件と関連のどちらを選ぶべきか？
各々の長所と短所のリストを以下に示します.

LimeSurvey 1.91+の仕組みに満足していれば、変える理由はありません.

EMのメリットは他にあるか？
EMを使うべき理由がいくつかあります.
 * 1) 計算 - 任意の計算式を作成することができます.
 * 2) *一般的な数学的演算子と関数のすべてを利用できます.
 * 3) *70以上の数学、日付、および文字列処理関数を利用できます.
 * 4) *必要な場合、新しい関数を簡単に追加できます.
 * 5) データベースへの計算の保存
 * 6) *シンプル／複雑な式や評価点を計算し、JavaScriptを要せずにデータベースに保存できるようになりました.
 * 7) *式の質問タイプを使用してます.
 * 評価
 * 1) *以前は一部のみサポートされていましたが、すべての質問タイプからの評価やスケールの作成が可能になりました.
 * 2) *カスタマイズを使用すると、同じページであっても、必要な場所で、途中または合計の評価点数を表示できます.
 * 3) *評価点数に基づいて生成されたレポートをより細かくコントロールできます.
 * 4) *JavaScriptを使用せずに評価点数をデータベースに保存することができます.
 * 5) *評価点数は、JavaScriptやCSSを使わずに非表示にできます.
 * 6) 代替フィールド
 * 7) *{INSERTANS:SGQA}を使う代わりに、質問コードを使用すると、読みやすく、検証しやすくできます.
 * 8) *これにより、すべてを動作させるため質問を編集してSGQAコードを変更する必要もなくなります.
 * 9) カスタマイズ - 他の値に基づいてテキストをカスタマイズして表示できます. #*適切な敬称を使用する（例: "Hello [ Mr./Mrs.] Smith"）.
 * 10) *単数／複数に基づき文法的に正しい文章を出力する（例: "You have 1 child"と"You have 2 children"）
 * 11) *性や数に基づいて動詞や名詞を変化させる
 * 12) 新しい変数の属性 - 次の項目にアクセスして調整できます.
 * 13) * （接尾辞なし） - qcode.codeの別名
 * 14) *.code - 質問が表示された場合は選択された回答コード（それ以外の場合は空白）、またはテキスト値（コード化されていない質問の場合）
 * 15) *.NAOK - .codeと同じですが、非表示となる場合であっても計算やリストに含めることができます.
 * 16) *.value - 質問が表示対象となる場合はその質問の評価値（それ以外の場合は空白）、またはテキスト値（コード化されていない質問の場合）
 * 17) *.valueNAOK - .valueと同じですが、非表示となる場合であっても計算やリストに含めることができます.
 * 18) *.shown - ユーザーに表示される回答（これは{INSERTANS:xxx}の機能です）
 * 19) *.qid - 質問ID
 * 20) *.gid - グループID
 * 21) *.sgqa - 質問のSGQA値
 * 22) *.jsName - （このページで定義されているかどうかに関係なく）質問に対する正しいjavascript変数名
 * 23) *.qseq - 質問の順番（0から開始）
 * 24) *.gseq - グループの順番（0から開始）
 * 25) *.mandatory - 質問が必須かどうか（Y/N）
 * 26) *.question - 質問のテキスト
 * 27) *.relevance - 質問の関連式
 * 28) *.grelevance - グループの関連式
 * 29) *.relevanceStatus - 質問が表示条件を満たしているかどうか（1/0）
 * 30) *.type - 質問タイプ（1文字のコード）
 * 31) ページ内の動的変更
 * 32) *すべての関連、計算、およびカスタマイズはページ内で動的に機能するため、値の変更によりページが即座に更新されます.
 * 33) *したがって、関連の評価結果に基づいて、質問が動的に表示／非表示になります.
 * 34) *また、ページ内の回答に基づいて質問も動的に調整されるため、合計値、カスタマイズされた文、カスタマイズされたレポートをみることができます.
 * 35) 新しいデータ入力画面
 * 36) *現在のデータ入力システムを使用するだけでなく、単ページアンケートでも使用することもできます.
 * 37) *ページ内の関連とカスタマイズがサポートされており、データ入力担当者はタブキーで入力を進め、関連する回答を入力するだけで済みます.
 * 38) *この特徴は、データ入力者がカスタマイズによる動的変化を確認する必要がある場合に重要です.
 * 39) ほとんどのカスタムJavaScriptの必要性を排除
 * 40) *EMは、複雑な計算、点数づけ、カスタマイズ、および条件付きロジックを容易にサポートします.
 * 41) *JavaScript（カスタムレイアウトや条件付きの質問サブ要素など）を必要とするものもありますが、JavaScriptによって、EM関数を使用してSGQAの代わりにQcodeで質問にアクセスし、上記の質問属性にアクセスすることができます.

式マネージャーのその他の新機能
条件エディターを引き続き使用するか、または関連式を手動で作成するかにかかわらず、次のような利点があります.
 * 1) より複雑な検証基準を作成することができます.
 * 2) *すべての高度な質問属性（max_answers、min_num_value_n、max_num_valueなど）は式を使用できます. したがって、最小値・最大値の条件は、同じページの先行する質問の回答に基づいて簡単に調整できます.
 * 3) *EMは正規表現ベースの検証をすべて処理するので、pregと式ベースの質問属性を強固に組み合わせることができます.
 * 4) 質問とグループの並べ替え（または削除）が容易にできます.
 * 5) *バージョン1.92より前のバージョンでは、並べ替えによって条件が成立しなくなる可能性があると認識された場合、質問やグループの並べ替えはできませんでした. 同様に、ある質問に依存する質問がある場合は、その質問を削除できませんでした.
 * 6) *EMの構文強調表示により、これから宣言して使おうとしている質問を確認し、検証することが簡単にできです. したがって、いつでも質問やグループを並べ替えたり、削除したりすることができます. EMは潜在的なエラーを表示するためにすべての構文強調表示を更新します.
 * 7) *このようなレビューに役立つように、質問並べ替えの表示が強化されました. 質問の関連式とカスタマイズが表示されるので、変数がピンク（宣言する前に使用されていることを意味します）になったかどうかをすぐに確認できます.
 * 8) 質問やグループのナビゲーション番号は常に利用可能で正確です.
 * 9) *バージョン1.92以前は、複雑な条件があった場合、ナビゲーション番号は利用できませんでした.
 * 10) *EMでは、正確であることを保証されています.
 * 11) *前の質問に戻り、答えを変えてから、後ろにジャンプする（または送信する）こともできます.
 * 12) **前進すると、EMは関係するすべての質問／グループを再検証します.
 * 13) **表示条件に該当しなくなる質問があれば、データは内部で一貫性を保つためデータベースにNULLが格納されます.
 * 14) **質問が表示条件に該当したり、新たに必須条件または検証ルールに適合しなくなった場合、EMはそのページで停止し、ユーザーが最終ページに飛ぶ前にそれらの質問に答えなければならないようにします.
 * 15) 条件から関連への自動変換
 * 16) *データベースをアップグレードすると、条件を持つ既存のすべてのアンケートに関連式が生成されます.
 * 17) *アンケートをインポートするたびに、関連式が必要に応じて作成されます.
 * 18) *条件を追加、削除、または変更すると、EMは適切な関連式を生成します.
 * 19) 便利な構文強調表示
 * 20) *SGQAコードを入力した場合であっても、EMが関連式を表示するときは、Qcodeが表示されます. 読みやすくするためです.
 * 21) *すべての変数は、現在の質問の前後（または現在のグループの前後）に宣言されたかどうかを示すために色分けされています. これにより、変数を宣言する前に、関連（array_filterを含む）、カスタマイズ、検証式で使用する変数を使うケースをすばやく検出して修正できます.
 * 22) *色付けされた変数の上にマウスを移動すると、その質問に関する追加情報が表示されます. これには、グループ番号、質問番号、Qcode、質問のテキスト、利用可能な回答の選択肢（該当する質問タイプの場合）が含まれます.
 * 23) **回答の選択肢のリストは、次のような構文を使用します: 'answers':{key:val, ... }.
 * 24) **keyは'scale~code'という構文となります. scaleは回答の尺度（二元スケールなど）、codeは回答コードです.
 * 25) **valは'value~shown'という構文となります. valueは評価値（評価を使う場合. その他の場合はコード）、shownは表示される値です（Qcode.shownなど）.
 * 26) **つまり、多くの場合、アンケートで評価モードを使わずに計算を使用できます. ユニークで、10進数でなく、負の数でない回答オプションを列挙する場合は、Qcode.code値の計算を行うことができます.
 * 27) アンケートロジックとコンテンツ全体の簡単なレビュー
 * 28) *新しいアンケートロジック表示機能があり、アンケート（またはグループ、質問）に関するすべての情報を1ページに表示できます.
 * 29) *選択したスコープ（アンケート、グループ、質問）のグループ、質問、サブ質問、回答レベルの詳細を表示します.
 * 30) *また、関連、サブ質問レベルの関連（array_filterとarray_filter_exclude）、生成された検証式（pregと合計の最小値・最大値、値の数などの検証ルール）、およびすべての空白以外の質問属性も表示されます.
 * 31) *すべて構文強調表示されているため、潜在的な構文エラー（括弧の不一致、未宣言の変数使用など）を発見できます.
 * 32) *構文強調表示により、アンケートのナビゲーションと編集が迅速にできるようになります.
 * 33) **変数名をクリックすると、その質問を示すブラウザウィンドウ（またはタブ）が開き、編集することができます.
 * 34) **グループ名をクリックすると、グループの並べ替えビューを表示するブラウザウィンドウ（またはタブ）が開き、簡単に質問を移動できます.
 * 35) **すべての質問属性も構文強調表示されています. これにより、高度な質問オプション内で式を設定したり表示したりすることができます（式の最大値／最小値／合計など）
 * 36) *EMの製作者は、似たようなビューを使い、疫学者と治験審査委員会が高度に分岐する、何千もの質問があるアンケートを検証し、認可できるよう協力しました.

=始めてみる=

式マネージャーを始める最善の方法は以下のとおりです.
 * http://www.limesurvey.org/en/downloadからLimeSurveyの最新の安定版をインストールしてください.
 * サンプルアンケートをインポートして確認します.
 * 使用例と使用法やステップバイステップの例を読んでください.
 * EMに関するドキュメント（このページ）を読んでください.
 * ビルトインのEMテスト環境を試してみてください.
 * それぞれのアンケートのツールの下にあるEMオプションを選択します.
 * 使用可能な関数として、70以上の関数と構文を表示します.
 * 分離された式の単体テスト
 * すべてのEM関数と演算子、PHPとJavaScriptの結果の使用例を表示します.
 * PHPとJavaScriptのバージョンで異なる結果を生成する関数はほとんどありません. このページの内容を踏まえ、EMロジックを適切に計画することができます.

=式マネージャーでは、どの機能が拡張／置換されたのか？（LimeSurvey 1.91から）=

条件 → 関連
どの質問が表示されるかを制御する条件. 一般的な構文は、111X2X3 == "Y"'のようなSGQA 演算子 値でした. 条件はANDまたはORを組み合わせることができますが、ANDとORを混在させることは困難でした. 条件自体は独立したテーブルに保存され、LimeSurveyのコードの大部分は条件の管理に費やされていました. 膨大なデータベースアクセスのため、多数の条件を処理すると、パフォーマンス上の深刻な問題が発生する可能性がありました. さらに、条件が質問やグループに一旦割り当てられると、それらを並べ替えたり削除したりすることはできませんでした.

評価 → 式と細かいカスタマイズ
評価機能により、一連の質問から評価値を算出することができます. ただし、表示中のページ内で動的に変更することはできず、またその値はデータベースに保存されませんでした.

置換 → 細かいカスタマイズ
ユーザーは、先行する回答に基づいてメッセージや質問をカスタマイズできます. たとえば、{TOKEN:FIRSTNAME}さん、あなたは{INSERTANS:111X3X4}が好きなスポーツだと回答しましたのような質問が可能です. しかし、条件付きのカスタマイズ（性別に応じて"Mr."や"Mrs."をつけるなど）や、動詞や名詞を変化させたりすることはJavaScriptなしにはできませんでした. 質問をカスタマイズするようなアンケートを実装することはできましたが、すべての組み合わせに対する個別の質問が必要であり、表示する質問を決定する複雑な条件が必要でした.

検証
質問は、正規表現や最小値／最大値で検証するか、SGQAの回答を最小値または最大値として使用することができました. ただし、JavaScriptなしで他の変数の計算に基づいて検証することはできませんでした.

式
式はJavaScriptなしでは実現できませんでした.

式の質問タイプ
JavaScriptを使用せずに式をデータベースに保存すること（評価の最終スコアなど）はできませんでした.

=式マネージャーはどのように機能を拡張するのか？=

式マネージャーは、カスタムJavaScriptを必要とする複雑な機能をより簡単に実現できるLimeSurveyの新しいコアモジュールです. LimeSurveyが条件と評価を管理する現場の方法に取って代わるものです.

式マネージャー（EM）向けの新しい用語
EMは次のように機能を定義しています.
 * 関連に基づく分岐 - 質問が関連する場合は表示し、そうでない場合は非表示にします（データベースにNULLとしてマークします）. すべての質問タイプと各々のグループに対して新たな関連フィールドが追加されています（したがって、各質問に同じ条件をコピーしたりすることなくグループ全体に条件を設定でき、また、グループレベルと質問レベルの条件を組み合わせることができます）.
 * カスタマイズ - どの質問を聞くべきかを決めたら、カスタマイズ（パイピングとも呼ばれる）によって、質問方法を指定します. これは簡単な置き換え（例：{TOKEN:FIRSTNAME}）だけでなく、性別や人数によって動詞や名詞の変化も可能です. また、他の質問に回答したか（または回答内容）に基づいて、送信するメッセージを変更することもできます.
 * 式 - EMでは、式の結果を格納する新しい質問タイプ（式）が追加されました. 式の結果は、たとえページ上で非表示であって、計算結果はデータベースに書き込まれます. これにより、裏で行われるスコア計算、複雑な式に基づくナビゲーション、評価、およびレポートの作成が可能になり、データベース上で簡単に利用することができます.

関連とカスケードされた関連
すべての質問タイプで、質問が表示されるかどうかを制御する関連オプションが追加されました. EMは、アンケートに登場する順に関連式を処理します. 式が真（または式がない - 古い形式のアンケート向け）の場合、質問が表示されます. 関連が偽の場合、質問は非表示になり、その値はデータベースでNULLになります. グループに関連する質問がない場合、グループ全体がスキップされます.

さらに、式に含まれる変数のいずれかの関連が偽の場合、式は常に偽と評価されます. これにより関連の入れ子が可能になり、各々の質問に対して非常に長い関連式を書く必要がなくなります.

たとえば、5つの質問Q1〜Q5があり、Q1が答えられたらQ2、Q2に答えられたらQ3などを表示したいとします. 関連式は次のようになります.

関連性の計算はJavaScriptでも機能しますので、上記のすべての質問を1ページに置くことができ、期待どおりに動作します. 実際、EMは、アンケート、グループ、一画面での一斉質問フォーマットの仕組みを完全に置き換えています. 今では、まったく同じナビゲーションエンジンを使用しているので、アンケートスタイルに関係なく同じように動作します.

同じページにいる限り、入力した回答データは隠れていますが保持されています. したがって、情報を入力たあと、出現条件を満たさなくなるようなオプションを選択し、再び出現条件を満たすような選択をすると、回答は引き続き利用可能になります. ただし、別のページに移動すると、データセットの整合性を保つため、出現条件を満たさないすべての回答は失われます.

グループレベルの出現条件
式マネージャーはグループレベルの出現条件もサポートしています. これにより、ループ（繰り返し）の実装が容易になります. 最大10個の事柄（たとえば、製品や家庭内の人物など）に関する情報を収集するため、まずその数を質問するとします（例えば、家族の人数を聞いたり、リストの中からどの製品が好みなのかを選んでもらったりして）. 後から繰り返し聞くべき回数が分かったら、10個用意したグループごとに{count>=1}、{count>=2}、... {count>=10}といった形で、グループレベルの出現条件を設定することができます. それぞれのグループ内では、質問レベルの条件付きロジック（例：回答者の性別や年齢別の質問）を作成することができます. 質問とグループレベルの出現条件の式は、表示すべきかを決定するためにAND演算されます.

カスタマイズ／パイプ
中括弧内のものはすべて式として扱われるようになりました（後述する例外が1つあります）. 式はすべてのLimeReplacementFields、すべての変数（いくつかのエイリアスを介して）、すべての一般的な演算子（数学、論理、比較）、数多くの関数（クライアント側でも動的に機能する）にアクセスします.

これらの式を使用すると、次のようなことができます.
 * 1) 先行する質問への回答に基づいて回答者に条件付きでメッセージを表示する
 * 2) 評価を作成し、その結果に基づいて評価結果を表示する（条件付きで分岐するまたはメッセージを表示する）（評価モジュール自体は使用しない）
 * 3) 質問、回答、およびレポート内の動詞、名詞を変化させる
 * 4) アンケートの最後で、"回答を表示する"ページの前に回答の要約を表示する

式
式と呼ばれる新しい質問タイプがあります. これは、表示されている値をデータベースに格納することを除き、テキスト表示タイプの質問と似ています. したがって、式の質問テキストに評価計算が含まれている場合、パブリックまたはプライベート統計情報内に表示できる変数の値がデータベースに格納されます.

これにより、データベース内に評価スコアを格納したいというニーズが解決します.

構文
中カッコ内に含まれるものはすべて式と見なされます（ただし、先頭または末尾に空白がないことが必要です. これは、式マネージャーが埋め込みJavaScriptを処理しないようにするためです）.

開く括弧の後、閉じる括弧の前に空白がない限り、式は複数の行にまたがっても構いません. 特に次のような入れ子のif構文が見やすくなります.

式マネージャーは次の構文をサポートしています.
 * すべての標準的な数学演算子 （例: +,-,*,/,!）
 * すべての標準的な比較演算子（例: <,<=,==,!=,>,>=, およびこれらと同等のもの: lt,le,eq,ne,gt,ge）
 * 括弧（式のグルーピング）
 * 条件演算子（例: &&,||, およびこれらと同等のもの: and,or）
 * シングルクォートやダブルクォートで囲まれた文字列（それぞれが他のクォートタイプの文字列を埋め込むことができます）
 * コンマ演算子（式のリストを持つことができ、最終結果を返すことができます）
 * 代入演算子（=）
 * 定義済みの変数（質問、質問属性、回答を参照するため） - 例: すべてのSGQAコード
 * 定義済みの関数（既に70以上ありますが、簡単に追加できます）

演算子
EM構文は、通常の演算子の優先順位に従います.

プラス演算子に関する注意（+）
JavaScriptとPHPの間の一貫性を保つために、プラス演算子（+）は両方のオペランドが数値の場合は加算を行いますが、両方の部分が数値以外の文字列の場合は連結します. しかし、意図をもっとはっきりさせるため、連結関数joinを使うことをお勧めします.

数と文字列の型の不一致、および文字列としての強制比較に関する注意
値を不等号や等号で比較する場合は、値の型の不一致に注意してください. ユーザーが入力した値や選択した回答コードが明確に数値であれば、数値として使用されます. いずれかの値が で囲まれている場合: 強制的にテキストとして比較します. 数値として比較したい場合は で囲んではいけません.

たとえば、Q0.NAOKが値として9をもつ数値型質問である場合、 はtrueです.

整数値を確実に比較するには、 を使用します. Q0.NAOKが数値でない（空または文字列）場合は、intval(Q0.NAOK) === 0となります. 文字列値を比較する（"A" < "B"）場合は、直接strcmpを使用します. または

代入演算子（=）を使用する際の注意
代入演算子は、予期せぬ副作用を引き起こす可能性があるため、絶対に必要でない限り、使用しないでください. たとえば、先行する回答の値を変更した場合、その質問と現在の質問との間のカスケードされた出現条件と検証ロジックは再計算されないため、内部的に一貫性のないデータになりえます（たとえば、NULLであるべきものに回答が残る、回答があるべきなのにスキップされる、など）. 一般に、変数に値を割り当てる場合は、式の質問タイプを作成し、その値を設定するための式を使用する必要があります. しかし、本当に必要なことがまれにあるため、この演算子が用意されています.

この演算子について注意を促すため、構文式の中では赤いフォントで表示されています（"=="と混同しないようにするため）.

代入演算子を使う
代入を使用する主な理由は次のとおりです.
 * 式を使った既定値を設定できない質問の既定値を設定する必要がある（ユーザーインターフェイスでは回答オプションの1つを選択できるが、式を入力することができないリスト、ラジオなど）. ただし、LimeSurveyは式がその質問に対する許容可能な回答を生成できるかどうかを検証できないため、注意して使用してください.
 * 後続の回答に基づいて先行する質問への回答を強制的に変更する必要がある
 * など...

この目的のために、式マネージャーシステムを使用することができます.

例:
 * 質問への回答を小文字にする:
 * アンケートの開始時に配列質問タイプに既定の回答を設定する:
 * アンケート開始時に配列テキストの質問タイプに対する既定の回答を設定する:
 * 条件付きの回答を設定する:

XSS セキュリティ
XSSを有効にすると、式マネージャーシステムの一部が使用できなくなります.
 * 式の中でHTMLタグを開き、別の式で閉じる
 * URLに複雑な式を使用する

例と解決策
 * はXSSでは正常に動作しないため、次のようにします.
 * は、ここでは式の質問を使います. なぜなら、完全な質問コードが使用できるからです.

変数へのアクセス
式マネージャーでは、必要な変数に読み取り専用でアクセスできます. 下位互換性を保つため、次のものにアクセスすることができます.
 * TOKEN:xxx - トークンの属性値（例: TOKEN:FIRSTNAME、TOKEN:ATTRIBUTE_5）（匿名でないアンケート向け）
 * INSERTANS:SGQA - 回答として表示する値（例: "はい"）. 式マネージャーでは、{QCODE.shown}と同じです.
 * テンプレート内で使われるすべての{XXX}
 * 質問テキストでは、{QID}を質問IDで置き換え、{SGQ}を質問のSGQAで置き換えることができます.

さらに、式マネージャーでは、質問コード（データベース内の質問テーブルの'タイトル'列）で変数を参照できます. これは、データをSPSS、R、またはSASにエクスポートするときに使用される変数ラベルでもあります. 例えば、名前、年齢、性別について質問がある場合、12345X13X22、12345X13X23、12345X13X24といった形ではなく、name、age、genderといった形で変数を呼び出すことができます. これにより、式が読みやすく、ロジックが検証しやすくなり、また、グループや質問の番号を把握することなく質問をシャッフルすることが可能になります.

重要: 先行するページや質問で発生する変数を参照することもできます.

さらに、式マネージャーを使用すると、多くの質問プロパティにアクセスできます.

HTMLエディターの問題
HTMLエディターを使用すると、一部の文字がHTML実体に置き換えられます.
 * & → &amp;amp;
 * < → &amp;lt;
 * > → &amp;gt;

HTMLエディターを使用する場合は、次のものを使用する必要があります.
 * & に対しては and
 * < に対してはlt
 * <= に対してはle
 * > に対してはgt
 * >= に対してはge

Qcode変数の命名
Qcodeを構成する方法（およびいくつかのプロパティにアクセスする方法）の質問タイプ別の詳細は次のとおりです. 一般に、Qcodeは次のように構成されます.

QuestionCode. '_' . SubQuestionID. '_' . ScaleId

コメントおよびその他の質問コードは、それぞれQuestionCode_commentとQuestionCode_otherです.

予約変数 this、self、that
回答されたサブ質問の数を数えたり、スコアを合計するなど、質問の全体を評価したい場合がよくあります. また、質問の特定の行や列（行や列の合計を取得してデータベースに格納するなど）を処理したい場合もあります. 以下の予約変数により、そのプロセスを簡単に実現できます.

'this'変数は、"完全な質問の検証式"と"サブ質問の検証式"の高度な質問オプション内で排他的に使用されます. 該当の質問内の各セルの変数名に展開されます. したがって、各エントリが3より大きいかどうかを確認する場合は、"サブ質問の検証式"を(this > 3)に設定します.

'self'と 'that'変数はより強力で、式を処理する前に展開されるマクロとして機能します. 構文は次のとおりです.
 * self
 * self.suffix
 * self.sub-selector
 * self.sub-selector.suffix

suffixは、通常のqcode接尾辞のいずれかです（例: NAOK、value、shown）.

sub-selectorは次のいずれかです.
 * comments - コメントのサブ質問（例えば、コメント付き複数選択、コメント付きリスト）
 * nocomments - コメントでないサブ質問
 * sq_X - Xは、行または列の識別子. パターンXと一致するサブ質問のみが選択されます. 検索は完全なコード識別子で行われ、sq_Xは、サブ質問nX、X、Xnとマッチし選択されることに注意してください（例えば、sq_1を使用する場合はサブ質問a1、1a、1、11または001が含まれます）. 二元スケール質問タイプのサブ質問コードはQCODE_SQCODE_1、QCODE_SQCODE_1であり、順位付け質問タイプのサブ質問コードはQCODE_1、QCODE_2、....となります.

例:
 * 質問に対して何らかの回答があったか？  {count(self.NAOK)>0}
 * この質問の評価点数は？  {sum(self.value)}

行と列の合計を取得することもできます. 列A-Eと行1-5の数字の配列があるとします.
 * 総合計は？ {sum(self.NAOK)}
 * 列Bの合計は？ {sum(self.sq_B.NAOK)}
 * 行3の合計は？ {sum(self.sq_3.NAOK)}

'that'は'self'に似ていますが、他の質問を参照することができます. 構文は次のとおりです.
 * that.qname
 * that.qname.suffix
 * that.qname.sub-selector
 * that.qname.sub-selector.suffix

qnameは、サブ質問拡張がない質問の名前です. 質問 'q1'を作成したら、それがqnameとなります.

例:
 * 質問q1に対して何らかの回答があったか？ {count(that.q1.NAOK)>0}
 * q2の評価点数は？  {sum(that.q2.NAOK)}
 * q3の総合計は？ {sum(that.q3.NAOK)}
 * q4の列Cの合計は？  {sum(that.q4.sq_C.NAOK)}
 * q4の行2の合計は？ {sum(that.q4.sq_2.NAOK)}

'self'と'that'変数は、出現条件、検証、カスタマイズの式で使用できます.

注意すべき点は、ロジックファイルの表示機能を使用すると、'self'と'that'を展開した値が表示されることです. これにより、生成される実際の式が表示され、その結果、変数が存在することを検証できるようになります. かなり長い式になるかもしれないので、混乱しているように見えるかもしれません. しかし、質問を編集すると、'self'や'that'を使っている元の式が表示されます.

また、（a）式に使用される各変数を明示的に命名する場合、または（b）サブ質問を持たない変数を使用する場合（例：単一回答の質問）、これらの変数を使用しないでください. そのような場合に、変数に'that'をつけてプレフィックスをつけると、予期しない結果が出る危険があります.

NAOKの利用
NAOK --> "Not Applicable"（該当なし、NA）は問題ない（OK）

NAOKは、すべてまたは一部の変数が出現条件を満たさないということです. "Not Applicable"（該当なし、NA）は問題ない（OK）.

式の中に、質問からの変数を導入するとき、この質問（またはサブ質問）が条件によって隠されている場合、式全体を無効にします.

例: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) は、Q1のサブ質問の一つがフィルターされている場合、常に空文字となります. このような質問で、チェックされたサブ質問の数をカウントするには、count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK)とします. サブ質問が隠されている場合、式マネージャーは空文字を返します.

NAOKがない場合、1つの質問または1つのサブ質問が非表示になっている場合、式マネージャーは常に空の文字列を返します（falseを返すのと同じです）.

.shownは常にNAOKの仕組み（非表示の時は空文字）を使っていますが、回答のコードが必要な場合は、質問コードの後に.NAOKを付加するとよいでしょう. それが必要で、内容を理解している場合は別です.

その他の例と情報は、カスケードされた条件の上書きを参照してください.

関数へのアクセス
式マネージャーでは、以下に示すように、数学関数、文字列関数、およびユーザー定義関数が利用できます. これらの関数にはPHPとJavaScriptに同等のものがあるので、サーバ側（PHP）とクライアント側（JavaScript）で同じように動作します. 新しい機能を追加するのは簡単です.

実装済み関数
現在、以下の関数が利用可能です.

計画中・検討中の関数
計画中（または検討中）でまだ実装されていない関数は、以下の通りです. このうちいくつかは別のアンケートツールとの下位互換性のためのものです.

式マネージャーとローカル変数
ページのJavaScriptを適切に構築するため、式マネージャーはページに設定されている変数とJavaScript IDが何であるかを知る必要があります（例: document.getElementById(x)）. また、他のページにどの変数が設定されているかも知る必要があります（これにより、必要なフィールドが存在しているか確認できます）.

カスケードされた条件
いずれかの変数がfalseである場合、式全体はfalseになります. たとえば、次の表では、N/Aは変数の1つがtrueでないことを意味します.

カスケードされた条件の上書き
出現条件を満たした回答の合計を表示したいとします. 式 {sum(q1,q2,q3,...,qN)}を使おうとするでしょう. しかし、これは内部的にLEMif(LEManyNA('q1','q2','q3',...,'qN'),'',sum(LEMval('q1'),LEMval('q2'),LEMval('q3'),...,LEMval('qN')))に変換されます. これにより、値q1〜qNのいずれかが出現条件を満たさない場合、式は常にfalseを返します. この場合、sumはすべての質問が出現して回答されない限り0となります.

この問題を回避するために、各変数には".NAOK"という接尾辞（「Not Applicable」はOK）を追加することができます. このような場合、次のような現象が発生します. 変数q1.NAOKがあるとします.
 * 1) q1はLEManyNA節には追加されません
 * 2) LEMval('q1')は回答が出現条件を満たしているかを確認し、そうでない場合は '' を返します（出現条件を満たさない回答は無視されますが、式全体を無効にしません）.

したがって、合計を求める方法は、次の式となります. sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK)

.NAOK接尾辞を使用することで、いくつかの経路を経た後、共通の経路に収束するアンケートを設計することができます. 例えば、回答者が正常な範囲外となるような回答をしたとします. アンケート作成者は、有効な結果を得られない可能性があることを回答者に警告し、アンケートを継続するかどうかを尋ねることができます. 彼らが「はい」と答えた場合、残りの質問が表示されます. "残りの質問"の条件は、最初に正常な範囲内で回答があったかどうか、または正常な範囲外で回答した場合にのみ出現する質問に「はい」と回答したかどうかをチェックします.

式マネージャーはどのように条件付きカスタマイズを実現するか？
ここでは、カスタマイズ（質問タイプ'expr'は式を意味します）の例を示します.

これらの質問はすべて1つのページ（たとえば同じグループ）に入れることができ、出現条件に合致する質問のみが表示されます. さらに、子供の年齢を入力すると、最後の質問のsum式がページ上で動的に更新されます.

式マネージャーは、各式を名前付き  要素で囲むことでこの機能を提供します. 値が変更されるたびに、その  要素に表示される式を再計算し、再表示します. そのようなカスタマイズされた式が同じページに数十、または数百もあっても、ページは一度の画面更新ですべて再表示されます.

LimeSurvey 1.91と式マネージャー機能の対照表
=構文ハイライト=

式の入力と検証を支援するために、EMでは以下のような構文強調表示機能を提供しています.

構文ハイライトの種類と意味
=参考記事=