XLSForm では、質問をグループ化して複数回繰り返すことができます。 繰り返しの質問の使用方法には、次の例が含まれます。
- 1 つの調査の同じ質問に対して複数の回答を取得します。
- 別々の、小規模のレコードのコレクション (家族全員の名前、年齢、性別など) を取得します。
- 1 つの調査内で複数のマップの質問を取得します。
繰り返しを含む調査を公開する場合、それぞれの繰り返しは、ユーザーのフィーチャ レイヤーの関連テーブルとして作成されます。あるいは、繰り返しにジオポイント、ジオトレース、ジオシェープの質問が含まれている場合は、関連レイヤーとして作成されます。
繰り返しの使用
Survey123 でグループ化した質問を繰り返し、複数の回答を取得するには、スプレッドシートの [survey] タブで次の手順を実行します。
- 繰り返しを開始する行で、[type] 列に「begin repeat」と入力します。
- [name] 列に繰り返しの質問の名前を入力します。
- このエントリより下の行に、繰り返しの質問に含める内容を入力します。
- 質問のすぐ後の行の [type] 列に「end repeat」と入力します。
これで調査に質問のグループが作成され、調査の結果に繰り返し追加できるようになります。 デフォルトでは、質問の繰り返し回数に制限はありません。
繰り返し内の最初のジオポイントの質問のポイント位置は調査のどのマップにも表示できます。 詳細については、「マップのポイント オーバーレイ」をご参照ください。
繰り返しの質問のレコード数の制限
Survey123 で繰り返し回数を定義するには、次の手順に従って繰り返し回数を設定します。
- 繰り返しを開始する行で、[survey] タブの [type] 列に「begin repeat」と入力します。
- [repeat_count] 列に繰り返し回数の数値を入力します。 数値を返す質問の名前や計算を指定することもできます。
- [name] 列に繰り返しの質問の名前を入力します。
- このエントリより下の行に、繰り返しの質問に含める内容を入力します。
- 最後の行の [type] 列に「end repeat」と入力します。
ユーザーが調査を開くと、[repeat_count] 列で設定された繰り返し回数がすでに作成されています。 ユーザーは繰り返しの作成や削除を行えません。
[repeat_count] の値によって定義されたすべての繰り返しは、調査の回答を送信する前に操作する必要があります。操作しない場合、一部の繰り返しレコードが送信されません。 すべての繰り返しが送信されるようにするため、繰り返し内で質問を必須にすることができます。 ただし、関連するか条件付きで必要なステートメントが適用される繰り返し内の質問は、送信時に評価されないので注意してください。
注意:
繰り返し回数の変更を伴う繰り返しの動作は、ユーザーが調査回答を作成するか、すでに送信された既存の調査回答を編集するかで異なります。
調査回答を作成する場合は、繰り返しの回数を削減すると、新しい繰り返し回数を上回るすべてのレコードとこれらのレコードに含まれているデータを削除するボタンがその繰り返しの上部に表示されます。空のレコードは自動的に削除されます。 このボタンを押しても押さなくても、調査回答を送信した場合に、新規の繰り返し回数を上回るレコードは送信されません。
既存の調査回答を編集する場合は、繰り返しの回数を削減すると、繰り返しレコードの数が変更されたことを警告するメッセージがその繰り返しの上部に表示されます。 ユーザーは、繰り返しレコードの数が元の数より少ない編集済みの回答を送信することができません。 新規の繰り返しレコードを追加できるのは、[bind::esri:parameters] 列で allowAdds が true に設定されている場合に限ります。 allowAdds が false に設定されている場合、ユーザーは、元の数より多い繰り返しレコードの数を入力することができません。
集約関数
集約関数を使用し、繰り返しの回答から得られた値を返すことができます。 このためには、繰り返し内の質問を繰り返し外の質問で参照します。 たとえば、次の式では、繰り返し全体で 1 つの質問に対して回答がカウントされます。
count(${repeated_question})
回答の集約には、次の関数を使用できます。
- count
- sum
- min
- max
- join
これらの関数は、現在の調査の回答にのみ適用されます。 フィーチャ レイヤー内の他のレコードは考慮されません。 繰り返し内に sum と count を使用した質問を含めることも可能です。 ただし、sum と count の値は繰り返しに追加される新しいレコードごとに計算されますが、繰り返し内の過去のエントリに対する計算は自動的には更新されません。 これらの計算は、質問の横にある [更新] ボタンを使用して手動で更新できます。 min と max の使用は、繰り返しの外部でのみサポートされています。
注意:
Survey123 フィールド アプリで使用する場合、sum と count は繰り返し内または繰り返し外に配置できます。 sum と count を Survey123 Web アプリで使用する場合は、繰り返し外に配置する必要があります。 繰り返し外からの sum 値や count 値は、繰り返し内の計算で参照できます。
join 関数を使用し、文字列を返す質問を結合することができます。 また、sum 関数を使用して、繰り返し内のジオポイントの質問を繰り返し外のジオトレースまたはジオシェープの質問として接続することもできます。
これらの関数の使用方法については、「式」をご参照ください。
繰り返しレコードのインデックスを返す
position(..) 関数を使用して、繰り返し内の繰り返しレコードのインデックスを反映した整数を返すことができます。 たとえば、繰り返し内の最初の繰り返しは 1 を返し、2 番目の繰り返しは 2 を返します。以降も同様です。 以下の例では、繰り返し内の非表示の整数の質問で position(..) 関数を使用します。
注意:
position(..) 関数を繰り返し外で使用するか、繰り返し内のグループの中で使用すると、Survey123 フィールド アプリでは常に 0 を返し、Survey123 Web アプリでは常に 1 を返します。
position(..) 関数は、式で使用することもできます。 次の例では、selected-at() 関数は position(..) を使用して、現在の繰り返しレコードと同じ位置にある select_multiple 質問で選択された選択肢を返し、繰り返しにその選択肢をメモとして表示します。 selected-at() 関数は選択肢のカウントをゼロで開始するので、position(..) から 1 が減算され、インデックスが一致するようになっています。
selected-at(${issues}, position(..)-1)
position(..) 関数と indexed-repeat() を併用すると、特定の繰り返しレコードから質問の値を抽出できます。
インデックス化された繰り返しの値を使用する
indexed-repeat() 関数を使用して、繰り返しレコード内の特定の繰り返しから値を返すことができます。 このためには、質問の名前、繰り返しの名前、繰り返しのインデックス番号が、この順番で必要になります。 次の例では、繰り返し floor 内の 3 番目のレコードについて、質問 room_no に対する回答が返されます。
indexed-repeat(${room_no}, ${floor}, 3)
indexed-repeat() 関数は、繰り返し内の繰り返しに対して使用できます。 この方法で使用する場合は、現在表示されている親の繰り返しからアクセス可能な値のみを受け取ります。
注意:
循環参照の原因となるため、関数が参照している繰り返し内で indexed-repeat() 関数を使用することはできません。 たとえば、defects という名前の繰り返し内で計算に以下の式を使用することはできません。
indexed-repeat(${defect_type}, ${defects}, 3)
既知の制限
Survey123 で繰り返しを使用する場合、次のような既知の制限および予期しない動作があります。
- begin repeat と end repeat の間に質問が存在しない空の繰り返しが調査に含まれていると、どの調査回答も送信できません。
- 調査に複数の繰り返しが含まれており、それらの繰り返しのいずれかにジオポイント、ジオトレース、ジオシェープの質問があると、リレーションシップ名が順不同で公開されることがあります。
- 入れ子の繰り返しは 1 対多のリレーションシップのみをサポートし、各子は 1 つしか親を持つことができません。
- [relevant] 列と [repeat_count] 列の両方に式がある入れ子の繰り返しでは、最初の繰り返しレコード内にあるすべての既存の保存済みデータが消去されます。 これを回避するには、relevant の式を [repeat_count] の式に組み込み、繰り返しが関連しないときは繰り返しレコードが作成されないようにします。