ExpressionScript 範例問卷
From LimeSurvey Manual
簡介
學習使用 ExpressionScript 最好的方法,就是實際操作可運作的範例,並依照您的需求加以修改。
以下提供一組範例問卷,用以示範(及測試)如何運用 EM 來強化您的問卷。這些問卷可在發行套件的 /docs/demosurveys 資料夾中找到。
相關性、量身訂製與方程式
概述
以下範例會計算每位受訪者的 BMI(身體質量指數)。請參閱下方此範例所示範的功能。
所示範的 EM 功能
- 相關性 - 支援強大的條件邏輯;
- 管道傳遞/量身訂製 - 可將答案和問題中繼資料進行管道傳遞或量身訂製;
- 動態量身訂製 - 請注意,當您回答問題時,頁面上的報告會隨之變更。
- 微量身訂製 - 使用 if() 陳述式,在句子和報告中進行條件式量身訂製
- 方程式 - 新的問題類型,可讓您進行計算並將結果儲存於資料庫中,即使該計算是隱藏的
- 條件式驗證 - 驗證條件(例如允許的最小值)可以是有條件的,例如根據方程式而定。
螢幕截圖
此範例會計算身體質量指數,依據您的體重和身高來判斷您屬於體重過輕、正常、過重或肥胖。請注意,一開始您只會看到四個必填問題:

輸入您的資料後(您可以選擇使用公制或非公制單位),就會看到一份量身訂製的報告,彙整您所輸入的內容,並告知您的體重狀態:

以下是另一個範例,使用非公制單位來示範結果如何動態變化:

在內部層級有隱藏的方程式類型問題,會(在需要時)將資料轉換為公制,並將公制的身高、體重、BMI 和體重狀態儲存於資料庫中,無需自訂 JavaScript。
在下一組範例中,您可以看到如何在量身訂製的報告中使用數學函數及其他函數。這是您輸入任何資料之前頁面的樣子。其中包含條件邏輯,當未輸入資料(或輸入非數字資料)時會顯示空白儲存格,而不是顯示「NaN」或「Divide by Zero」。

輸入數字時,頁面上的報告會變更,以顯示正在執行的計算及其結果。

此範例問卷中還有許多其他範例。例如,下方螢幕截圖顯示了填寫「動態相關性」頁面的數十種方式之一。如說明文字所述,請嘗試不同的年齡,尤其是不合邏輯的回答組合,看看底部產生的有趣訊息。另請注意,如果您表示有一個以上的孩子,訊息會顯示「I hope you enjoy playing with your X children」,而不是「I hope you enjoy playing with your child」。這說明了您可以輕鬆地對句子進行微量身訂製,使其符合受訪者的性別和/或數量。您甚至可以根據性別和數量輕鬆地變化動詞和名詞。

下載
若要取得此範例問卷,請點擊以下連結:LS3_em_tailoring.zip。
人口普查範例
概述
這是一個人口普查範例,詢問您的家戶中有多少人。
此範例示範群組層級的相關性如何讓問題「迴圈」更容易實現。建立第 1 人的群組後,我將該群組匯出。由於我使用了 p1_name 這類 qcode 變數名稱,而非 SGQA 代碼,因此可以使用文字編輯器快速編輯並多次重新匯入該群組(例如,每個重複群組約需 10 秒即可完成編輯與重新匯入,確保所有變數都具有唯一的變數名稱,且群組層級的邏輯正確無誤)。
您也可以使用複製問題功能,但速度不如上述建議的方式快。
這也示範了如何在問卷真正完成之前(例如,所有必要的群組都已完成時),避免顯示「完成」訊息。
展示的 EM 功能
- 群組層級相關性 - 後續群組(人員 1-5)僅會顯示至所指定的同住人數為止;
- 量身訂製(Tailoring) - 最終報告會彙整每位同住者的人口統計資料;
- 漸進式問題顯示 - 無論是逐組或一次全部顯示模式,後續問題都會在前面的問題回答後才顯示。
螢幕截圖
問卷會產生一份量身訂製的報告,顯示所指定同住人數的人口統計資料:

如果切換為逐題顯示模式,您會看到索引會針對問題進行量身訂製。由於使用者指出此人是女性,因此會詢問「她的名字是什麼」。而因為我們回答了「Mary」,下一個問題則會顯示「Mary 幾歲」?

下載
若要下載此問卷範例,請點擊這裡:LS3_group_relevance.zip。
串聯陣列篩選
概述
此問卷係根據 Joy Lane Research, LLC 所提供的問卷設計而成。
螢幕截圖
請注意以下幾點:
- Q02 僅顯示在 Q01 中勾選的產品(透過使用 array_filter)
- Q02 也會顯示「Another product」,即在 Q01 的「Other electronic」欄位中輸入的文字
- Q04 僅顯示 Q02 中已勾選的產品(因此陣列篩選會串聯)
- Q05 僅顯示 Q02 中未勾選的產品(使用串聯的 array_filter_exclude)


下載
請點擊以下連結下載上述範例:LS2_cascading_array_filter 問卷範例。
使用所有題型與屬性進行嵌入/量身訂製(Piping/Tailoring)
概述
如果您對變數的命名方式(SGQA 與 Qcode)感到困惑,您並不孤單。雖然主要文件說明了如何組成 Qcode 變數名稱,但沒有什麼比實際範例更直觀。此問卷展示了如何使用 ExpressionScript 存取問題屬性與回答。
內容
- 每種題型的範例
- 包含所有可使用「其它」的題型,讓您了解這會如何影響變數命名
- 所有接受預設值之題型的預設值
- 量身訂製(Tailoring)- 頁面內與頁面外的報告,顯示全部 16 種可用的 EM 點記法後綴。
- 這些報告會顯示目前已輸入的所有資料(讓您了解如何為使用者產生自己的可列印報告,以取代列印答案畫面)
- 所有變數皆採用正確的 Qcode 與 SGQA 命名
螢幕截圖
這是一份非常龐大的問卷,因此我們選擇不附上螢幕截圖。請您直接下載並實際操作看看。
下載
請點擊以下連結下載此問卷:LS3_EM_question_attributes.lss
傳統驗證的全新詮釋
概述
本範例展示所有使用運算式的驗證類型,以及它們如何影響各個支援驗證的問題類型。在許多情況下,驗證提示一開始是隱藏的,只有在問題未通過驗證條件時才會顯示(當問題通過驗證條件後,提示也會隨之消失)。
所展示的驗證類型
- min_num_value_n - 答案的最小值
- max_num_value_n - 答案的最大值
- min_answers - 所需答案的最少數量
- max_answers - 允許答案的最大數量
- multiflexible_min - 答案允許的最小值(適用於多重彈性數字問題類型)
- multiflexible_max - 答案允許的最大值(適用於多重彈性數字問題類型)
- min_num_value - 問題所有答案的總和所允許的最小值
- max_num_value - 問題所有答案的總和所允許的最大值
- equals_num_value - 問題所有答案的總和必須等於此值
- validation - 這是問題的正規表示式驗證,可套用於個別儲存格
螢幕截圖
透過新的 CSS 樣式,每種驗證類型都會顯示獨立的提示。若已顯示,可透過 hide_tip 選項將其隱藏。預設選項是在問題未通過驗證條件時以紅色字體顯示,通過時則以綠色顯示:

使用者無法送出含有驗證錯誤的頁面。若輸入了錯誤的資訊,系統會立即向使用者發出警告:

驗證可以套用於陣列中的個別儲存格,例如在此範例中,正規表示式驗證可確保每個輸入項目都是格式正確的美國電話號碼(包含區碼)。

下載
若要下載上述範例,請按一下以下連結:LS3_Validation_tests.zip。
驗證方程式
概述
有時您需要無法透過傳統最小值/最大值條件達成的自訂驗證。為此,您需要使用 em_validation_q 和 em_validation_sq 選項,它們可讓您分別在問題和子問題層級建立複雜的驗證方程式。
所展示的 EM 功能
- em_validation_q - 這是用來判斷整個問題是否有效的方程式
- em_validation_q_tip - 這是當問題未通過 em_validation_q 條件時要顯示的訊息
- em_validation_sq - 這是用來判斷每個子問題(陣列儲存格)是否有效的方程式
- em_validation_sq_tip - 這是當任一子問題無效時要顯示的訊息。
一般而言,使用 em_validation_sq 時,只要有任何儲存格無效,該儲存格的背景顏色就會變成紅色,以表示發生錯誤。
螢幕截圖

此問題透過套用以下驗證方程式,確保您依遞減順序輸入子女的年齡:
q1_sq1 >= q1_sq2 && q1_sq2 >= q1_sq3 && q1_sq3 >= q1_sq4

在下列範例中,驗證透過套用以下驗證方程式,確保任一列最多只回答 3 個問題:
(sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= 3) && (sum(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= 3) && (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= 3)
您也可以按如下方式撰寫,LimeSurvey 會在執行時自動將其轉換為上述運算式。
(sum(self.sq_A) <= 3) && (sum(self.sq_B) <= 3) && (sum(self.sq_C) <= 3)

下載
若要下載上述範例中使用的問卷範例,請按一下以下連結:ls2_test_em_sq_validation.lss。
子問題相關性
概述
此範例展示 array_filter 與驗證條件如何互相影響。對於套用於總和的驗證,只會計算相關(可見)的值。
示範的 EM 功能
此範例也展示了核心問題中已回答問題數量的動態報告。
螢幕截圖
動態變更可見列數會改變總和。將子問題標記為不相關並不會清除其值;不過,若該子問題不相關,其值不會計入任何公式。


請注意,當我們在第一個問題「下方應顯示哪些列」中勾選「第五個子問題」時會發生什麼事。請注意,第二個問題「輸入一些數字」的總和現在是 5。即使該問題的子問題 5 仍然保有值 14(例如,取消勾選第五個子問題後,您會再次看到值 14),但由於該值目前不相關,因此不會計入總和。所有不相關的資料會在送出時被清除(在資料庫中設為 NULL),但仍會保留在頁面上,以便使用者想要或需要改變答案時使用。

下載
若要下載我們的範例,請按一下此處:ls2_subquestion_relevance.lss。
使用逗號作為小數點分隔符號
概述
ExpressionScript 可確保數字欄位中只能輸入有效的數字。如果您輸入無效的數字,系統會警告您有錯誤(例如,在 fruity 佈景主題中,整個問題會變成紅色)。
請注意,數值在資料庫中一律會轉換為使用句點作為小數點分隔符號,這樣統計分析才能正常運作。
若要變更小數點分隔符號,請前往位於設定索引標籤下的文字元素選項,並找到小數點記號功能。
使用小數點分隔符號的問題類型
- 數字輸入 [N]
- 多個數字輸入 [K]
- 陣列(數字) [:]
- 陣列 (文字) [;],使用 numbers_only 屬性時
- 列表(單選) [L],使用 other_numbers_only 屬性時
- 簡短的自由文本 [S],使用 numbers_only 屬性時
- 多重簡短文本 [Q],使用 numbers_only 屬性時
- 多項選擇 [M],使用 other_numbers_only 屬性時
- 帶評論的複選題 [P],使用 other_numbers_only 屬性時
螢幕截圖
您可以在下方的螢幕截圖中看到,逗號可用作小數點分隔符號。

下載
若要下載上述範例,請按一下以下連結:ls2_comma_as_radix_separator.lss。
隨機分組
概述
此問卷示範如何使用 random_group 屬性。
如果使用此屬性,每次開始問卷時,問題順序都會隨機排列。不過,問卷一旦開始,即使切換語言,隨機順序也會保持不變。
螢幕截圖
讓我們一起來看以下範例。頁面上的第一個隨機問題會是 Q1、Q4 或 Q7;頁面上的第二個隨機問題則會是 Q2、Q5 或 Q8。

以下是我第一次測試此問卷時產生的隨機順序。

第二次測試問卷時,產生了不同的隨機順序。

但是,當我切換為法文(未重新開始問卷)時,隨機順序保持不變。

下載
若要下載上述範例,請點擊以下連結:Randomization_Group_Test.lss
每個題組隨機詢問一個問題
概述
此問卷示範如何設定問卷,使每個題組隨機顯示一個問題。問卷中有 5 個題組,每組 6 個問題。一開始,在題組 0 中,會填入五個名為 ask1-ask5 的隱藏 Equation 問題。每個問題的問題文字欄位中都有 {floor(rand(1,6.9999))},這表示變數 ask1-ask5 各自的值會介於 1 到 6 之間。接著,題組中的每個問題都有類似 "ask1==N" 的相關性等式,其中 N 是該問題在題組中的順序(因此題組 1 的第三個問題,其相關性等式為 "ask1==3")。
此問卷在整份問卷同頁、按題組分頁以及逐題顯示模式下都同樣適用。由於隨機設定是在第一個題組中完成,而該題組實際上是隱藏的(因為所有 ask1-ask5 問題都是隱藏的),所以對同一位受訪者而言隨機結果保持不變;但每位不同的受訪者都會有不同的隨機結果。
示範的功能
- Equation 題型
- 隨機函數
- 條件式 (if) 函數
螢幕截圖
這是 Group0,它使用 Equation 題型為每個題組選取 1 到 6 的隨機值(最後一個題組除外,它只有 4 個問題)。請注意,"if()" 函數會先檢查 ask1 是否已設定值,如果已設定,就使用該值;如果尚未設定,則使用隨機值來設定 ask1 的值。

此題組顯示 Group0 中的變數 (ask4) 如何用來控制第四個題組中顯示哪一個問題。

下載
若要下載上述問卷範例,請點擊此處:題組內隨機問題的問卷範例。
在題組中隨機詢問指定數量的問題(問題的子集)
概觀
此問卷示範如何在群組中隨機顯示部分問題。例如,在群組內的 10 個問題中隨機顯示 5 個問題。
此問卷包含一個含有 10 個問題的群組。所有問題都被指定相同的隨機的群組名稱,因此頁面載入時會以隨機順序顯示。每個問題都設有一個相關性等式,條件是群組中所有其他問題的「relevanceStatus」總和小於您想要顯示的問題數量。由於 relevanceStatus 是在問題呈現時指定的,因此這實際上是在計算前面已顯示的問題數量。
因此,在 10 個問題中顯示 5 個的範例中,Q1 的等式如下:
sum(Q2.relevanceStatus, Q3.relevanceStatus, Q4.relevanceStatus, Q5.relevanceStatus, Q6.relevanceStatus, Q7.relevanceStatus, Q8.relevanceStatus, Q9.relevanceStatus, Q10.relevanceStatus) LT 5
Q2 的等式如下:
sum(Q1.relevanceStatus, Q3.relevanceStatus, Q4.relevanceStatus, Q5.relevanceStatus, Q6.relevanceStatus, Q7.relevanceStatus, Q8.relevanceStatus, Q9.relevanceStatus, Q10.relevanceStatus) LT 5
以此類推……
示範的功能
下載
若要下載上述範例,請點擊以下連結:10 題隨機顯示 5 題問卷範例。
評分使用者輸入的產品清單
概觀
以下範例示範如何請使用者列出他們感興趣的一組產品,然後讓他們對這些產品進行評分。
示範的 ES 功能
- 量身訂製答案 - 在對產品評分時,標籤來自前一個多選問題的評論欄位
- 量身訂製量表 - 許多進階問題選項(例如量表標題)也可以量身訂製。
螢幕截圖
此圖顯示,由於僅選取了產品 1、3 和 5,因此只會顯示這 3 項(使用 array_filter 屬性)。此外,第二個問題中的列標籤,若評論欄位中未輸入任何內容,則顯示產品編號,否則顯示評論欄位的內容。

此圖顯示如何指定量身訂製的答案:

以下是該問題的顯示邏輯檔案,可讓我們確認條件邏輯是否按預期運作(例如,檢查是否有語法錯誤):

下圖顯示一個群組,您可在其中指定 5 點評分量表(選項 1-5)、量表標題,以及要評分的產品。最後一個問題顯示陣列問題的每個部分都可以量身訂製:

下圖顯示最後一個問題的邏輯檔案檢視。如您所見,子問題、答案和量表標題都可以量身訂製。

下載
若要下載上述問卷範例,請點擊以下連結:評分使用者輸入的產品清單問卷範例。