您可以透過將同一個問題或多個問題包裝在 begin_repeat與end_repeat 中多次詢問。預設情況下,每次重複之前都會詢問是否要新增另一個重複。還可以提前確定重複次數,這可以使用戶互動更加直覺。只要滿足條件,您也可以新增重複。
XLSForm —重複一個或多個問題
survey
type | name | label |
---|---|---|
begin_repeat | my_repeat | 重複群組標籤 |
note | repeated_note | 所有這些問題都將重複。 |
text | name | 你叫什麼名字? |
text | quest | 你的追求是什麼? |
text | fave_color | 你最喜歡什麼顏色? |
end_repeat |
注意
您可以將欄位清單( field-list )外觀套用至重複,以使所有重複的問題顯示在一個畫面上。但是,您不能在具有欄位清單外觀的另一個群組內重複。
可參閱:https://docs.getodk.org/form-repeats/
提示
以某種形式使用重複非常強大,但也會使訓練和資料分析更加耗時。從 Central 或公文包匯出的重複資料將位於自己的文件中,並且需要與其父記錄結合進行分析。
在向表單新增重複項之前,請考慮其他選項:
如果需要重複,請考慮在最後添加一些匯總計算,以便分析不需要將重複與其父記錄連接。例如,如果您正在收集家庭資訊並希望計算所有普查員造訪過的家庭總數,請在重複之後新增一個計算,以計算每次提交中的重複次數。
預設情況下,調查員可以控制問題重複的次數。在每次重複之前,系統會詢問用戶是否要添加另一個重複項。用戶可以選擇是否添加每次重複。
注意
「begin_repeat」行中的標籤會在「新增…項目?」消息中以引號形式顯示。一個有意義的標籤有助於調查員和參與者按預期方式導航表單。我們通常建議使用單數名詞或名詞短語,如「觀察員」或「家庭成員」。
這種互動可能會讓用戶在第一次看到時感到困惑。如果調查員提前知道重複次數,建議考慮使用動態定義的重複計數。
另外也可以透過右上方的跳轉按鈕,來切換顯示的層,以及新增或者刪除實例項目,可以參考以下連結:
https://docs.getodk.org/collect-filling-forms/#jumping
https://docs.getodk.org/collect-filling-forms/#adding-repeats
https://docs.getodk.org/collect-filling-forms/#removing-repeats
使用repeat_count 欄位定義問題重複的次數。
這種情況下,就不會跑出小視窗詢問是否新增項目,而是直接新增.
XLSForm
type | name | label | repeat_count |
---|---|---|---|
begin_repeat | my_repeat | 重複群組標籤 | 3 |
note | repeated_note | 這些問題將重複三次。 | |
text | name | 你叫什麼名字? | |
text | quest | 你的追求是什麼? | |
text | fave_color | 你最喜歡什麼顏色? | |
end_repeat |
動態定義的重複計數
「Repeat_count」 欄位可以引用先前的回應和計算。
XLSForm
type | name | label | repeat_count |
---|---|---|---|
integer | number_of_children | 你有幾個孩子? | |
begin_repeat | child_questions | 關於孩子的問題 | ${number_of_children} |
text | child_name | 孩子的名字 | |
integer | child_age | 孩子的年齡 | |
end_repeat |
使用「repeat_count」時,如果計數設定為一個值然後隨後減少,則不會刪除重複實例。這可以避免意外的資料遺失:意外將計數設定得太低的使用者不會遺失他們之前填寫的重複實例。
這種行為可能會讓資料收集者感到困惑。它還使分析變得更加困難,因為您必須小心忽略超出指定計數的索引處的重複實例。處理這種情況的建議方法是使用具有相關性表達式的巢狀群組來隱藏任何額外的重複實例:
survey
type | name | label | constraint | repeat_count | relevant |
---|---|---|---|---|---|
integer | number_in_party | 您的聚會中有多少位客人? | . <= 8 | ||
note | party_names_note | 請提供每位客人的詳細資料。 | |||
begin_repeat | guest_details | 賓客詳情 | ${number_in_party} | ||
begin_group | guest_details_gr | position(..) <= ${number_in_party} | |||
text | guest_name | 客人姓名 | |||
text | guest_dietary | 該客人有任何飲食限制嗎? | |||
end_group | |||||
end_repeat |
嵌套的「guest_details_gr」群組具有相關表達式「position(..) <= ${number_in_party}.position(..)」取得目前重複實例的位置,從 1 開始。對於位置大於所需計數的任何重複實例,內部群組將被隱藏。這看起來好像已被刪除,但由於它只是隱藏的,因此如果重新調整重複計數,資料將重新出現。
如果提前不知道需要多少重複次數,您仍然可以避免詢問視窗出現,透過使用問題的答案來決定是否新增重複實例。在下面的範例中,只要使用者對最後一個問題回答「Yes」,就會重複詢問有關植物的問題。
survey
type | name | label | calculation | repeat_count |
---|---|---|---|---|
calculate | count | count(${plant}) | ||
begin_repeat | plant | Plant | if(${count} = 0 or ${plant}[position()=${count}]/more_plants = 'yes', ${count} + 1, ${count}) | |
text | species | 品種 | ||
integer | estimated_size | 預計尺寸 | ||
select_one yes_no | more_plants | 這個地區還有更多植物嗎? | ||
end_repeat |
choices
yes_no | yes | Yes |
---|---|---|
yes_no | no | No |
這通過維持現有重複項的 「count()」 來實現。如果滿足繼續條件,則將「repeat_count」 設為比當前計數多一;如果滿足結束條件,則保持「repeat_count」不變。
在「repeat_count」表達式中,「${count} = 0」 確保總是至少建立一個重複實例。繼續條件為 「${plant}[position()=${count}]/more_plants = 'yes'」,意思是「上次詢問 「more_plants」問題時的答案是 「yes」。表達式「position()=${count}」使用「position()」函數來選擇最後添加的植物。將 「/more_plants」 添加到結尾來選擇「more_plants」 問題。
重複零次或多次
有時,只有在某些條件下重複收集問題所代表的資訊才有意義。如果事先知道總重複次數,請使用動態定義的重複計數並允許計數為 0。在下面的範例中,只有當使用者指示有樹木可供調查時才會詢問有關樹木的問題。
survey
type | name | label | relevant |
---|---|---|---|
select_one yes_no | trees_present | 這個地區有樹嗎? | |
begin_repeat | tree | Tree | ${trees_present} = 'yes' |
text | species | 種類 | |
integer | estimated_age | 預計年齡 | |
end_repeat |
choices
list_name | name | label |
---|---|---|
yes_no | yes | Yes |
yes_no | no | No |
表單問題頂部的表單位置,摘要顯示問題所在的所有群組和重複的標籤以及任何重複的索引。
例如,在重複收集不同人員的資料時,第二位人員的位置摘要為 人員 > 2。
位置摘要也顯示在跳頁選單中。
在許多情況下,重複索引(上例中的 2)足以為資料收集者提供上下文資訊。但是,在資料收集器需要在重複實例之間跳頁的工作流程中,它可以幫助根據它們代表的實體來命名這些重複實例。
例如,在上面的範例中使用每個人的姓名將比僅使用索引更有幫助。為此,請直接在重複中新增一組,並在標籤中使用一個或多個識別問題。
Survey
type | name | label |
---|---|---|
begin_repeat | person | Person |
begin_group | person_group | ${first_name} ${last_name} |
text | first_name | First name |
text | last_name | Last name |
end_group | ||
end_repeat |
重複標籤將與位置摘要中的索引一起顯示。
標籤也顯示在跳轉選單中。
要根據前一個問題的回答限制選擇題的選項,請在調查表的「choice_filter」列中指定一個表達式。該表達式將引用「choices」表中的一個或多個列,來過濾數據集。
例如,您可能會要求調查員先選擇一個州,然後僅顯示該州內的城市。這稱為「級聯選擇」,可以擴展到任何深度。以下範例有兩個層級:職位類別和職位名稱。
範例中,第二個選擇題的「choice_filter」表達式為「category=${job_category}.category」是「choices」表中的一列名稱,而「${job_category}」則是表單中第一個選擇題的引用。過濾表達式表示僅包括那些「category」列的值與調查員選擇的「${job_category}」完全相同的行。
任何評估為 True 或 False 的表達式都可以用作「choice_filter」。例如,您可以在「choices」表中添加一個「location」列,並要求用戶輸入他們希望考慮工作的地點。如果調查表中的新位置問題名稱為「${job_location}」,那麼選擇過濾條件將是 「category=${job_category} and location=${job_location}」。另一個複雜過濾條件的例子是使用文本比較函數來匹配以某個值開頭的標籤。例如,「starts-with(label, ${search_value})」,其中 「search_value」 是調查表中定義的一個文本問題名稱。
XLSForm
survey
type | name | label | choice_filter |
---|---|---|---|
select_one job_categories | job_category | Job category | |
select_one job_titles | job_title | Job title | category=${job_category} |
choices
list_name | name | label | category |
---|---|---|---|
job_categories | finance | Finance | |
job_categories | hr | Human Resources | |
job_categories | admin | Administration/Office | |
job_categories | marketing | Marketing | |
job_titles | ar | Accounts Receivable | finance |
job_titles | pay | Payroll | finance |
job_titles | recruiting | Recruiting | hr |
job_titles | training | Training | hr |
job_titles | retention | Retention | hr |
job_titles | asst | Office Assistant | admin |
job_titles | mngr | Office Manager | admin |
job_titles | reception | Receptionist | admin |
job_titles | creative_dir | Creative Director | marketing |
job_titles | copywriter | Copywriter | marketing |
如果您使用重複問題,則可以使用重複中的值,產生後續 select_one 可用的清單。例如,如果您重複收集有關多個家庭成員的訊息,則可顯示包含所有家庭成員姓名的以供選擇。為此,請新增 select_one 類型的問題,後面跟著重複問題中要用於選擇選項的問題名稱。
survey
type | name | label | required | choice_filter |
---|---|---|---|---|
begin_repeat | person | Person | ||
text | person_name | 人名? | true() | |
integer | person_age | ${person_name} 的年齡? | true() | |
end_repeat | person | |||
select_one ${person_name} | tallest | 選擇最高的人 | ||
select_one ${person_name} | tallest_child | 選擇 18 歲以下最高的人。 | ${person_age} < 18 |
如上述範例所示,您可以將這個功能與其他選擇功能結合使用,例如過濾(choice_filter)。請注意,在上面的範例中,作為選擇題選項文本的問題是必填(required)的。如果用於形成「select_one」的問題不是必填項目,且在某些重複實例中空白,則這些重複實例將不包含在選項中。