繰り返し

XLSForm では、質問をグループ化して複数回繰り返すことができます。 繰り返しの質問の使用方法には、次の例が含まれます。

  • 1 つの調査の同じ質問に対して複数の回答を取得する
  • 別々の、小規模のレコードのコレクション (家族全員の名前、年齢、性別など) を取得する
  • 1 つの調査内で複数のマップの質問を取得する
繰り返しによって 1 つの質問に対して複数の回答を設定する

繰り返しを含む調査を公開する場合、それぞれの繰り返しは、ユーザーのフィーチャ レイヤーの関連テーブルとして作成されます。あるいは、繰り返しにジオポイント、ジオトレース、ジオシェープの質問が含まれている場合は、関連レイヤーとして作成されます。

繰り返しの使用

Survey123 でグループ化した質問を繰り返し、複数の回答を取得するには、スプレッドシートの [survey] タブで次の手順を実行します。

  1. 繰り返しを開始する行で、[type] 列に「begin repeat」と入力します。
  2. [name] 列に繰り返しの質問の名前を入力します。
  3. 以降の行に、繰り返しの質問に含める内容を入力します。
  4. 質問のすぐ後の行の [type] 列に「end repeat」と入力します。

これで調査に質問のグループが作成され、調査の結果に繰り返し追加できるようになります。 デフォルトでは、質問の繰り返し回数に制限はありません。

繰り返しの質問のレコード数の制限

Survey123 で繰り返し回数を定義するには、次の手順に示すように、繰り返し回数を設定します。

  1. 繰り返しを開始する行で、[survey] タブの [type] 列に「begin repeat」と入力します。
  2. [repeat_count] 列に繰り返し回数の数値を入力します。 数値を返す質問の名前や計算を指定することもできます。
  3. [name] 列に繰り返しの質問の名前を入力します。
  4. このエントリより下の行に、繰り返しの質問に含める内容を入力します。
  5. 最後の行の [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 の使用は、繰り返しの外部でのみサポートされています。

join 関数を使用し、文字列を返す質問を結合することができます。 また、sum 関数を使用して、繰り返し内のジオポイントの質問を繰り返し外のジオトレースまたはジオシェープの質問として接続することもできます。

これらの関数の使用方法については、「」をご参照ください。

繰り返しレコードのインデックスを返す

position(..) 関数を使用して、繰り返し内の繰り返しレコードのインデックスを反映した整数を返すことができます。 たとえば、繰り返し内の最初の繰り返しは 1 を返し、2 番目の繰り返しは 2 を返します。以降も同様です。 以下の例では、繰り返し内の非表示の整数の質問で position(..) 関数を使用します。

XLSForm の position(..) 関数の例
注意:

position(..) 関数を繰り返し外で使用しするか、繰り返し内のグループの中で使用すると、Survey123 フィールド アプリでは常に 0 を返し、Survey123 Web アプリでは常に 1 を返します。

position(..) 関数は、式で使用することもできます。 次の例では、selected-at() 関数は position(..) を使用して、現在の繰り返しレコードと同じ位置にある select_multiple 質問で選択された選択肢を返し、繰り返しにその選択肢をメモとして表示します。 selected-at() 関数は選択肢のカウントをゼロで開始するので、position(..) から 1 が減算され、インデックスが一致するようになっています。

selected-at(${issues}, position(..)-1)

XLSForm の position(..) 関数と selected-at() 関数の例

position(..) 関数と indexed-repeat() を併用すると、特定の繰り返しレコードから質問の値を抽出できます。

インデックス化された繰り返しの値を使用する

indexed-repeat() 関数を使用して、繰り返しレコード内の特定の繰り返しから値を返すことができます。 このためには、質問の名前、繰り返しの名前、繰り返しのインデックス番号が、この順番で必要になります。 次の例では、繰り返し floor 内の 3 番目のレコードについて、質問 room_no に対する回答が返されます。

indexed-repeat(${room_no}, ${floor}, 3)

indexed-repeat() 関数は、繰り返し内の繰り返しに対して使用できます。 この方法で使用する場合は、現在表示されている親の繰り返しからアクセス可能な値のみを受け取ります。

既知の制限

Survey123 で繰り返しを使用する場合、いくつかの既知の制限および予期しない動作があります。

  • begin repeatend repeat の間に質問が存在しない空の繰り返しが調査に含まれていると、どの調査回答も送信できません。
  • 調査に複数の繰り返しが含まれており、それらの繰り返しのいずれかにジオポイント、ジオトレース、ジオシェープの質問があると、多くの場合、リレーションシップ名が順不同で公開されます。
  • 入れ子の繰り返しは 1 対多のリレーションシップのみをサポートし、各子は 1 つしか親を持つことができません。