Actions

ExpressionScript examples/zh

From LimeSurvey Manual

Revision as of 22:00, 4 April 2019 by FuzzyBot (talk | contribs) (Updating to match new version of source page)


請通過添加自己的示例幫助擴展這篇文章。這將有助於其他人開始使用表達式管理器。


結構

本文的第一部分將介紹可以使用哪些表達式以及在何處查找/添加表達式。第二部分提供了有關如何使用表達式的示例。


表達式的類別

LimeSurvey使用表達式用於以下目的:


相關性

目的:隱藏問題組/問題

相關性控制是顯示還是隱藏問題組或問題。如果表達式的結果為「真」(即1),則將顯示該元素。否則(如果表達式的結果為「假」(即0)),則元素將被隱藏。

類型 顯示/隱藏 在哪裡找 屏幕截圖
問題組相關性 問題組 創建/編輯問題組 - > 「相關方程:」
問題相關性 問題 創建/編輯問題 - >「相關方程:」
子問題相關性 子問題 編輯子問題 - >「相關方程:」


驗證

目的:驗證問題/子問題/答案的輸入/操作

驗證控制受訪者對問題或行動的輸入是否有效。如果表達式的結果為「true」(即1),則「good」類將應用於元素和驗證消息。否則,如果表達式的結果是「假」(即0)),則「錯誤」類將被用於元素和驗證消息。您可以在template.css中為這些類聲明樣式。

類型 驗證 在哪裡找 屏幕截圖
問題驗證 問題 創建/編輯問題 - >「邏輯選項卡」 - >「問題驗證方程式」
子問題驗證 子問題 創建/編輯問題 - >「邏輯選項卡」 - >「子問題驗證方程「 30px]]

文本輸出

目的:(做點什麼)並寫一些文本

表達式可用於寫出一些文本。例如,你可以測試或計算某些內容,並根據測試或計算的結果指定輸出。它還可用於插入使用表達式之前使用的問題的問題文本、答案、問題類型等。文本輸出可以在顯示文本的任何地方使用,並且可以返回各種結果。

用例 說明
微剪裁 調整文字,例如根據之前提出的性別問題寫「先生」或「女士」
計算 計算一個值並將其寫出來,例如「你的家庭收入是xxx」
參考 插入元素中的文本,例如, 「你的名字是xxx。你多大了?」


答案存儲

目的:(做點什麼)(寫一些文本)並在數據庫中存儲一些東西

方程式問題類型 可用於在數據庫中存儲內容。你可以使用方程式執行某些操作,顯示方程式問題(類似於文本顯示)並將表達式的結果存儲在數據庫中。它將答案存儲在響應表中。然後,結果可以在統計功能中使用,也可以導入到LimeSurvey導出功能提供的格式之一。

表達式的例子

插入上一個問題的答案

目的 插入上一個問題的答案
類型 參考
示例 問題一(問題代碼「 Q00「):你住在哪個城市?
問題二(問題代碼「Q01」)你在CITY住多久了?
要做的:第二個問題應該使用問題1的答案而不是「CITY」。
表達式 {QOO}
說明 Q00中提供的答案取代了第二個問題的Q00字段
步驟 創建/編輯問題二
插入「你在{QOO}生活多久了?」進入問題文本字段

使用隱藏的方程式問題自動填充答案

問題: 想象一下你有兩個問題Q1和Q2。 Q1詢問受訪者的年齡。 Q2將受訪者分為三組:年齡低於20歲,年齡為20歲,年齡大於20。 因此,Q2應使用值「1」,「2」,「3」,這對應於以上條件。此外,我們不應忘記使Q2不可見(問題不會顯示在調查中,但值將通過響應表中的「後台進程」)。

使用公式問題類型填寫數據庫:

  • 首先,創建一個問題,將代碼Q1作為數字輸入問題。
  • 然後用代碼Q2創建另一個問題作為方程問題。
  • 在Q2的「顯示設置」選項卡章節中:
    • 將「始終隱藏此問題」字段設置為「開」
    • 在「公式」字段中輸入表達式:
Q2=if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}

使用占位符創建摘要頁面

本教程演示了如何在調查結束時創建概述,通過Expression Manager placeholders列出所有問題和答案。 它還說明了如何限制這樣的概述僅回答問題。

我們的示例可以從這裡下載:調查占位符調查示例


這裡使用的問題類型:

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),"")}

這個「翻譯」為:IF 代碼q1的問題不為空,輸出「 - 」 AND 問題文本 AND 「:」 AND 答案文本(join()函數將元素作為新字符串連接); ELSE:不輸出任何內容(「 「表示空字符串)。

子問題

對於所有這些問題類型,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}

...

請注意,目前無法輸出帶子問題問題的文本,請參閱this feature request


示例1(假設問題類型是多選題)

- 你知道這些汽車品牌嗎?

-- Mercedes: Y

-- Audi: N

-- Volvo: Y


-- Mercedes: Y

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


-- Audi: N

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


如果只想輸出選中的項目,可以在輸出周圍放置一個IF語句並檢查複選框值:


示例2(假設問題類型是陣列(10點選擇))

-- Audi: 9

如果您只想輸出評級項目,可以在輸出周圍放置一個IF語句,並使用以下方法檢查當前子問題是否得到了解答:

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

有兩個尺度的問題


這僅適用於雙尺度問題類型。

假設正在使用以下代碼:

  • 問題代碼:q4
  • 子問題代碼:SQ001,SQ002,......
  • 答案代碼比值1:A1,A2,......
  • 答案代碼比值2:B1,B2,......


要在某個比例上引用某個子問題的結果,你需要使用QuestionCode . '_' . SubQuestionCode . '_' . ScaleID。 請注意,「ScaleID」對於第一個刻度為0,對於另一個刻度為1!
參考第三個子問題和第二個比例答案的示例:q4_SQ003_1 - Question 4, subquestion 3, second scale。

讓我們輸出兩個比例和前兩個子問題的結果:


Question with two scales

This applies to the dual scale question type only.


Let's assume that the following codes are being used:

  • Question code: q4
  • Subquestion codes: SQ001, SQ002, ...
  • Answer codes scale 1: A1, A2, ...
  • Answer codes scale 2: B1, B2, ...


To refer to the result of a certain subquestion on a certain scale, you need to use QuestionCode . '_' . SubQuestionCode . '_' . ScaleID. Note that "ScaleID" is 0 for the first scale and 1 for the other!
Example for referring to the answer of the third subquestion and second scale: q4_SQ003_1 - Question 4, subquestion 3, second scale.


Let's output the results for both scales and the first two subquestions:

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

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

To output the subquestion text, you need to add the scale ID to the placeholder (though the texts are the same for both scales). So instead of {q4_SQ001.question} we have to use {q4_SQ001_0.question} or {q4_SQ001_1.question}.

如果要僅使用至少一個答案導出/顯示子問題的結果,請對每個子問題使用以下語法:

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

X和Y尺度的問題

這適用於所有矩陣問題,它們允許每個單元格的答案(不僅僅是前面所示的每一行):

  • 陣列文本
  • 陣列編號


使用的假設代碼:

  • 問題代碼:q5
  • 子代碼:SQ001,SQ002,...
  • 答案代碼:A1,A2,...

要引用某列的某個子查詢的結果,您需要使用QuestionCode . '_' . SubQuestionCode . '_' . AnswerCode。參考第三個子問題和第二列的答案的示例:q5_SQ003_A2。

讓我們輸出前兩個子項的第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軸的組合)等於一個答案選項,因此需要對每個單元格進行現有數據的測試。例:

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


要輸出子問題文本,你需要將答案代碼添加到占位符(儘管所有答案選項的文本都相同)。因此,我們必須使用{q5_SQ001_A1.question}或{q5_SQ001_A2.question}而不是{q5_SQ001.question}。

隱藏問題,如果上一個問題的答案是空的

目的 隱藏問題,如果上一個問題的回答是空的
類型 問題相關性
示例 問題一:問題代碼「name」,問題文本「你叫什麼名字?」
問題二:問題文字「{name},你多大了?」
要做:如果問題1的文本字段為空,則隱藏問題二
表達式 !is_empty(name)
描述 is_empty()確定是否為變量被認為是空的。 「!」否定結果。因此,如果變量不為空,則表達式將為真,並顯示問題
步驟 創建/編輯問題二
將「!is_empty(name)」插入「相關方程式:」
示例文件 Hide_question_if_empty_question_group.zip


如果上一個問題的回答是「是」或「否」,則隱藏問題組

目的 隱藏問題組如果上一個問題的回答是「是」或「否」
類型 問題組相關性
示例 第一頁,問題組一,問題一:問題代碼「PET」,問題文本「你有寵物嗎?」 - 是 - 不
第二頁,問題第二組:題目「關於你的寵物」
要做的事:顯示/隱藏問題組2如果問題1的回答是是/否
表達式 PET ==「Y」
說明 PET是您要檢查答案的問題的問題代碼。如果你不使用後綴EM將使用「Qcode.code」。因此,您將PET問題的答案代碼與值「Y」進行比較。如果參與者回答「是」,則表達式為真,並且將顯示問題組「關於您的寵物」。
步驟 創建/編輯問題組2
將「PET ==」Y「」插入「相關等式:」
示例文件 Hide_question group_if_answer_from_previous_question_is_Yes_or_No.zip


顯示多個答案輸入問題字段的值

目的 多個答案輸入問題字段的顯示值
類型 參考
示例 問題一:問題代碼「AskChildAge」,問題文字「你的孩子多大了?」。子代碼-Child1 -Child2 -Child3 - ChildXXX
問題二:問題代碼「ReportChildAge」問題文本「關於你的第一個孩子: - CHILD1是AGE1。」
表達式 {AskChildAge_Child1.question}, {AskChildAge_Child1.value}
說明 你想在以下問題中使用子問題的值。你可以使用以下表達式訪問子問題值:QcodeQuestion_QcodeSubquestion.value
步驟 創建/編輯第二個問題
在說明中插入此文字:「關於你的第一個孩子:- {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個複選框。
如果要檢查所有三行(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

計算兩個日期之間的差異

目的 計算兩個日期之間的差異
類型 相關性/方程式問題類型/驗證
示例 問題一(日期/時間,代碼:DOB):你的出生日期是什麼時候?
問題二(日期/時間,代碼:datetoday):今天的日期是什麼時候?
問題三(樣板):你已經出生XXXX天。
要做的事情:計算並顯示問題1中給出的日期和問題2之間的天數。
表達式 {(strtotime(datetoday)-strtotime(DOB))/60/60/24}
說明 strtotime計算1970年1月1日到給定日期之間的秒數。上面的表達式計算兩個給定日期之間的秒數。術語「/60/60/24」只計算從秒數開始的天數。
您也可以使用strtotime('now')或簡單的time()來直接返回從1970年1月到現在(即調查的時間)的秒數,而不是要求「datetoday」。因此,你可以用表達式{(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25}快速計算一個人年齡。在任何一種情況下,輸入日期至關重要以適當的格式,否則strtotime()函數將無法正常工作。
步驟 創建兩個日期問題(出生日期和今天的日期)和樣板問題。
在樣板問題插頁的問題文本中:「到{datetoday}為止,你已經出生 {(strtotime(today)-strtotime(dob))/60/60/24}天了。」

請注意:函數strtotime可以使用多種但不是所有日期格式。如果遇到問題,請將調查的日期格式設置為mm/dd/yyyy或yyyy-mm-dd或dd.mm.yyyy「
示例文件 Date_difference.zip

使用表達式管理器進行評估

下面是另一個關於如何將表達式管理器與 陣列類型問題和評估結合使用的示例: </ br>

假設你有2個數組問題,並且希望將計算數據的結果保存到數據庫中。它實際上很簡單,你需要創建並測試數組並提交虛擬響應以查看它是否有效並在完成的頁面中提供結果。


實現細節:

  • 添加類型方程的問題
  • 添加以下行,假設Q1是您的數組問題代碼,而Q2是第二個:
    • {sum(Q1_SQ001.value,Q2_SQ001.value)}

請注意,SQ001是任何子問題的默認代碼。如果更改了子代碼,請相應調整上面的等式。


在數組中使用em_validation_q

你可以使用問題驗證方程來控制任何條件的陣列。


實現細節:

  • 為第一個數組:單選數組
    • 問題代碼是ARRAY
    • 子問題代碼是SQ01,SQ02,SQ03和SQ04
    • 更新整個問題驗證方程並放入
      !is_empty(ARRAY_SQ01)和!is_empty(ARRAY_SQ03) 
  • 為第二個數組:文本數組
    • 問題代碼是ARRAYTEXT
    • Y軸代碼的子問題是SY01,SY02,SY03和SY04
    • 更新整個問題驗證方程和放置
      count(self.sq_SY01 >= 1)和count(self.sq_SY03 >= 3)