x

주요 장

  1. LimeSurvey Cloud vs LimeSurvey CE
  2. 빠른 시작 가이드 - LimeSurvey 3.0+
  3. 설치 - LimeSurvey CE
  4. 좋은 설문조사를 디자인하는 방법(가이드)
  5. 시작하기
  6. LimeSurvey 관리
  7. 설문조사 - 소개
  8. 설문조사 설정
  9. 설문조사 메뉴
  10. 설문 조사 구조
  11. 질문 - 소개
  12. 질문 그룹 - 소개
  13. 설문조사 관리
  14. 설문조사 도구 모음 옵션
  15. 다국어 설문조사
  16. ExpressionScript 엔진 - 빠른 시작 가이드
  17. 미분류 및 고급 기능
  18. 일반 FAQ
  19. 문제 해결
  20. 해결 방법
  21. 특허
  22. 버전 변경 로그
  23. 플러그인 - 고급
 Actions

ExpressionScript - 프레젠테이션

From LimeSurvey Manual

이 페이지는 기계 번역되었을 수 있으며 오류가 포함되어 있을 수 있습니다. 영어 원문 보기 · 이 번역 개선하기
This page is a translated version of the page ExpressionScript - Presentation and the translation is 100% complete.


소개

LimeSurvey는 식 스크립트(Expression Script)를 사용하여 더 복잡한 분기, 평가, 유효성 검사, 맞춤화를 지원합니다. 식 스크립트는 백엔드에서 LimeSurvey가 대체 항목, 조건, 평가를 관리하는 방식을 대체합니다. 또한 실행 중 데이터베이스 읽기를 대부분 없애 처리 속도를 크게 높여 줍니다. 식 스크립트는 Thomas White 박사(TMSWhite)가 개발했습니다.


주요 정의

  1. 식(Expression): 중괄호로 둘러싸인 모든 내용입니다.
    • 여는 중괄호 바로 뒤나 닫는 중괄호 바로 앞에 공백이 없어야 합니다.
    • 식의 내용은 EM이 평가하므로 수학 공식, 함수, 복잡한 문자열 및 날짜 처리를 포함할 수 있습니다.
  2. 맞춤화(Tailoring): "파이핑(piping)"이라고도 합니다. 조건에 따라 텍스트를 수정하는 과정입니다.
    • 모든 '대체 필드', 참가자 데이터, 답변 데이터에 접근할 수 있습니다.
    • 질문, 응답 및 그 속성에도 더 쉽게 접근할 수 있습니다.
  3. 관련성 수식: 질문 표시 여부를 제어하는 새로운 질문 속성입니다.
    • 관련성 수식이 있으면 관련성이 참으로 평가될 때만 질문이 표시됩니다.
    • 내부적으로 모든 array_filter 및 array_filter_exclude 명령은 하위 질문 수준의 관련성이 됩니다.
  4. SGQA (과거에 변수 이름을 짓던 방식):
    • 설문조사-그룹-질문-응답(Survey-Group-Question-Answer)의 약자입니다.
    • SGQA 변수 이름은 123X5X382X971과 같은 형태이며 하위 질문 접미사가 붙을 수 있습니다.
    • 이러한 변수 이름은 내부 S/Q/G/A 데이터베이스 코드에 종속되므로 변경해야 하는 경우가 많습니다.
  5. 수식 질문 유형: 계산 결과나 보고서를 데이터베이스에 저장하는 새로운 질문 유형입니다.
    • 상용구(Boilerplate) 질문과 비슷하지만 "이 질문 항상 숨기기"를 설정해도 내용이 데이터베이스에 저장됩니다.
  6. 질문 코드: EM에서 선호하는 변수 이름입니다.
    • 질문의 목적을 나타내는 설명적인 이름을 사용할 수 있어 복잡한 로직을 읽기 쉽게 해 줍니다.
    • 유효한 질문 코드는 숫자로 시작하면 안 되므로, 질문 코드로 질문에 번호를 매길 때는 "q1", "q1a", "g1q2"처럼 사용하세요.
    • SPSS나 R로 자료를 내보낼 때 이 값이 변수 이름이 됩니다. 따라서 통계 분석을 한다면 고유한 질문 코드만 만들어야 합니다.


식 스크립트를 꼭 사용해야 하나요?

짧게 답하면 "아니요"입니다. 다만 이는 만들려는 설문조사의 복잡도에 크게 좌우됩니다.

예를 들어 조건 편집기는 설문조사의 질문에 적용할 수 있는 몇 가지 기본적인 식을 제공합니다. 하지만 조건 편집기에는 한계가 있습니다. 그래서 식 스크립트를 사용하며, 식 스크립트는 맞춤 설정 가능성의 범위를 넓혀 줍니다.


조건과 관련성 수식을 함께 사용할 수 있나요?

예. 일부 질문에는 조건 편집기를, 다른 질문에는 관련성 수식을 사용할 수 있습니다.

같은 질문에 조건과 식을 함께 설정할 수 없습니다! 조건을 설정하면 관련성 수식 필드에 작성된 식이 조건으로 대체됩니다. 또한 관련성 수식 필드는 더 이상 수동으로 편집할 수 없습니다.

그래도 한 질문 안에서 식과 조건을 함께 사용하는 방법이 있습니다. 위에서 설명했듯이 조건은 관련성 수식 필드를 대체합니다. 조건을 설정한 후 새로 생성된 수식을 확인하여 텍스트 편집기에 복사해 두세요. 그런 다음 조건 편집기에서 새로 생성된 조건을 삭제하고, 질문을 편집하여 텍스트 편집기 파일에 있는 조건 기반 식을 사용하려는 나머지 식과 함께 추가합니다.


조건과 관련성 중 무엇을 선택해야 하나요?

각 방식의 장단점은 다음과 같습니다.

방식 장점 단점
조건 1. 간단한 조건을 만들기 위한 편리한 GUI.
2. GUI가 문서화가 잘 되어 있고 지원팀이 잘 이해하고 있음
1. 단순한 비교만 지원하며 "AND"와 "OR" 조건을 잘 처리하지 못함.
2. 연쇄 조건이 불안정하게 동작함
3. 느림 - 데이터베이스 사용량이 많아 긴 설문조사에서는 속도가 느려질 수 있음.
4. 조건을 다시 불러올 때 문제가 발생했다는 보고가 있음.
5. 질문이 수십, 수백, 수천 개일 때 GUI의 확장성이 좋지 않음.
6. SGQA 이름을 사용해야 하므로 종이 설문조사를 변환하는 데 시간이 걸릴 수 있음.
7. 복잡한 분기에 필요한 로직은 프로그래머가 직접 코딩해야 하는 경우가 많음.
관련성 1. 80개 이상의 함수와 수학/문자열 연산자를 포함한 매우 복잡한 로직을 지원함.
2. 연쇄 로직을 완벽하게 지원함.
3. 빠름 - 추가 데이터베이스 호출이 없어 1000개 이상의 질문이 있는 설문조사도 지원함.
4. SGQA 코드가 필요하지 않으므로 로직을 다시 불러올 때 문제가 없음.
5. 구문 강조가 1000개 이상의 질문이 있는 설문조사에서도 잘 동작함.
6. 기존 종이 설문조사를 전산화하려는 그룹이 쉽고 빠르게 사용할 수 있음.
7. 프로그래머 없이도 반구조화 면접과 역학 조사를 쉽게 지원함.
1. 간단한 조건을 위한 GUI가 없으며 대신 구문 강조를 사용함.


참고:
  • 필요에 더 잘 맞는 방식을 사용하시길 권장합니다.
  • EM 기능에 대한 자세한 설명은 다음 링크를 클릭하세요.

시작하기

EM을 시작하는 가장 좋은 방법은 다음과 같습니다.

  • https://www.limesurvey.org/en/download 에서 최신 안정 버전을 설치합니다.
  • 샘플 설문조사를 가져와서 살펴봅니다.
  • 사용 사례와 방법 안내 및 단계별 예제를 살펴봅니다.
  • EM 문서(이 페이지)를 살펴봅니다.
    • 독립 식 단위 테스트(고급)
      • 모든 EM 함수와 연산자의 사용 예제와 PHP 및 JavaScript 결과를 보여 줍니다.
      • PHP와 JavaScript 버전에서 서로 다른 결과를 내는 함수가 일부 있으므로, 이 페이지를 통해 EM 로직을 그에 맞게 계획할 수 있습니다.

용어

다음 용어는 EM의 기능을 설명할 때 흔히 사용됩니다.

  • 관련성 기반 분기(Relevance-based Branching) - 질문이 관련성이 있으면 표시하고, 그렇지 않으면 표시하지 않습니다(예: 보이지 않게 하고 데이터베이스에 NULL로 표시). 관련성 필드는 질문 편집 패널과 질문 그룹 편집 패널에서 찾을 수 있습니다. 후자는 각 질문에 같은 조건을 복사하지 않고도 그룹 전체에 조건 집합을 적용하거나, 그룹 수준과 질문 수준의 조건부 로직을 결합할 때 사용합니다.
  • 맞춤화(Tailoring) - 어떤 질문을 표시할지 정해지면, 맞춤화(파이핑이라고도 함)는 질문을 어떻게 표시할지를 지정합니다. 이를 통해 {TOKEN:FIRSTNAME}과 같은 단순 치환뿐만 아니라 대상의 성별이나 수에 따른 동사 활용과 명사 어형 변화도 지원할 수 있습니다. 또한 응답자가 다른 질문에 답했는지(또는 어떻게 답했는지)에 따라 응답자에게 전달하는 메시지를 바꿀 수도 있습니다.
  • 수식(Equations) - EM은 식의 결과를 저장하는 수식이라는 새로운 질문 유형을 추가합니다. 수식 결과는 페이지에서 숨기더라도 계산되어 데이터베이스에 기록됩니다. 따라서 숨겨진 점수 계산, 복잡한 수식에 기반한 탐색, 평가, 그리고 데이터베이스 내에 생성되어 저장될 보고서에 사용됩니다.


관련성과 연쇄 관련성

이제 모든 질문 유형에는 질문을 표시할지 여부를 제어하는 관련성 옵션이 있습니다. EM은 설문조사에 나타나는 순서대로 각 관련성 수식을 처리합니다. 식이 참이면(또는 기존 설문조사를 지원하기 위해 식이 없으면) 질문이 표시됩니다. 관련성이 없으면 질문이 숨겨지고 데이터베이스에서 값이 NULL 처리됩니다. 그룹 내에 관련성 있는 질문이 없으면 그룹 전체를 건너뜁니다.

또한 식 안의 변수 중 하나라도 관련성이 없으면 해당 식은 항상 거짓으로 평가됩니다. 이를 통해 연쇄 관련성(Cascading Relevance)이 가능해지므로 각 질문마다 매우 긴 관련성 수식을 작성하지 않아도 됩니다.

질문이 Q1-Q5까지 다섯 개 있고, Q1에 답했을 때만 Q2를, Q2에 답했을 때만 Q3를 표시하는 식으로 진행하려 한다고 가정해 보겠습니다. 관련성 수식은 다음과 같을 수 있습니다.

질문 코드 관련성 질문
Q1 1 이름이 무엇입니까?
Q2 Q1 {Q1}님, 나이가 어떻게 되십니까?
Q3 Q2 {Q2}세이시군요. 결혼하셨습니까?
Q4 Q3 == "Y" {Q1}님, 결혼하신 지 얼마나 되셨습니까?
Q5 Q4 {Q1}님, 자녀가 몇 명 있으십니까?


그룹 수준 관련성

ExpressionScript는 그룹 수준 관련성도 지원합니다. 이를 통해 반복(looping)을 더 쉽게 구현할 수 있습니다. 예를 들어 최대 10개의 대상(제품이나 가구 구성원 등)에 대한 정보를 수집한다고 가정해 보겠습니다. 먼저 후속 질문이 필요한 대상의 수를 파악합니다(예: 가구에 몇 명이 사는지 묻거나 긴 목록에서 좋아하는 제품을 선택하게 함). 후속 질문이 필요한 대상의 수를 알게 되면, 후속 질문 그룹 10개 각각에 {count >= 1}, {count >=2}, ... {count >= 10}과 같은 그룹 수준 관련성을 사용할 수 있습니다. 각 그룹 안에서는 질문 수준의 조건부 로직(예: 각 대상의 성별이나 나이에 따른 후속 질문)을 둘 수 있습니다. 질문 수준과 그룹 수준의 관련성 수식은 AND로 결합되어 표시 여부를 결정합니다.

이러한 예제를 확인하려면 다음 설문조사를 가져오세요: 인구 조사 설문조사 예제.

아래 스크린샷에서 응답자가 최소 한 명의 다른 동거인과 함께 살고 있으면 Person 1 그룹이 표시(즉, 관련성 있음)되는 것을 확인할 수 있습니다.



맞춤화/파이핑

이제 중괄호 안의 모든 내용은 표현식으로 처리됩니다(아래에 설명된 한 가지 예외 제외). 표현식에서는 모든 LimeReplacementFields와 변수(여러 별칭을 통해), 일반적인 모든 수식 연산자(수학, 논리, 비교), 그리고 수십 개의 함수(클라이언트 측에서도 동적으로 작동)를 사용할 수 있습니다.

이러한 수식을 사용하면 다음과 같은 작업을 할 수 있습니다.

  1. 이전 답변을 기반으로 응답자에게 맞춤형 메시지를 조건부로 표시합니다.
  2. 평가 모듈을 사용하지 않고도 평가를 생성하고 그 결과를 표시하거나, 결과에 따라 조건부로 분기하거나 메시지를 표시합니다.
  3. 질문, 응답, 보고서 내에서 동사를 활용하고 명사를 격변화합니다.
  4. 설문조사 마지막의 "응답 표시" 페이지 전에 답변 요약을 표시합니다.


수식

수식이라는 새로운 질문 유형이 있습니다. 텍스트 디스플레이 질문 유형과 비슷하지만, 표시되는 내용의 값을 데이터베이스에 저장한다는 점이 다릅니다. 따라서 수식 질문 텍스트에 평가 계산이 포함되어 있으면 해당 값이 데이터베이스의 변수에 저장되며, 공개 또는 비공개 통계에 표시할 수 있습니다.


구문

이제 중괄호 안에 포함된 모든 내용은 표현식으로 간주됩니다(한 가지 예외: 앞이나 뒤에 공백이 없어야 합니다. 이는 ExpressionScript가 포함된 JavaScript를 처리하려고 하지 않도록 하기 위해 필요합니다).

여는 중괄호 뒤나 닫는 중괄호 앞에 공백이 없다면 표현식이 여러 줄에 걸쳐 있어도 됩니다. 이는 다음과 같이 중첩된 "if()" 문에서 특히 유용합니다.

{if(is_empty(PFTotals),
 '',
 if(PFTotals >= -5 && PFTotals <= -4,
   'Very Soft',
   if(PFTotals >= -3 && PFTotals <= -2,
     'Soft',
     if(PFTotals == -1,
       'Somewhat Soft',
       if(PFTotals == 0,
         'Moderate',
         if(PFTotals == 1,
           'Somewhat Hard',
           if(PFTotals >= 2 && PFTotals <= 3,
             'Hard',
             if(PFTotals >= 4 && PFTotals <= 5,
               'Very Hard',
               ''
             )
           )
         )
       )
     )
   )
 )
)}

ExpressionScript는 다음 구문을 지원합니다.

  • 모든 표준 수학 연산자(예: +,-,*,/,!)
  • 모든 표준 비교 연산자(예: <,<=,==,!=,>,>=, 및 이에 해당하는 lt, le, eq, ne, gt, ge)
  • 괄호(하위 표현식을 그룹화할 수 있음)
  • 조건 연산자(예: &&,| | 및 이에 해당하는 and, or)
  • 작은따옴표 및 큰따옴표 문자열(각각 다른 종류의 따옴표 문자열을 포함할 수 있음)
  • 쉼표 연산자(표현식 목록을 만들고 마지막 결과만 반환할 수 있음)
  • 할당 연산자(=)
  • 미리 정의된 변수(질문, 질문 속성, 답변을 참조) - 예: SGQA 코드
  • 미리 정의된 함수(이미 80개 이상 있으며 더 추가하기 쉽습니다).


연산자

EM 구문은 일반적인 연산자 우선순위를 따릅니다.

레벨 연산자 설명
1 () 그룹화 또는 함수 호출을 위한 괄호
2 ! - + 단항 연산자: not, 부정, 단항 플러스
3 * / 곱하기, 나누기
4 + - 더하기, 빼기
5 < <= > >= lt le gt ge 상대 비교
6 == != eq ne 동등 비교
7 and 논리 AND
8 or 논리 OR
9 = 할당 연산자
10 , 쉼표 연산자
JavaScript와 PHP 간의 일관성을 위해 더하기 연산자(+)는 두 피연산자가 모두 숫자이면 덧셈을 수행하고, 두 피연산자가 모두 숫자가 아닌 문자열이면 연결을 수행합니다. 하지만 의도를 더 명확하게 나타내기 위해 연결에는 "join()" 함수를 사용하는 것이 좋습니다. 또한 문자열을 예상했는데 숫자가 나오거나 그 반대인 경우에 발생하는 예기치 않은 결과를 방지할 수 있습니다.

숫자와 문자열 불일치 및 알파벳순/숫자순 비교에 대한 경고

상대 비교나 동등 비교로 값을 비교할 때는 불일치에 주의하세요. 사용자가 입력한 값(또는 응답 코드로 제공된 값)은 명확하게 숫자인 경우 숫자로 사용할 수 있습니다. 값 중 하나를 "로 묶으면 텍스트/문자열 비교가 수행됩니다. 숫자로 비교하려면 숫자를 "로 묶지 마세요.

예를 들어 Q0.NAOK가 값이 9인 숫자 질문인 경우 Q0.NAOK > "50"은 참입니다. 이는 연산자 >가 숫자 비교가 아닌 알파벳순 비교로 간주하기 때문입니다.

정수 값을 비교하려면 intval(Q0.NAOK) > 50을 사용할 수 있습니다. Q0.NAOK가 숫자가 아니면(비어 있거나 문자열인 경우) intval(Q0.NAOK) === 0이라는 점을 기억하세요. 문자열 값("A" < "B")을 비교하려면 strcmp를 직접 사용하세요: strcmp(Q0.NAOK,"B") 또는 strcmp(Q0.NAOK,"A5").

할당 연산자(=) 사용 시 주의사항

예기치 않은 부작용이 발생할 수 있으므로 꼭 필요한 경우가 아니면 할당 연산자를 사용하지 않는 것이 좋습니다. 예를 들어 이전 답변의 값을 변경하면 해당 질문과 현재 질문 사이의 연쇄 관련성 및 유효성 검사 논리가 다시 계산되지 않으므로, 내부적으로 일관되지 않은 데이터가 생길 수 있습니다(예: 응답된 상태로 남아 있지만 NULL 처리되어야 하는 질문, 또는 건너뛰었지만 응답되어야 하는 질문). 일반적으로 변수에 값을 할당하려면 수식 질문 유형을 생성하고 표현식을 사용하여 값을 설정해야 합니다. 그러나 이 연산자가 정말 필요한 드문 경우가 있어 사용할 수 있게 했습니다.

이 연산자에 대한 주의를 환기하기 위해 구문 수식 내에서 빨간색 글꼴로 표시됩니다("=="와 혼동하지 않도록 하기 위함입니다).



할당 연산자 사용

할당 연산자를 사용하려는 주된 이유는 다음과 같습니다.

  • 기본값을 허용하지 않는 질문(예: 사용자 인터페이스에서 응답 옵션 중 하나를 선택할 수는 있지만 수식을 입력할 수는 없는 라디오 목록)에 수식으로 기본값을 설정해야 하는 경우. 단, LimeSurvey는 수식이 해당 질문에 허용되는 응답 중 하나를 생성하는지 검증할 수 없으므로 주의하세요.
  • 이후 답변을 기반으로 이전 질문의 답변을 강제로 변경해야 하는 경우
  • 기타...


  주의 : 할당은 PHP에서만 수행됩니다. 즉, 값이 같은 페이지에서는 업데이트되지 않고 사용자가 다음 페이지로 이동할 때만 업데이트됩니다. 따라서 같은 페이지에서 다른 표현식과 함께 할당 연산자를 사용할 때는 주의하세요.



이를 위해 표현식 관리자 시스템 전체를 사용할 수 있습니다. 이 용도로는 수식을 사용하는 것이 더 좋습니다.

몇 가지 예:

  • 짧은 텍스트 질문의 응답을 소문자로 설정: {QCODE=strtolower(QCODE.NAOK)};
  • 설문조사 시작 시 배열 질문 유형에 응답 기본값 설정: {Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)};
  • 설문조사 시작 시 배열 텍스트 질문 유형에 응답 기본값 설정: {Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)};
  • 조건에 따라 응답 설정: {QCODE=if(YesNo="Y","A1","")}.

XSS 보안

XSS가 활성화된 경우 표현식 관리자 시스템의 일부 기능을 사용할 수 없습니다.

  • 한 표현식에서 HTML 태그를 시작하고 다른 표현식에서 끝내는 경우
  • URL 내에서 복잡한 표현식을 사용하는 경우


XSS는 모든 LimeSurvey 설치에서 기본적으로 활성화되어 있습니다.


예시 및 해결 방법:

  • {if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}는 XSS 보안이 적용되면 작동하지 않습니다. 이 경우 {if(1,"<strong>information</strong>","information")}를 사용할 수 있습니다.
  • <a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>의 경우, 전체 질문 코드를 사용하는 것은 허용되므로 수식 질문을 사용할 수 있습니다: <a href="/script.php?value={EQUATION.NAOK}">next</a>.


변수 접근

ExpressionScript는 필요한 모든 변수에 대해 읽기 전용 접근을 제공합니다. 하위 호환성을 위해 다음 항목에 대한 접근도 제공합니다.

또한 ExpressionScript에서는 질문 코드(데이터베이스의 질문 테이블에 있는 'title' 열)로 변수를 참조할 수 있습니다. 이는 데이터를 SPSS, R 또는 SAS로 내보낼 때 사용되는 변수 레이블이기도 합니다. 예를 들어 이름, 나이, 성별에 대한 질문이 있다면 해당 변수를 12345X13X22, 12345X13X23, 12345X13X24 대신 name, age, gender로 부를 수 있습니다. 이렇게 하면 누구나 수식을 더 쉽게 읽고 논리를 검증할 수 있으며, 그룹 번호나 질문 번호를 일일이 추적하지 않고도 질문 순서를 바꿀 수 있습니다.

중요: 앞선 페이지나 질문에 있는 변수를 참조하는 것이 더 안전합니다.

또한 ExpressionScript를 사용하면 질문의 여러 속성에 접근할 수 있습니다.


구문 의미 예시 예시 결과
Qcode Qcode.code의 별칭 {implode(',',name,gender)} 'Tom','M'
Qcode.code 질문이 관련성이 있는 경우 선택된 답변 코드(그렇지 않으면 공백), 코드형 질문이 아닌 경우 텍스트 값 {implode(',',name.code,gender.code)} 'Tom','M'
Qcode.NAOK Qcode와 동일 - NAOK에 대한 설명 참조 {gender.NAOK} 'M'
Qcode.value 질문이 관련성이 있는 경우 해당 질문의 평가 값(그렇지 않으면 공백), 코드형 질문이 아닌 경우 텍스트 값 {gender.value} '1'
Qcode.valueNAOK Qcode.value와 동일 - NAOK에 대한 설명 참조 {gender.valueNAOK} '1'
Qcode.shown 질문의 표시 값 {implode(',',name.shown,gender.shown)} 'Tom','Male'
Qcode.question 질문 텍스트 {gender.question} 'What is your gender?'
Qcode.mandatory 질문의 필수 여부(Y/N) {gender.mandatory} 'N'
Qcode.qid 내부 질문 번호(순차 번호 아님) {gender.qid} 337
Qcode.type 질문 유형 {gender.type} 'G'
Qcode.jsName 이 페이지에서 선언되었는지 여부와 관계없이 해당 질문의 올바른 자바스크립트 이름 {gender.jsName} 'java1827X3X337'
Qcode.gid 내부 그룹 번호(순차 번호 아님) {gender.gid} 3
Qcode.qseq 0부터 시작하는 질문의 순차 번호 {gender.qseq} 5
Qcode.gseq 0부터 시작하는 그룹의 순차 번호 {gender.gseq} 1
Qcode.relevanceStatus 질문이 현재 관련성이 있는지 여부(0 또는 1) {gender.relevanceStatus} 1
Qcode.relevance 질문 수준의 관련성 수식 {gender.relevance} '!is_empty(name)'
Qcode.grelevance 그룹 수준의 관련성 수식 {gender.grelevance} 'num_children >= 5'
Qcode.sgqa 이 질문의 SGQA 값 {gender.sgqa} '1827X3X337'


HTML 편집기 문제

HTML 편집기를 사용하면 일부 문자가 HTML 엔티티로 대체됩니다.

  • & → &amp;
  • < → &lt;
  • > → &gt;

HTML 편집기를 사용하는 경우 다음을 사용해야 합니다.

  • &에는 and
  • <에는 lt
  • <=에는 le
  • >에는 gt
  • >=에는 ge


수식 안에 나타나는 HTML을 모두 제거하는 것이 좋습니다. LimeSurvey HTML 편집기를 사용하는 경우 편집기 왼쪽 상단의 "소스" 버튼을 클릭하고 수식과 관련 없는 모든 문자(예:

,
등)를 삭제하십시오.

Qcode 변수 명명

다음은 질문 유형별로 Qcode를 구성하는 방법(및 일부 속성에 접근하는 방법)에 대한 세부 정보입니다. 일반적으로 Qcode는 다음과 같이 구성됩니다.

 QuestionCode . '_' . SubQuestionID . '_' . ScaleId

해설과 기타의 경우 해당 질문 코드는 각각 QuestionCode_comment와 QuestionCode_other입니다.

유형 설명 코드 하위 질문 응답 옵션 척도 응답 코드 표시되는 응답 관련성
5 5점 척도 라디오 버튼 Q1 1-5 {Q1} {Q1.shown} {Q1==3}
B 배열(10점 척도) 라디오 버튼 Q2 L1-L6 1-10 {Q2_L2} {Q2_L2.shown} {Q2_L2==7}
A 배열 (5점 척도) 라디오 버튼 Q3 1-5 1-5 {Q3_1} {Q3_1.shown} {Q3_1>=3}
1 배열(유연한 레이블) 이중 척도 Q4 sq1-sq5 0:a1-a3 1:b1-b3 {Q4_sq1_0} {Q4_sq1_1.shown} {Q4_sq1_1=='b2'}
H 배열(유연함) - 열 형식 Q5 1-5 s,m,t {Q5_1} {Q5_1.shown} {Q5_1=='s'}
F 배열(유연함) - 행 형식 Q6 F1-F5 1-5 {Q6_F3} {Q6_F3.shown} {Q6_F3==4}
E 배열 (증가, 동일, 감소) 라디오 버튼 Q7 1-7 I,S,D {Q7_4} {Q7_4.shown} {Q7_4=='D'}
: 배열(다중 유연) 1~10 Q8 ls1,todo,ls2 min,max,avg {Q8_ls1_max} {Q8_ls2_avg.shown} {Q8_ls2_min==7}
; 배열(다중 유연) 텍스트 Q9 hp,st,sw 1st,2nd,3rd {Q9_hp_3rd} {Q9_hp_3rd.shown} {Q9_hp_3rd=='Peter'}
C 배열(예/불확실/아니오) 라디오 버튼 Q10 1-5 Y,N,U {Q10_1} {Q10_1.shown} {Q10_3=='Y'}
X 상용구 질문 Q11 {Q11.shown}
D 날짜 Q12 {Q12} {Q12.shown}
* 수식 Q13 {Q13} {Q13.shown} {Q13>5}
~124~ 파일 업로드(업로드된 파일 수를 기록) Q14 {Q14} {Q14>0}
G 성(姓) 드롭다운 목록 Q15 M,F {Q15} {Q15.shown} {Q15=='M'}
U 대량 자유 서술 Q16 {Q16} {Q16.shown} {strlen(Q16)>100}
I 언어 질문 Q17 {Q17} {Q17.shown} {Q17=='en'}
! 목록 - 드롭다운 Q18 1-5 {Q18} {Q18.shown} {Q18==3}
L 목록 드롭다운/라디오 버튼 목록 Q19 A-Z {Q19} {Q19.shown} {Q19=='X'}
O 해설있는 목록 드롭다운/라디오 버튼 목록 + 텍스트 영역 Q20 A-F {Q20},{Q20comment} {Q20.shown} {Q20=='B'}
T 장문 자유 서술 Q21 {Q21} {Q21.shown} {strstr(Q21,'hello')>0}
M 다수 답안 체크박스 Q22 A-F, other {Q22_E}, {Q22_other} {Q22_E.shown}, {Q22_other.shown} {Q22_E=='Y'}
P 해설있는 다중 선택 체크박스 + 텍스트 Q23 A-F {Q23_D}, {Q23_Dcomment} {Q23_D.shown} {!is_empty(Q23)}
K 숫자 여러 개 질문 Q24 self,mom,dad {Q24_self} {Q24_self.shown} {Q24_self>30}
Q 짧은 서술 여러 개 Q25 A-F {Q25_B} {Q25_B.shown} {substr(Q25_B,1,1)=='Q'}
N 숫자 질문 유형 Q26 {Q26} {Q26.shown} {Q26 > 30}
R 순위 방식 Q27 1-4 {Q27_1} {Q27_1.shown} {Q27_1==3}
S 짧은 자유 서술 Q28 {Q28} {Q28.shown} {Q28=='mine'}
Y 예/아니오 라디오 버튼 Q29 {Q29} {Q29.shown} {Q29=='Y'}


NAOK 사용

NAOK --> "Not Applicable"(NA, 해당 없음)도 괜찮음(OK)


NAOK를 사용한다는 것은 일부 또는 모든 변수가 관련성이 없어도(예: "Not Applicable"(NA, 해당 없음)도 괜찮음(OK)) 된다는 의미입니다.

예를 들어, Q1의 하위 질문 중 하나가 필터링되면 count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4)는 항상 빈 문자열을 반환합니다. 이러한 질문에서 선택된 하위 질문의 수를 세려면 count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK)를 사용할 수 있습니다. 하위 질문이 숨겨져 있으면 EM은 빈 문자열을 반환합니다.

NAOK를 사용하지 않으면 질문 하나 또는 하위 질문 하나가 숨겨져 있을 때 EM은 항상 빈 문자열을 반환합니다(false를 반환하는 것과 동일).

.shown은 항상 NAOK 방식을 사용합니다(숨겨진 경우 빈 문자열을 반환). 그러나 응답 코드가 필요한 경우에는 질문 코드 뒤에 .NAOK를 추가하는 것이 좋습니다(필요하며 그 동작을 정확히 알고 있는 경우는 제외).

자세한 내용은 연쇄 조건 재정의 하위 섹션에서 확인할 수 있습니다.


예약 변수 "this", "self", "that"

답변이 완료된 하위 질문의 수를 세거나 점수를 합산하는 등 질문의 모든 부분을 평가해야 하는 경우가 많습니다. 또는 질문의 특정 행이나 열만 처리해야 할 때도 있습니다(예: 행 또는 열의 합계를 구하여 데이터베이스에 저장). 이러한 예약 변수를 사용하면 이 과정을 비교적 간단하게 처리할 수 있습니다.


"This" 변수

"this" 변수는 "질문 유효성 방정식" 및 "하위 질문 유효성 검사식" 옵션 내에서만 사용됩니다(후자는 GUI에서는 사용할 수 없습니다). 이 변수는 해당 질문 내 각 셀의 변수 이름으로 확장됩니다. 따라서 각 항목이 3보다 큰지 확인하려면 "하위 질문 유효성 검사식"을 (this > 3)으로 설정하면 됩니다.


"Self" 변수

"self" 및 "that" 변수는 더 강력하며, 수식을 처리하기 전에 확장되는 매크로로 작동합니다. "self" 변수에 사용할 수 있는 구문은 다음과 같습니다.

  • self
  • self.suffix
  • self.sub-selector
  • self.sub-selector.suffix
  1. suffix는 일반적인 qcode 접미사 중 하나입니다(예: NAOK, value, shown).
  1. sub-selector는 다음 중 하나일 수 있습니다:
  • comments - 해설인 하위 질문만 선택합니다(예: 해설있는 다중 선택 및 해설있는 목록);
  • nocomments - 해설이 아닌 하위 질문만 선택합니다;
  • sq_X - X는 행 또는 열 식별자입니다. 패턴 X와 일치하는 하위 질문만 선택됩니다. 검색은 전체 코드 식별자를 대상으로 수행되며, sq_X는 nX, X, Xn 형태의 하위 질문과 일치하여 포함합니다(예: sq_1을 사용하면 하위 질문 a1, 1a, 1, 11 또는 001이 포함됩니다). 하위 질문 코드가 QCODE_SQCODE_1 및 QCODE_SQCODE_1인 이중 척도 질문 유형과, 하위 질문 코드가 QCODE_1, QCODE_2 ...인 순위 질문 유형에 주의하십시오.

예시:

  • 질문의 일부라도 답변되었습니까? -> {count(self.NAOK)>0}
  • 이 질문의 평가 점수는 얼마입니까? -> {sum(self.value)}

이 변수들을 사용하여 행과 열의 합계를 구할 수도 있습니다. 행 A-E와 열 1-5로 구성된 숫자 배열이 있다고 가정해 보겠습니다.

  • 총합계는 얼마입니까? -> {sum(self.NAOK)}
  • 행 B의 합계는 얼마입니까? -> {sum(self.sq_B.NAOK)}
  • 열 3의 합계는 얼마입니까? -> {sum(self.sq_3.NAOK)}


"That" 변수

"that" 변수는 "self" 변수와 비슷하지만 다른 질문을 참조할 수 있습니다. 구문은 다음과 같습니다:

  • that.qname
  • that.qname.suffix
  • that.qname.sub-selector
  • that.qname.sub-selector.suffix

qname은 하위 질문 확장자가 없는 질문 이름입니다. 예를 들어 질문 'q1'을 만들면 'q'도 해당 질문의 qname을 나타냅니다.

예시:

  • 질문 q1의 일부라도 답변되었습니까? -> {count(that.q1.NAOK)>0}
  • q2의 평가 점수는 얼마입니까? -> {sum(that.q2.NAOK)}
  • q3의 총합계는 얼마입니까? -> {sum(that.q3.NAOK)}
  • q4에서 행 C의 합계는 얼마입니까? -> {sum(that.q4.sq_C.NAOK)}
  • q4에서 열 2의 합계는 얼마입니까? -> {sum(that.q4.sq_2.NAOK)}

"self" 및 "that" 변수는 모든 관련성, 유효성 검사 또는 맞춤화에 사용할 수 있습니다.

한 가지 주의할 점은 논리 파일 표시 기능을 사용하면 "self"와 "that"이 확장된 값으로 표시된다는 것입니다. 이를 통해 실제로 생성될 수식을 확인할 수 있으며, 사용자와 EM이 변수의 존재 여부를 검증할 수 있습니다. 수식이 매우 길게 보일 수 있어 혼란스러울 수 있습니다. 그러나 질문을 편집하면 "self" 및/또는 "that"을 사용한 원래 수식을 볼 수 있습니다.

다음과 같은 경우에는 이 변수들을 사용하지 마십시오.
  • 수식에 사용되는 각 변수의 이름을 명시적으로 지정하려는 경우
  • 하위 질문이 없는 변수(예: 단일 답변 질문)를 사용하는 경우. 이러한 경우 변수 앞에 "that"을 붙이는 것은 과도하며, 예기치 않은 결과가 발생할 위험이 있습니다.

함수 사용

ExpressionScript는 아래와 같이 수학 함수, 문자열 함수 및 사용자 정의 함수를 제공합니다. 이 함수들은 PHP와 JavaScript에 대응하는 기능이 있어 서버 측(PHP)과 클라이언트 측(JavaScript)에서 동일하게 작동합니다. 새로운 함수는 쉽게 추가할 수 있습니다.


구현된 함수

현재 다음 함수를 사용할 수 있습니다:

함수 의미 구문
abs 절대값 number abs(number)
acos 아크코사인 number acos(number)
addslashes 슬래시로 문자열 따옴표 처리하기 string addslashes(string)
asin 아크사인 number asin(number)
atan 아크탄젠트 number atan(number)
atan2 두 변수의 아크탄젠트 number atan2(number, number)
ceil 반올림 number ceil(number)
checkdate 그레고리력에서 유효한 날짜이면 true(1)를 반환합니다 bool checkdate(month,day,year)
convert_value 숫자 값의 inputTable과 outputTable을 사용하여 숫자 값을 변환합니다 number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList)
cos 코사인 number cos(number)
count 목록에서 답변된(비어 있지 않은) 질문의 수를 셉니다 number count(arg1, arg12, ..., argN)
countif 목록에서 첫 번째 인수와 같은 값으로 답변된 질문의 수를 셉니다 number countif(matches, arg1, arg2, ... argN)
countifop 목록에서 기준(arg op value)을 통과한 답변된 질문의 수를 셉니다 number countifop(op, value, arg1, arg2, ... argN)
date 지역 날짜/시간 포맷 string date(format [, timestamp=time()])
exp e 지수승 계산 number exp(number)
fixnum 필요한 경우 쉼표를 소수점 구분자로 사용하여 숫자를 표시합니다 string fixnum(number)
floor 반내림 number floor(number)
gmdate GMT 날짜/시간 포맷 string gmdate(format [, timestamp=time()])
html_entity_decode 모든 HTML 엔티티를 해당하는 문자로 변환합니다(항상 ENT_QUOTES와 UTF-8을 사용) string html_entity_decode(string)
htmlentities 변환 가능한 모든 문자를 HTML 엔티티로 변환합니다(항상 ENT_QUOTES와 UTF-8을 사용) string htmlentities(string)
expr_mgr_htmlspecialchars 특수 문자를 HTML 엔티티로 변환합니다(항상 ENT_QUOTES와 UTF-8을 사용) string htmlspecialchars(string)
expr_mgr_htmlspecialchars_decode 특수 HTML 엔티티를 다시 문자로 변환합니다(항상 ENT_QUOTES와 UTF-8을 사용) string htmlspecialchars_decode(string)
idate 지역 시간/날짜를 정수로 표기 string idate(string [, timestamp=time()])
if Excel 스타일의 if(test,result_if_true,result_if_false) if(test,result_if_true,result_if_false)
implode 배열 요소를 문자열로 붙이기 string implode(glue,arg1,arg2,...,argN)
intval 변수의 정수 값을 구하기 int intval(number [, base=10])
is_empty 변수가 비어 있는 것으로 간주되는지 확인합니다 bool is_empty(var)
is_float 변수의 유형이 실수(float)인지 확인합니다 bool is_float(var)
is_int 변수의 유형이 정수인지 확인합니다 bool is_int(var)
is_nan 값이 숫자가 아닌지 확인 bool is_nan(var)
is_null 변수가 NULL 이 아닌지 확인 bool is_null(var)
is_numeric 변수가 숫자 또는 숫자 문자열인지 확인합니다 bool is_numeric(var)
is_string 변수의 유형이 문자열인지 확인합니다 bool is_string(var)
join (New in 2.0 build 130129) 요소를 새 문자열로 붙입니다 join(arg1, arg2, ... argN)
list 비어 있지 않은 값을 쉼표로 구분한 목록을 반환합니다 string list(arg1, arg2, ... argN)
listifop (New in 3.16.1 ) 목록의 질문 중 기준(cmpProp op value)을 통과한 질문에서 지정한 질문 속성(retProp)을 'glue'로 구분한 목록으로 반환합니다 string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN)
ltrim 문자열의 시작 부분에서 공백(또는 다른 문자)을 제거합니다 string ltrim(string [, charlist])
max 최댓값 찾기 number max(arg1, arg2, ... argN)
min 최솟값 찾기 number min(arg1, arg2, ... argN)
mktime 날짜의 UNIX 타임스탬프를 구합니다(6개의 인수는 모두 선택 사항) number mktime([hour [, minute [, second [, month [, day [, year ]]]]]])
modulo-function 나머지(modulo) 함수는 아직 지원되지 않습니다. 대신 floor() 함수를 사용할 수 있습니다 floor(x/y)==(x/y)
nl2br 문자열의 모든 줄 바꿈 앞에 HTML 줄 바꿈을 삽입합니다 string nl2br(string)
number_format 숫자에 천 단위 구분기호 표시 string number_format(number)
pi PI의 가치 number pi()
pow 지수 표현 number pow(base, exp)
quoted_printable_decode quoted-printable 문자열을 8비트 문자열로 변환합니다 string quoted_printable_decode(string)
quoted_printable_encode 8비트 문자열을 quoted-printable 문자열로 변환합니다 string quoted_printable_encode(string)
quotemeta 메타 문자열 따옴표로 싸기 string quotemeta(string)
rand 난수 정수 생성하기. 이 예제를 참조하세요 int rand() OR int rand(min, max)
regexMatch 문자열을 정규표현식과 비교합니다 bool regexMatch(pattern,input)
round 선택한 정확도로 숫자 반올림하기 number round(val [, precision])
rtrim 문자열의 끝 부분에서 공백(또는 다른 문자)을 제거합니다 string rtrim(string [, charlist])
sin 사인 number sin(arg)
sprintf 형식화된 문자열 반환하기 string sprintf(format, arg1, arg2, ... argN)
sqrt 제곱근 number sqrt(arg)
stddev 숫자 목록의 표본 표준 편차를 계산합니다 number stddev(arg1, arg2, ... argN)
str_pad 문자열을 다른 문자열로 채워 지정한 길이로 만듭니다 string str_pad(input, pad_length [, pad_string])
str_repeat 문자열 반복 string str_repeat(input, multiplier)
str_replace 검색 문자열과 일치하는 모든 항목을 대체 문자열로 바꿉니다 string str_replace(search, replace, subject)
strcasecmp Binary safe 대소문자를 구분하지 않는 문자열 비교 int strcasecmp(str1, str2)
strcmp Binary safe 문자열 비교 int strcmp(str1, str2)
strip_tags 문자열에서 HTML과 PHP 태그 없애기 string strip_tags(str, allowable_tags)
stripos 대소문자를 구분하지 않는 유니코드 문자열이 처음 나타나는 위치를 찾습니다(0부터 시작, 찾지 못하면 false 반환) int stripos(haystack, needle [, offset=0])
stripslashes 따옴표로 싸인 문자열에서 따옴표 없애기 string stripslashes(string)
stristr 대소문자를 구분하지 않는 strstr string stristr(haystack, needle [, before_needle=false])
strlen 문자열 길이 구하기 int strlen(string)
strpos 유니코드 문자열이 처음 나타나는 위치를 찾습니다(0부터 시작, 찾지 못하면 false 반환) int strpos(haystack, needle [ offset=0])
strrev 문자열 뒤집기 string strrev(string)
strstr 문자열의 처음 위치 찻기 string strstr(haystack, needle[, before_needle=false])
strtolower 문자열을 소문자로 만듭니다 string strtolower(string)
strtotime 영어로 된 거의 모든 날짜/시간 표현을 Unix 타임스탬프로 변환합니다 int strtotime(string)
strtoupper 문자열을 대문자로 만듭니다 string strtoupper(string)
substr 유니코드 문자열의 일부를 반환합니다 string substr(string, start [, length])
sum 배열 안에 있는 값의 합 계산 number sum(arg1, arg2, ... argN)
sumifop 목록에서 기준(arg op value)을 통과한 답변된 질문의 값을 합산합니다 number sumifop(op, value, arg1, arg2, ... argN)
tan 탄젠트 number tan(arg)
time 현재 UNIX 시간 돌려주기 number time()
trim 문자열의 시작과 끝에서 공백(또는 다른 문자)을 제거합니다 string trim(string [, charlist])
ucwords 문자열에서 각 단어의 첫 글자를 대문자로 만듭니다 string ucwords(string)
unique 모든 답변이 희소한 상태이면, true를 반환합니다 boolean unique(arg1, ..., argN)
계획 중이거나 검토 중인 함수에 대해 더 알아보려면 여기를 클릭하세요.

<span id="Create_new_expression_functions_with_plugin_ (New in 4.0.0 )">

플러그인으로 새 표현식 함수 생성 (New in 4.0.0 )

코어에 없는 새 함수가 필요하면 플러그인으로 생성할 수 있습니다. 이러한 새 함수는 expressionManagerStart 이벤트를 사용하여 생성합니다.

ExpressionScript는 어떤 변수가 로컬인지 알고 있습니다

페이지용 JavaScript를 올바르게 생성하려면 EM이 해당 페이지에 설정된 변수와 그 JavaScript ID(예: document.getElementById(x))를 알고 있어야 합니다. 또한 다른 페이지에 설정된 변수도 알고 있어야 필요한 <input type='hidden' value='x'> 필드가 존재하고 값이 채워져 있는지 확인할 수 있습니다.


연쇄 조건

변수 중 하나라도 관련이 없으면(irrelevant) 전체 수식이 관련 없음(false)이 됩니다. 예를 들어 다음 표에서 N/A는 변수 중 하나가 관련이 없었음을 의미합니다.


연산자 예시 a b 결과
+ (unary) +a N/A false
! !a N/A false
== (or eq) a == b N/A 5 false
== (or eq) a == b N/A 0 false
== (or eq) a == b N/A N/A false
!= (or ne) a != b N/A 5 false
!= (or ne) a != b N/A N/A false
!= (or ne) a != b N/A 0 false
> (or gt) a > b N/A 5 false
>= (or ge) a >= b N/A 5 false
< (or lt) a < b N/A 5 false
<= (or le) a <= b N/A 5 false
and a and b N/A 5 false
and a and b N/A N/A false
or a or b N/A N/A false
or a or b N/A 5 false
+ a + b N/A 5 false
* a * b N/A 5 false
/ a / b 5 N/A false
() (a) N/A false
(exp) (a && b) N/A 5 false
(exp) op (exp) (b + b) > (a && b) N/A 5 false
function sum(a,b,b) N/A 5 false
function max(a,b) N/A 5 false
function min(a,b) N/A 5 false
function implode(', ',a,b,a,b) N/A 5 false
function if(a,a,b) N/A 5 false
function is_empty(a) N/A false
function is_empty(a) 0 (or blank) true
function !is_empty(a) N/A false


연쇄 조건 재정의

관련 있는 모든 응답의 누적 합계를 표시하고 싶다고 가정해 봅시다. 수식 {sum(q1,q2,q3,...,qN)}을 사용해 볼 수 있습니다. 그러나 이 수식은 내부적으로 LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2"),LEMval("q3"),...,LEMval("qN")))로 변환됩니다. 따라서 q1-qN 값 중 하나라도 관련이 없으면 수식은 항상 false를 반환합니다. 이 경우 sum()은 모든 질문에 답변할 때까지 "0"을 표시합니다.

이를 피하려면 각 변수에 ".NAOK" 접미사(Not Applicable is OK, 즉 해당 없음도 허용)를 붙일 수 있습니다. 이 경우 다음과 같이 동작합니다. 예를 들어 변수 q1.NAOK가 있다고 가정해 봅시다.

  1. q1은 LEManyNA() 절에 추가되지 않습니다.
  2. LEMval('q1')은 계속해서 답변이 관련 있는지 확인하며, 관련이 없으면 ""를 반환합니다(따라서 관련 없는 개별 답변은 무시되지만 전체 표현식을 무효화하지는 않습니다).

따라서 누적 합계 문제의 해결책은 수식 sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK)을 사용하는 것입니다.

.NAOK 접미사를 사용하면 여러 경로로 진행하다가 나중에 공통 경로로 합쳐지는 설문조사도 설계할 수 있습니다. 예를 들어 응답자가 정상 범위를 벗어난 방식으로 설문조사에 답변했다고 가정해 봅시다. 설문조사 작성자는 유효한 결과를 얻지 못할 수 있음을 알리고, 설문조사를 계속 진행할 것인지 물어볼 수 있습니다. 응답자가 "예"라고 답하면 나머지 질문이 표시됩니다. "나머지 질문"의 조건은 처음 응답이 정상 범위 내에 있었는지, 또는 정상 범위를 벗어난 경우에만 관련 있는 질문에 응답자가 "예"라고 답했는지를 확인합니다.

ExpressionScript는 조건부 마이크로 테일러링을 어떻게 지원하나요?

다음은 마이크로 테일러링의 예시입니다(Question Type=='expr'는 수식을 의미합니다).


질문 코드 관련성 질문 유형 질문
name 1 text What is your name?
age 1 text How old are you?
badage !is_empty(age) expr {(age<16) or (age>80)}
agestop badage message Sorry, {name}, you are too {if( (age<16),'young',if( (age>80),'old','middle-aged') ) } for this test.
kids !badage yesno Do you have children?
parents 1 expr {!badage && kids=='Y'}
numKids parents text How many children do you have?
kid1 parents && numKids >= 1 text How old is your first child?
kid2 parents && numKids >= 2 text How old is your second child?
kid3 parents && numKids >= 3 text How old is your third child?
kid4 parents && numKids >= 4 text How old is your fourth child?
kid5 parents && numKids >= 5 text How old is your fifth child?
sumage 1 expr {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)}
report parents text {name}, you said you are {age} and that you have {numKids}. The sum of ages of your first {min(numKids,5)} kids is {sumage}


위 설문조사 예시를 다운로드하려면 다음 링크를 클릭하십시오: 자녀 수 설문조사 예시.

이 질문들은 모두 한 페이지(예: 같은 그룹)에 있을 수 있으며, 관련 있는 질문만 표시됩니다. 또한 자녀의 나이를 입력하면 마지막 질문의 sum() 표현식이 동적으로 업데이트됩니다.

ExpressionScript는 각 표현식을 이름이 지정된 <span> 요소로 감싸서 이 기능을 제공합니다. 값이 변경될 때마다 해당 <span> 요소에 표시되어야 할 표현식을 다시 계산하여 화면을 갱신합니다. 같은 페이지에 이러한 맞춤형 표현식을 수십 개, 심지어 수백 개까지 사용할 수 있습니다.


구문 강조

표현식을 입력하고 검증하는 데 도움이 되도록 EM은 다음과 같은 기능을 갖춘 구문 강조를 제공합니다.

구문 강조의 유형과 의미

색상 예시 의미 툴팁 설명
황갈색 배경 Sample 전체 수식 없음 중괄호 안에 있고 수식으로 인식되는 모든 내용(예: 앞뒤에 공백이 없는 경우)은 주변 텍스트와 구분되도록 황갈색 배경으로 표시됩니다.
굵은 빨간색 텍스트 Sample 오류 오류에 대한 설명 알 수 없는 변수이거나 함수 오류일 수 있습니다. 설문조사가 정상적으로 동작하지 않으며, 해당 표현식에 의존하는 질문은 응답자에게 표시되지 않습니다.
파란색 텍스트 Sample 함수 이름 의미 및 허용되는 구문 함수 이름 또는 여는 괄호가 뒤따르므로 함수여야 하는 항목을 나타냅니다. 굵은 파란색 텍스트로 표시됩니다. 툴팁에는 함수의 의미와 허용되는 구문이 표시됩니다.
회색 텍스트 Sample 문자열 없음 작은따옴표 또는 큰따옴표로 둘러싸인 문자열은 회색 텍스트로 표시됩니다.
청록색 텍스트 Sample 같은 페이지에 설정된 변수 [name]: 질문; 값; 각 값의 코드를 보여 주는 답변 목록 현재 편집 중인 질문과 같은 페이지에 설정된 모든 변수는 청록색 텍스트로 표시됩니다(JavaScript에서 업데이트될 수 있음). 툴팁에는 변수 이름, 실제 질문, 현재값(설정되지 않은 경우 공백)이 표시됩니다. 질문 유형이 열거된 값 집합에서 답변을 기대하는 경우, 코드와 표시 값의 매핑이 표시됩니다.
녹색 텍스트 Sample 이전 페이지에 설정된 변수 [name]: 질문; 값; 각 값의 코드를 보여 주는 답변 목록 이전 페이지에 설정된 모든 변수는 굵은 녹색 텍스트로 표시됩니다. 툴팁에는 변수 이름, 실제 질문, 현재값(설정되지 않은 경우 공백)이 표시됩니다. 질문 유형이 열거된 값 집합에서 답변을 기대하는 경우, 코드와 표시 값의 매핑이 표시됩니다.
굵은 분홍색 텍스트 Sample 이후 페이지에 설정된 변수 일반적으로 설문조사 시작 시에는 비어 있지만 인덱스 또는 이전 이동으로 채워질 수 있음 [name 또는 SGQA 코드]: 질문; 값; 각 값의 코드를 보여 주는 답변 목록 이후 페이지에 설정된 모든 변수는 굵은 분홍색 텍스트로 표시됩니다. 툴팁에는 변수 이름, 실제 질문, 현재값(설정되지 않은 경우 공백)이 표시됩니다. 질문 유형이 열거된 값 집합에서 답변을 기대하는 경우, 코드와 표시 값의 매핑이 표시됩니다.
굵은 황갈색 텍스트 Sample Lime 대체 값 값 Lime 대체 문자열({TOKEN:xxx}, {PRIVACY_MESSAGE} 등)은 굵은 황갈색 텍스트로 표시됩니다.
빨간색 텍스트 Sample 할당 연산자(=) 경고 메시지 할당 연산자(=)를 사용하면 해당 연산자가 빨간색 텍스트로 표시됩니다. 이는 a == b인지 확인하려던 것을 a = b로 값을 설정하는 실수로 값이 다시 할당되는 일을 방지하기 위한 것입니다.
일반 검은색 텍스트 Sample 구두점 없음 표현식 내의 다른 모든 구두점은 일반 검은색 텍스트로 표시됩니다.
빨간 상자 텍스트 오류 주위를 굵은 빨간 선이 둘러쌈 구문 오류 오류 설명 감지된 모든 구문 오류는 빨간 상자 안에 표시됩니다. 툴팁에는 오류 내용이 표시됩니다. 예를 들면 짝이 맞지 않는 괄호, 정의되지 않은 함수 사용, 함수에 잘못된 개수의 인수 전달, 잘못 구성된 표현식(예: 변수 사이에 연산자 누락), 읽기 전용 변수에 새 값 할당 시도, 변수가 아닌 대상에 값 할당 시도, 지원되지 않는 구문 사용 등이 있습니다. 구문 오류 감지 시스템은 표현식에 오류가 여러 개 있어도 하나만 보고할 수 있지만, 오류가 감지되면 최소 하나는 표시됩니다.


툴팁이란 특정 함수와 변수 위로 마우스를 가져갈 때 표시되는 팝업 메시지를 말합니다.


추가 자료

ExpressionScript 샘플 설문조사

사용 사례 및 방법 안내

단계별 예제

개발자용 참조

로드맵, 현황, 할 일 목록