式の作成

調査で式を使用して、質問のデフォルトの動作を制御できます。 [relevant] 列で式を使用して、1 つの質問または質問のグループを、以前の回答に基づいて非表示/表示にできます。 [relevant] 列の式を通して質問を非表示にすると、質問のデータは送信されません。

注意:

Survey123 Mobile とフィールド アプリでは、relevant 式により後で非表示にされる質問の回答が入力された場合、回答が消去されます。 質問が再び関連するようになった場合、新しい回答を入力する必要があります。 Web アプリでは、回答は消去されません。そのため、質問が再び関連するようになった場合、前に入力した回答が使用されます。

式は、[readonly] 列に適用することもできます。これにより、式の結果に基づいて、1 つの質問または質問のグループへの入力を無効にできます。 [required] 列も式をサポートしているため、調査でユーザーが特定の条件下でのみ質問に回答するようにすることができます。

注意:

Web アプリでは、読み取り専用の式はサポートされていません。

以前の質問は必ず ${field_name} という形式によって式で参照される必要があります。

質問の表示設定

[body::esri:visible] 列を使用して、式によって質問を非表示にできます。 この列に含まれる式で true と評価されない場合、質問は非表示になりますが、質問のコンテンツは維持されたままです。 たとえば、${edit_location}='yes' という式では、edit_location の質問が yes と等しい場合にのみ質問が表示されます。

この動作は [relevant] 列の動作と似ています。どちらの列でも、列内の式で true と評価されるまで質問は非表示になります。 主な違いは、[body::esri:visible] では式によって非表示になった質問の値はクリアされず、既存の値がフィーチャ レイヤーに送信されることです。 質問に関連性がない場合、値が計算または保存されないようにするには、[body::esri:visible] の代わりに [relevant] 列を使用します。

[body::esri:visible] 列か [relevant] 列を使用して質問の表示/非表示を制御する場合、必須、デフォルト、制限、入力マスクは、質問が表示される場合にのみ適用されます。

質問タイプを hidden に設定したり表示設定を hidden に設定したりすることで質問の表示/非表示を制御することもできますが、これらは式で制御することはできません。

注意:

画像、オーディオ、ファイルの質問では、[body::esri:visible] 列を基準にした非表示がサポートされていません。

シンプルな式

これらの式の最適な使用方法は、特定の回答が前もって提供されなかった場合に、質問の動作または可視性を変更することです。 たとえば、次の式は、以前の質問に対する回答が true であるかどうかを確認します。

${previous_question} = 'true'

次の例は、以前の質問に対する回答が 100 以上であるかどうかを確認します。

${previous_question} < 100

[select_multiple] 質問タイプでは、他の質問タイプと異なる方法で値が保存されます。チェックされた各回答が選択順に入力され、カンマで区切られます。 たとえば、回答 A と B をこの順序で選択すると、回答は A,B と表示されます。 select_multiple の質問を式の一部として使用するには、selected 関数を使用する必要があります。 次の例は、ユーザーが以前の質問に A と回答したかどうかを確認し、選択された他の回答に関係なく機能します。

selected(${previous_question}, 'A')

count-selected 関数は、select_multiple の質問で選択されたオプションの数をカウントし、その数を操作できるようにします。 次の例は、以前の質問で 3 つ以上の選択肢が選択されたかどうかを確認します。

count-selected(${previous_question}) > 2

表示設定を count-selected にし、image または file の質問の制約として multiline 関数を使用して、送信されるファイルの数を制御できます。

数式

次の例は、複数の演算子と質問を結合します。

${previous_question} + ${other_previous_question} <= 100

数学演算子を使用する場合、値を数値に変換する必要が生じる可能性があります。 前述の例では、previous_questionother_previous_question は整数または小数だと想定されていますが、質問タイプが文字列の場合は以下のようにキャストします。

int(${previous_question}) + int(${other_previous_question}) <= 100

date の質問に対して数式を実行することもできます。これらは、1970 年 1 月 1 日からの経過時間をミリ秒単位で表したエポック タイムとして保存されます。 次の式では、以前の質問に対する回答が今日から 2 週間より前の場合のみ、質問が表示されます。

if( ${previous_question}='',false,today() - ${previous_question} > 1000*60*60*24*15)

正規表現

正規表現とは、文字列のパターンに一致させるために使用される一連の文字のことです。 Survey123 では、パターンが一致すると式は true を返し、パターンに一致しなければ false を返します。

正規表現は、次の表に示す部分式から構築できます。

部分式一致

^

行の先頭と一致します。

$

行の末尾と一致します。

改行文字以外の任意の 1 文字と一致します。

[...]

括弧内の任意の 1 文字と一致します。

[^...]

括弧内にない任意の 1 文字と一致します。

(re)

正規表現をグループ化し、一致するテキストを記憶します。

(?: re)

一致するテキストを記憶せずに、正規表現をグループ化します。

a| b

a または b のいずれかと一致します。

\A

文字列全体の先頭。

\b

括弧の外側の場合は単語の境界と一致します。括弧の内側の場合はバックスペース (0x08) と一致します。

\B

単語以外の境界と一致します。

\d

数字と一致します。 [0 ~ 9] と同じです。

\D

数字以外と一致します。

\G

直前の一致が終了したポイントと一致します。

\n、\t、\e など

改行文字、タブ、エスケープなどと一致します。

\N

グループ番号 N を取得するために後方参照します。

re*

先行する式の 0 回以上の発生と一致します。

re+

先行する式の 1 回以上の発生と一致します。

re?

先行する式の 0 回または 1 回の発生と一致します。

re{ n}

n によって定義される、先行する式の正確な発生回数と一致します。

re{ n,}

先行する式の n 回以上の発生と一致します。

re{ n, m}

先行する式の最小発生回数 (n によって定義される) と最大発生回数 (m によって定義される) と一致します。

\s

空白文字 (タブ、ライン フィード、フォーム フィード、キャリッジ リターン、スペース) と一致します。

\S

空白文字以外と一致します。

\w

単語の文字と一致します。

\W

単語以外の文字と一致します。

\z

文字列全体の末尾。

\Z

許可される最終行ターミネーターを除く、文字列全体の末尾。

別の質問によって提供される文字列が所定の形式でない場合に、式を許可する任意の列で正規表現を使用し、質問の動作を変更できます。 次の例は、[relevant] 列に配置されると、他の質問に対する回答が文字のみで構成される場合に、質問が表示されます。

regex(${question},'[A-Za-z]')

次の例は、道路名に関する select_one の質問の [choice_filter] 列に配置すると、前の質問で選択された city という名前の都市名と一致する citystreets リスト内の道路の選択肢のみを表示します。

regex(citystreets,${city})

調査の質問に対し制約を追加するための正規表現の使用方法のさらなる例については、「」をご参照ください。

条件式

条件式は、以下のとおり、ステートメント (条件) が true または false を返すどうかを判断し、ケースごとに指定値を返すために使用されます。

if(condition, value if true, value if false)

次の例では、question_one に対する回答が yes の場合、現在の質問に対する回答も yes になります。 question_one に対する回答が yes でない場合、現在の質問に対する回答が no になります。

if(selected(${question_one}, 'yes'), 'yes', 'no')

条件で 2 つの質問を使用できます。 次の例では、question_onequestion_two に対する回答がどちらも yes の場合、現在の質問に対する回答も yes になります。

if(selected(${question_one}, 'yes') and selected(${question_two}, 'yes'), 'yes', 'no')

次の例では、question_one または question_two に対する回答がどちらも yes の場合、現在の質問に対する回答も yes になります。

if(selected(${question_one}, 'yes') or selected(${question_two}, 'yes'), 'yes', 'no')

条件式もネストできますが、true の値と false の値を常に含めることが重要です。 以下の例では、question_one に対する回答が yes ではない場合、question_two が評価されます。 question_two も yes ではない場合、question_three が評価されます。 question_onequestion_twoquestion_three に対する回答がすべて yes ではない場合は、このステートメントを使用する質問に対する回答が no になります。

if(selected(${question_one}, 'yes'), 'yes', if(selected(${question_two}, 'yes'), 'yes', if(selected(${question_three}, 'yes'), 'yes', 'no')))