x

主要章節

  1. LimeSurvey Cloud 與 LimeSurvey CE 的差異
  2. 快速入門指南 - LimeSurvey 3.0+
  3. 安裝 - LimeSurvey CE
  4. 如何設計一份好的問卷(指南)
  5. 入門指南
  6. 管理 LimeSurvey
  7. 問卷 - 簡介
  8. 問卷設定
  9. 問卷選單
  10. 問卷結構
  11. 問題簡介
  12. 題組 - 簡介
  13. 問卷管理
  14. 問卷工具列選項
  15. 多語言問卷
  16. ExpressionScript 引擎 - 快速入門指南
  17. 未分類及進階功能
  18. 常見問題
  19. 疑難排解
  20. 應變方案
  21. 授權條款
  22. 版本更改紀錄檔
  23. 外掛程式
 Actions

運算式腳本範例

From LimeSurvey Manual

本頁面可能為機器翻譯,可能包含錯誤。 檢視英文原文 · 改善此翻譯
This page is a translated version of the page ExpressionScript examples and the translation is 100% complete.
歡迎協助擴充本文,請新增您自己的範例。這將有助於其他人開始使用運算式腳本。


結構

本文第一部分說明運算式的用途,以及在哪裡可以找到或新增運算式。第二部分提供如何使用運算式的範例。


運算式的類別

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、...


若要引用特定分級上某個子問題的結果,您需要使用 QuestionCode . '_' . SubQuestionCode . '_' . ScaleID。請注意,第一個分級的 "ScaleID" 為 0,另一個為 1!
引用第三個子問題與第二個分級之答案的範例: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),"")}


若要輸出子問題文字,您需要在預留位置中加入答案代碼(儘管所有答案選項的文字都相同)。因此,我們必須使用 {q5_SQ001_A1.question} 或 {q5_SQ001_A2.question},而不是 {q5_SQ001.question}。

若上一個問題的答案為空,則隱藏問題

目的 若上一個問題的答案為空,則隱藏問題
類型 問題相關性
範例 問題一:問題編號 "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)