運算式腳本範例
From LimeSurvey Manual
結構
本文第一部分說明運算式的用途,以及在哪裡可以找到或新增運算式。第二部分提供如何使用運算式的範例。
運算式的類別
LimeSurvey 將運算式用於下列用途:
相關性
用途:隱藏題組/問題
相關性用於控制題組或問題是顯示還是隱藏。如果運算式的結果為「true」(即 1),該元素將會顯示。否則(運算式的結果為「false」,即 0),該元素將會隱藏。
| 類型 | 顯示/隱藏 | 位置 | 螢幕截圖 |
|---|---|---|---|
| 題組相關性 | 題組 | 建立/編輯題組 -> 「相關性等式:」 | |
| 問題相關性 | 問題 | 建立/編輯問題 -> 「相關性等式:」 | |
| 子問題相關性 | 子問題 | 編輯子題 -> 「相關性等式:」 |
驗證
用途:驗證問題/子問題/答案的輸入或操作
驗證用於控制受訪者在問題中的輸入或操作是否有效。如果運算式的結果為「true」(即 1),則會對該元素及驗證訊息套用「good」類別。否則,如果運算式的結果為「false」(即 0),則會對該元素及驗證訊息套用「error」類別。您可以在 template.css 中為這些類別定義樣式。
| 類型 | 驗證對象 | 位置 | 螢幕截圖 |
|---|---|---|---|
| 問題驗證 | 問題 | 建立/編輯問題 -> 「邏輯分頁」 -> 「問題驗證方程式」 | |
| 子問題驗證 | 子問題 | 建立/編輯問題 -> 「邏輯分頁」 -> 「子問題驗證方程式」 |
文字輸出
用途:(執行某些操作)並輸出一些文字
運算式可用於輸出文字。例如,您可以測試或計算某些內容,並根據測試或計算的結果指定輸出內容。它也可用於插入在該運算式之前出現的問題之問題文字、答案、題型等。文字輸出可用於任何顯示文字的地方,並可傳回各種結果。
| 使用情境 | 說明 |
|---|---|
| 微調整 | 調整文字,例如根據先前詢問的性別問題,寫出「先生」或「女士」 |
| 計算 | 計算數值並輸出,例如「您的家庭收入為 xxx」 |
| 引用 | 插入某個元素的文字,例如「您的姓名是 xxx。請問您幾歲?」 |
答案儲存
用途:(執行某些操作,)(輸出一些文字)並將某些內容儲存到資料庫
公式題型可用於將內容儲存到資料庫。您可以透過運算式執行某些操作,顯示公式問題(類似於文字顯示),並將運算式的結果儲存到資料庫。它會將答案儲存到回應資料表中。之後,該結果可用於統計功能,也可以匯入 LimeSurvey 匯出功能所提供的其中一種格式。
運算式範例
插入上一個問題的答案
| 用途 | 插入上一個問題的答案 |
| 類型 | 引用 |
| 範例 | 問題一(問題編號「Q00」):您住在哪個城市? 問題二(問題編號「Q01」):您在 CITY 住了多久? 要做的事:使用問題一的答案取代第二個問題中的「CITY」。 |
| 運算式 | {QOO} |
| 說明 | Q00 中提供的答案會取代第二個問題中的 Q00 欄位 |
| 步驟 | 建立/編輯問題二 在問題文字欄位中輸入「您在 {QOO} 住了多少年?」 |
| |
使用隱藏的公式問題自動填入答案
問題: 假設您有兩個問題 Q1 和 Q2。Q1 詢問受訪者的年齡。Q2 將受訪者分為三組:年齡低於 20 歲、年齡為 20 歲、年齡大於 20 歲。 因此,Q2 應使用對應上述條件的值「1」、「2」、「3」。此外,別忘了將 Q2 設為不可見(該問題不會顯示在問卷中,但這些值會透過「背景程序」寫入回應資料表)。
使用公式題型填寫資料庫:
- 首先,建立問題編號為 Q1 的數字輸入問題。
- 然後建立另一個問題編號為 Q2 的公式問題。
- 在 Q2 的「顯示設定」分頁中:
- 將「始終隱藏本題」欄位設為「開」
- 在「公式」欄位中輸入以下運算式:
{if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}
使用預留位置建立摘要頁面
本教學示範如何透過 運算式腳本預留位置 在問卷結尾建立總覽,列出所有問題與答案。 同時也說明如何將此總覽限制為僅顯示已回答的問題。
您可以從此處下載我們的範例:問卷佔位符問卷範例。
此處使用的問題類型:
1. 單選問題 / 單一文字/數字問題
- 列表(下拉式)
- 列表(單選) [L]
- 是/否 [Y]
- 長篇的自由文本 [T]
- 簡短的自由文本 [S]
- 數字輸入 [N]
- Equation [*]
2. 含子問題的問題
- 多重簡短文本 [Q]
- 多項選擇 [M]
- 陣列 [F]
- 陣列 (是/否/不確定) [C]
- 陣列(10 點選擇) [B]
3. 含 2 個尺度的問題
- 陣列雙重尺度 [1]
4. 含 X 與 Y 尺度的問題
- 陣列(數字) [:]
5. 其他類型問題
- 文字顯示 [X]
在這個簡單的範例中,我們的概覽將是一個簡單的列表,格式如下:
- 問題文字: 使用者的答案
單選問題 / 單一文字/數字問題
對於下列所有問題類型,LimeSurvey 只會儲存單一作答結果:
- 列表(下拉式)
- 列表(單選)
- 帶評論的列表
- 5 點選擇
- 是/否
- 簡短的自由文本
- 長篇的自由文本
- 大量的自由文本
- 數字輸入
- Equation
- 日期
- 性別
假設該問題的問題編號為 q1,我們可以使用以下方式引用問題文字和答案:
- {q1.question}: {q1.shown}
範例:
- 您幾歲?: 25
如果您想檢查該問題是否已作答,可以在輸出內容外加上 IF 陳述式:
{if(!is_empty(q1),join("- ",q1.question,": ",q1.shown),"")}
這段內容可「翻譯」為:如果問題編號為 q1 的問題不是空的,則輸出 "- " 以及問題文字以及 ": " 以及答案文字(join() 函數會將各元素合併為一個新字串);否則:不輸出任何內容("" 代表空字串)。
含子問題的問題
對於下列所有問題類型,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 ), "" ) }
如果您只想輸出所選項目的清單,請使用 listifop 函數,例如:Mercedes, Volvo
{ listifop( 'value', '==', 'Y', 'question', ', ', that.q2.sgqa ) }
其中 that.q2 會展開為 q2 的所有子問題。詳情請參閱 self、this 和 that。
範例 2(假設題型為陣列(10 點選擇))
- 請以 1 到 10 分評價下列汽車品牌的品質(1=非常差,10=非常好)?
-- Mercedes: 7
-- Audi: 9
-- Volvo: 9
如果您只想輸出已評分的項目,可以在輸出內容外加上 IF 陳述式,並使用下列方式檢查目前的子問題是否已回答:
{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }
例如,如果您只想輸出所選項目中大於八的項目清單,請使用 listifop 函數,例如:Audi / Volvo
{ listifop( 'value', '>', 8, 'question', ' / ', that.q3.sgqa ) }
具有兩個分級的問題
假設使用下列編號:
- 問題編號:q4
- 子問題編號:SQ001、SQ002、...
- 分級1的答案編號:A1、A2、...
- 分級2的答案編號:B1、B2、...
引用第三個子問題與第二個分級之答案的範例:q4_SQ003_1 - 問題 4、子問題 3、第二個分級。
讓我們輸出兩個分級與前兩個子問題的結果:
- {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_0.question} 或 {q4_SQ001_1.question},而不是 {q4_SQ001.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),"")}
若上一個問題的答案為空,則隱藏問題
| 目的 | 若上一個問題的答案為空,則隱藏問題 |
| 類型 | 問題相關性 |
| 範例 | 問題一:問題編號 "name",問題文字 "What's your name?" 問題二:問題文字 "{name}, how old are you?" 待辦:若問題一的文字欄位為空,則隱藏問題二 |
| 運算式 | !is_empty(name) |
| 說明 | is_empty() 用於判斷變數是否被視為空。"!" 會將結果反向。因此,若變數不為空,則運算式為真,並顯示該問題 |
| 步驟 | 建立/編輯問題二 在「相關性等式」中輸入 "!is_empty(name)" |
| 範例檔案 | Hide_question_if_empty_question_group.zip |
![]()
| |
若上一個問題的答案為「是」或「否」,則隱藏題組
| 目的 | 若上一個問題的答案為「是」或「否」,則隱藏題組 |
| 類型 | 題組相關性 |
| 範例 | 第一頁,題組一,問題一:問題編號 "PET",問題文字 "Do you have a pet?" -Yes -No 第二頁,題組二:標題 "About your pet(s)" 待辦:若問題一的答案為「是」/「否」,則顯示/隱藏題組二 |
| 運算式 | PET == "Y" |
| 說明 | PET 是您要檢查其答案的問題之問題編號。若您未使用後綴,EM 會使用 "Qcode.code"。因此,您是將 PET 問題的答案代碼與值 "Y" 進行比較。若參與者回答「是」,則運算式為真,並會顯示題組 "About your pet(s)"。 |
| 步驟 | 建立/編輯題組二 在「相關性等式」中輸入 "PET == "Y"" |
| 範例檔案 | Hide_question group_if_answer_from_previous_question_is_Yes_or_No.zip |
![]()
| |
顯示多重答案輸入問題欄位的值
| 目的 | 顯示多重答案輸入問題欄位的值 |
| 類型 | 參考 |
| 範例 | 問題一:問題編號 "AskChildAge",問題文字 "How old are your children?"。子問題代碼 -Child1 -Child2 -Child3 - ChildXXX 問題二:問題編號 "ReportChildAge",問題文字 "About your first child: - CHILD1 is AGE1." |
| 運算式 | {AskChildAge_Child1.question}, {AskChildAge_Child1.value} |
| 說明 | 您想在後續問題中使用某個子問題的值。您可以使用這種運算式存取子問題的值:QcodeQuestion_QcodeSubquestion.value |
| 步驟 | 建立/編輯第二個問題 在說明中輸入以下文字:"About your first child: - {AskChildAge_Child1.question} is {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" 這部分只是將秒數換算為天數。 除了詢問 "datetoday" 之外,您也可以使用 strtotime('now') 或直接使用 time(),它會直接傳回自 1970 年 1 月至現在(即作答問卷的時間)的秒數。因此,您可以使用等式 {(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25} 快速算出一個人的年齡(以年為單位)。在上述任何情況下,日期都必須以正確的格式輸入,否則 strtotime() 函數將無法正常運作。 |
| 步驟 | 建立兩個日期問題(分別用於出生日期與今天的日期)以及一個文字顯示問題。 在文字顯示問題的問題文字中輸入:"On {datetoday} you were {(strtotime(today)-strtotime(dob))/60/60/24} days days old." 請注意: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
您可以使用問題驗證方程式,以任何條件控制陣列。
實作細節:
- 第一個陣列:單選陣列
- 問題編號為 ARRAY
- 子問題代碼為 SQ01、SQ02、SQ03 和 SQ04
- 更新整個問題驗證方程式,並輸入
!is_empty(ARRAY_SQ01) and !is_empty(ARRAY_SQ03)
- 第二個陣列:文字陣列
- 問題編號為 ARRAYTEXT
- Y 軸的子問題代碼為 SY01、SY02、SY03 和 SY04
- 更新整個問題驗證方程式,並輸入
count(self.sq_SY01 >= 1) and count(self.sq_SY03 >= 3)








