iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
自我挑戰組

用 ODK 和 Access VBA 打造行動化資料收集流程系列 第 19

Day19:表單邏輯(Form Logic) Part 4

  • 分享至 

  • xImage
  •  

重複問題(Repeating questions)

您可以透過將同一個問題或多個問題包裝在 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 或公文包匯出的重複資料將位於自己的文件中,並且需要與其父記錄結合進行分析。
在向表單新增重複項之前,請考慮其他選項:

  • 如果重複次數很少且事先知道,請考慮透過多次複製相同的問題來「展開」重複。
  • 如果重複次數較多且包含許多問題,請考慮建立一個單獨的表格,由普查員多次填寫,並將表格與某些父鍵(例如家庭 ID)連結。

如果需要重複,請考慮在最後添加一些匯總計算,以便分析不需要將重複與其父記錄連接。例如,如果您正在收集家庭資訊並希望計算所有普查員造訪過的家庭總數,請在重複之後新增一個計算,以計算每次提交中的重複次數。

控制重複次數

使用者控制的重複

預設情況下,調查員可以控制問題重複的次數。在每次重複之前,系統會詢問用戶是否要添加另一個重複項。用戶可以選擇是否添加每次重複。

注意
「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

重複標籤將與位置摘要中的索引一起顯示。

標籤也顯示在跳轉選單中。

篩選選定問題中的選項(Filtering options in select questions)

要根據前一個問題的回答限制選擇題的選項,請在調查表的「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

由重複問題中產生的選擇(Generating select ones from)

如果您使用重複問題,則可以使用重複中的值,產生後續 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」的問題不是必填項目,且在某些重複實例中空白,則這些重複實例將不包含在選項中。


上一篇
Day18:表單邏輯(Form Logic) Part 3
下一篇
Day20: 表單運算子(Operators)
系列文
用 ODK 和 Access VBA 打造行動化資料收集流程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言