Actions

ExpressionScriptの例

From LimeSurvey Manual

This page is a translated version of the page ExpressionScript examples and the translation is 100% complete.
独自の例を追加してこの記事を充実させ、ExpressionScriptを使おうとしているユーザーを支援してください。


構造

この記事の最初の部分では、式の使用方法と式を検索/追加する場所について説明します。 2番目のセクションでは、式の使用例を紹介します。


式のカテゴリー

LimeSurveyは次の目的で式を使います。


出現条件

目的: 質問グループ/質問を非表示にする

出現条件は、質問グループまたは質問を表示するかどうかを制御します。式の結果が "true"(つまり1)の場合、その要素が表示されます。それ以外の場合(式の結果が "false"(つまり0)の場合)、その要素は非表示になります。

種類 表示/非表示 場所 スクリーンショット
質問グループの出現条件 質問グループ 質問グループの作成/編集 -> "出現条件式:"
質問の出現条件 質問 質問の作成/編集 -> "出現条件式:"
サブ質問の出現条件 サブ質問 サブ質問の編集 -> "出現条件式:"


検証

目的: 質問/サブ質問/回答の入力/操作を検証する

検証は、回答者の質問に対する入力や操作が有効かどうかを制御します。式の結果が"true"(すなわち1)である場合、当該の要素および検証メッセージに"good"クラスが適用されます。一方、式の結果が"false"(すなわち0)である場合、当該の要素および検証メッセージに"error"クラスが適用されます。template.cssでこれらのクラスのスタイルを宣言することができます。

種類 検証対象 場所 スクリーンショット
質問の検証 質問 質問の作成/編集 -> "ロジックタブ" -> "質問検証式"
サブ質問の検証 サブ質問 質問の作成/編集 -> "ロジックタブ" -> "サブ質問の検証式"

テキスト出力

目的: (何かをして)テキストを出力する

式を使用してテキストを書き出すことができます。たとえば、何かをテストまたは計算し、テストまたは計算の結果に応じて出力を指定することができます。また、先行する質問のテキスト、回答、質問タイプ等を挿入するために使用することもできます。テキスト出力は、テキストが表示されているあらゆる場所で使用でき、あらゆる種類の結果を返すことができます。

ケース 内容
文言調整 先行する質問への回答で得た性別に応じて"Mr"か"Mrs"を使い分けるなど、テキストを調整します。
計算 "あなたの家計収入はxxxです"のように、数値を計算し出力します。
参照 "あなたの名前はxxxです。何歳ですか。"のように他の要素のテキストを挿入します。


回答を保存する

目的: (何かをして、)(テキストを書き出し)データベースに何かを保存する

式質問タイプを使用して、データベースに何かを保存することができます。式を使って何かを行い、式の質問(テキスト表示に似ています)を表示し、その式の結果をデータベースに格納します。回答テーブルに回答を格納します。結果は統計機能内で使用することもできますが、LimeSurveyエクスポート機能によって提供される形式の1つにインポートすることもできます。

式の例

先行する質問の回答を挿入する

目的 先行する質問の回答を挿入する
タイプ 参照
質問1(質問コード "Q00"):どこに住んでいますか。
質問2 (質問コード "Q01"): そこには何年住んでいますか。
したいこと:質問1の回答を質問2の"そこ"の代わりに使用する。
{QOO}
解説 質問2のQ00フィールドをQ00で得られた回答で置き換える。
手順 質問2を作成/編集する
質問のテキスト欄に"{QOO}には何年住んでいますか。"と入力する。

回答を自動入力するために非表示の質問を使う

問題: Q1とQ2という2つの質問があるとします。 Q1では回答者に年齢を聞きます。Q2では、回答者の年齢により20歳未満、20歳、20歳以上の3つのグループに分類しています。 したがって、Q2は前述の条件に従い、"1", "2", "3"の値を使用します。また、Q2を目に見えないようにしなければなりません(この質問はアンケートには表示されませんが、回答テーブル内の"バックグラウンドプロセス"を介して処理されます)。

式の質問タイプを使用してデータベースに格納するには:

  • まず、数値入力質問としてを質問(コードQ1)を作成します。
  • 次に、式の質問を作成します(コードQ2)。
  • Q2の"表示設定"タブ:
    • "常にこの質問を非表示にする"フィールドを"オン"に設定します。
    • "式"フィールドに式を入力します:
{if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}

プレースホルダーを使って要約ページを作成する

このチュートリアルでは、アンケートの最後にExpressionScriptのプレースホルダーを使ってすべての質問と回答をリストする方法を示します。さらに、回答された質問のみ表示する方法を示します。

この例は、アンケートプレースホルダーのアンケート例からダウンロードできます。


質問タイプはここで使われます。

1. 択一質問 / 単一のテキスト/数値質問

  • リスト(ドロップダウン)
  • リスト(ラジオ)[L]
  • はい/いいえ [Y]
  • 長いフリーテキスト [T]
  • 短いフリーテキスト [S]
  • 数値入力 [N]
  • 式 [*]


2. サブ質問がある質問

  • 複数の短いテキスト[Q]
  • 複数選択[M]
  • 配列[F]
  • 配列(はい/いいえ/わからない)[C]
  • 配列(10点尺度)[B]


3. 尺度が2つある質問

  • 二元スケール配列 [1]


4. XとYの尺度がある質問

  • 配列(数値) [:]


5. マスク質問

  • テキスト表示 [X]


この簡単な例では、次のような単純なリストになります。

- 質問テキスト: 利用者の回答


択一の質問 / 単一のテキスト/数値を入力する質問

これらすべての質問タイプについて、Limesurveyは単一の回答を保存します。

  • リスト(ドロップダウン)
  • リスト(ラジオ)
  • コメント付きのリスト
  • 5点選択
  • はい/いいえ
  • 短いフリーテキスト
  • 長いフリーテキスト
  • 巨大なフリーテキスト
  • 数値入力
  • 日付
  • 性別

質問のコードがq1とすると、質問テキストと回答を次のように参照することができます。

- {q1.question}: {q1.shown}

例:

- 何歳ですか。: 25


その質問に回答したかどうかを確認したい場合は、出力を囲むようにIF文を記述します:

{if(!is_empty(q1),join("- ",q1.question,": ",q1.shown),"")}

これは、次のように"翻訳します": もし、質問q1が空白でなければ、出力されるのは、"- "と質問テキストと": "と回答テキスト(join()関数は要素を連結して新たな文字列にする)とし、空白の場合は、何も出力しません(""は空文字列です)。

Question with subquestions

これらすべての質問タイプに対して、LimeSurveyはサブ質問を使用します。

  • 複数の短いテキスト
  • 複数選択
  • コメント付き複数選択
  • 配列
  • 配列(5点選択)
  • 配列(10点選択)
  • 配列(はい/いいえ/わからない)
  • 配列(増加/同じ/減少)
  • 配列(行列反転)

質問の質問コードがq2で、サブ質問にSQ001、SQ002(LimeSurveyによる自動採番)という番号が付けられていると仮定して、質問テキストと回答を参照することができます。

- {q2_SQ001.question}: {q2_SQ001.shown}

- {q2_SQ002.question}: {q2_SQ002.shown}

複数選択質問については、選択された各オプションについてYを表示するようになりました。

- {q2_SQ001.question}: {q2_SQ001}

- {q2_SQ002.question}: {q2_SQ002}

...

現時点では、サブ質問の質問文を出力することはできません。この機能に関するリクエストを参照してください。


例1 (質問タイプが複数選択の場合)

- あなたは次の自動車ブランドを知っていますか。

-- Mercedes: Y

-- Audi: N

-- Volvo: Y


チェックされた項目だけを出力したい場合は、出力のまわりにIF文を置いて、チェックボックスの値をチェックすることができます。

{ if( q2_SQ001=="Y", join( "- ", q2_SQ001.question, ": ", q2_SQ001.shown ), "" ) }


「Mercedes, Volvo」のように、選択した項目だけのリストを出力したい場合は、listifop関数を使用します。

{ listifop( 'value', '==', 'Y', 'question', ', ', that.q2.sgqa ) }


that.q2はq2のすべてのサブ質問に展開されます。詳しくはself、this、thatを参照してください。


例 2 (質問タイプが配列(10点尺度)の場合)

- 以下の自動車ブランドを「1=ひどい」から「10=とても良い」の間で評価してください。

-- Mercedes: 7

-- Audi: 9

-- Volvo: 9


評価された項目だけを出力したい場合は、出力のまわりにIF文を置いて、現在のサブ質問に答えたかどうかを以下のようにして調べることができます。

{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }


たとえば、「Audi / Volvo」のように、選択された項目のうち、8を超えるもののリストを出力したい場合は、listifop関数を使用します。

{ listifop( 'value', '>', 8, 'question', ' / ', that.q3.sgqa ) }


2つの尺度を持つ質問

これは二元スケールの質問タイプのみに適用されます。


次のコードが使われているとします。

  • 質問コード: q4
  • サブ質問コード: SQ001, SQ002, ...
  • 回答コード尺度1: A1, A2, ...
  • 回答コード尺度2: B1, B2, ...


特定の尺度で特定のサブ質問の結果を参照するには、QuestionCode . '_' . SubQuestionCode . '_' . ScaleIDを使用する必要があります。"ScaleID"は0から、その他は1から始まるので注意してください。
3番目のサブ質問と2番目の尺度の答えを示す例: q4_SQ003_1 - 質問4、サブ質問3、第2の尺度


両方の尺度と最初の2つのサブ質問の結果を出力してみましょう。

- {q4_SQ001_0.question}: {q4_SQ001_0.shown} / {q4_SQ001_1.shown}

- {q4_SQ002_0.question}: {q4_SQ002_0.shown} / {q4_SQ002_1.shown}

サブ質問テキストを出力するには、スケールIDをプレースホルダーに追加する必要があります(テキストは両方のスケールで同じです)。したがって、{q4_SQ001.question}の代わりに{q4_SQ001_0.question}か{q4_SQ001_1.question}を使用する必要があります。

サブ質問の結果を1つ以上回答があるもののみエクスポート/表示する場合は、各サブ質問に対して次の構文を使用します。

{if(count(q4_SQ001_0,q4_SQ001_1)>0,join("- ",q4_SQ001_0.question,": ",q4_SQ001_0.shown," / ",q4_SQ001_1.shown),"")}

二次元の尺度を持つ質問

これは、すべての行列型の質問に適用され、(前に示した表示した行だけでなく)すべてのセルに答えることができます。

  • 配列(テキスト)
  • 配列(数値)


コードの例:

  • 質問コード: q5
  • サブ質問コード: SQ001, SQ002, ...
  • 回答コード: A1, A2, ...

特定の列から特定のサブ質問の結果を参照するには、QuestionCode . '_' . SubQuestionCode . '_' . AnswerCodeを使用する必要があります。3番目のサブ質問と2番目の列の回答を参照する例: q5_SQ003_A2

両方の尺度と最初の2つのサブ質問の1から3列目の結果を出力しましょう。

- {q5_SQ001_A1.question}: {q5_SQ001_A1.shown} | {q5_SQ001_A2.shown} | {q5_SQ001_A3.shown}

- {q5_SQ002_A1.question}: {q5_SQ002_A1.shown} | {q5_SQ002_A2.shown} | {q5_SQ002_A3.shown}


これらの質問タイプでは、各セル(X軸とY軸の組み合わせ)が1つの回答オプションに等しいため、各セルに対して既存のデータのテストが必要です。例:

{if(!is_empty(q5_SQ001_A1),join("- ",q5_SQ001_A1.question,": ",q5_SQ001_A1.shown),"")}


サブ質問テキストを出力するには、回答コードをプレースホルダーに追加する必要があります(テキストはすべての回答で同じです)。したがって、{q5_SQ001.question}の代わりに{q5_SQ001_A1.question}か{q5_SQ001_A2.question}を使用する必要があります。

先行する質問の回答が空白の場合に質問を非表示にする

目的 先行する質問の回答が空白の場合に質問を非表示にする
タイプ 質問の出現条件
質問1:質問コード"name"、質問文:"名前は何ですか。"
質問2:質問文:"{name}さん、何歳ですか。"
したいこと:質問1の回答欄が空白の場合、質問2を非表示にする。
!is_empty(name)
解説 is_empty()は、変数が空白かどうかを判定します。"!"は判定結果を反転させます。これにより、変数が空白でなければ、式はtrueになり、質問が表示されます。
手順 質問2を作成/編集する。
"出現条件の式"に"!is_empty(name)"を入力する。
サンプルファイル Hide_question_if_empty_question_group.zip


先行する質問の回答が「はい」または「いいえ」の場合、質問グループを非表示にする

目的 先行する質問の回答が「はい」または「いいえ」の場合、質問グループを非表示にする
タイプ 質問グループの出現条件
1ページ目、質問グループ1、質問1:質問コード"PET"、質問文"ペットは飼っていますか。" -はい -いいえ
2ページ目、質問グループ2、表題"飼っているペットについて"
したいこと:質問1の回答によって質問グループ2を表示するかを決める。
PET == "Y"
解説 PETは、回答をチェックする対象となる質問のコードです。接尾辞を使用しない場合は、EMは"Qcode.code"を使用します。PETの質問で得られた回答コードが"Y"かどうかをチェックします。回答者が"はい"と回答したら、式はtrueとなり、質問グループ"飼っているペットについて"が表示されます。
手順 質問グループ2を作成/編集する。
"出現条件の式"に"PET == "Y""を入力する。
サンプルファイル Hide_question group_if_answer_from_previous_question_is_Yes_or_No.zip


複数回答入力質問フィールドの値を表示する

目的 複数回答入力質問フィールドの値を表示する
タイプ 出現条件
質問1: 質問コード "AskChildAge"、質問文 "子供は何歳ですか"。サブ質問コード -Child1 -Child2 -Child3 - ChildXXX
質問2: 質問コード "ReportChildAge"、質問文 "1人目の子供について: - CHILD1はAGE1歳です。"
{AskChildAge_Child1.question}、{AskChildAge_Child1.value}
解説 後続の質問でサブ質問の値を使用したいときは、次のような式でサブ質問の値にアクセスできます: QcodeQuestion_QcodeSubquestion.value
手順 2番目の質問を作成/編集する
次のテキストを「説明」に入力する: "1人目の子供について: - {AskChildAge_Child1.question}は{AskChildAge_Child1.value}歳です。"
サンプルファイル Display_value_of_a_multiple_answer_input_question_field.zip

"配列(数値)チェックボックス質問"で行ごとにチェックされた数を検証する

目的 行ごとにチェックされた数を検証する
タイプ 検証
質問タイプ "数値配列(チェックボックス)"
sum(...)
解説 (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X)は、行AでX個以上のチェックボックスがチェックされたかを判定します。
3行(A、B、C)すべてをチェックした場合は、"&&"を使って式を連結します。:
(sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X)
&& (sum(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= X)
&& (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= X)
手順 質問タイプ "数値配列(チェックボックス)"を作成/編集する
質問のアドバンス設定の"質問検証式"に上記の式を入力する(変数名は適宜変更すること)
サンプルファイル Validate number of boxes ticker per row for an Array (Numbers) Checkbox.lss

2つの日付の差を計算する

目的 2つの日付の差を計算する
タイプ 出現条件/質問タイプ:式/検証
質問1(date/time、コード: DOB): 誕生日はいつですか。
質問2(date/time、コード: datetoday): 今日の日付は何ですか。
質問3(テキスト表示): 生まれてからXXXX日目です。
したいこと: 質問1と質問2の日付の差を計算し表示する。
{(strtotime(datetoday)-strtotime(DOB))/60/60/24}
解説 strtotimeは、1970年1月1日から指定された日付までの秒数を計算します。上記の式は、指定された2つの日付の秒数の差を計算しています。"/60/60/24"の部分で、秒数を日数に変換しています。
"datetoday"を回答させる代わりに、strtotime('now')、または単にtime()によって、1970年1月から現在(アンケート実施時点)までの秒数を直接得ることができます。{(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25}という式によってその人の年齢を簡単に計算することができます。いずれの場合においても、strtotime()関数を正しく機能させるためには、適切な形式で日付を入力する必要があります。
手順 2つの日付型質問(誕生日と今日の日付)とテキスト表示型質問を作成する
テキスト表示型質問に次のように入力する: "{datetoday}現在で、生まれてから{(strtotime(today)-strtotime(dob))/60/60/24}日目です。"

注意: 関数strtotimeは、多くの日付形式に対応していますが、問題がある場合は、日付形式をmm/dd/yyyy、yyyy-mm-dd、dd.mm.yyyyのいずれかにします"
サンプルファイル Date_difference.zip

ExpressionScriptを評価に使用する

配列質問タイプと評価でExpressionScriptをどのように使うかを示す別の例です。</ br>

配列の質問が2つあり、計算結果をデータベースに保存したいとします。実際は単純なものですが、配列を作成してテストし、ダミー回答を送信して動作するか、完了ページに結果が表示されるかを確認する必要があります。


実装方法の詳細:

  • 式タイプの質問を追加する
  • 次の行を追加する(Q1、Q2が配列質問のコードとする):
    • {sum(Q1_SQ001.value,Q2_SQ001.value)}

SQ001は任意のサブ質問の既定のコードです。サブ質問コードを変更した場合は、上記の式を適宜調整してください。


配列でem_validation_qを使用する

質問の検証式を使用して、任意の条件で配列を制御できます。


実装方法の詳細:

  • 1つ目の配列 : 択一の配列
    • 質問コードはARRAY
    • サブ質問コードは、SQ01、SQ02、SQ03、SQ04
    • 全体の質問検証式を次のように更新
      !is_empty(ARRAY_SQ01) and !is_empty(ARRAY_SQ03) 
  • 2つ目の配列 : テキスト配列
    • 質問コードはARRAYTEXT
    • Y軸のサブ質問コードはSY01、SY02、SY03、SY04
    • 全体の質問検証式を次のように更新
      count(self.sq_SY01 >= 1) and count(self.sq_SY03 >= 3)