ExpressionScript 사용법
From LimeSurvey Manual
지금까지 설명한 내용 개요
지금까지 LimeSurvey 매뉴얼의 구성을 따라오셨다면 LimeSurvey 용어는 이미 익히셨을 것입니다. 이어서 설문조사를 더욱 향상시키는 방법을 배우기 위해 표현식과 변수를 살펴보았습니다. 다음 부분에서는 구문 오류를 수정하는 방법을 배우기 위해 구문 강조의 유형과 의미를 살펴보았습니다.
이러한 기본 개념을 익혔으니 이제 예제를 살펴보며 LimeSurvey에서 표현식이 어떻게 동작하는지 설명하겠습니다.
구문 강조
다음 스크린샷은 예제를 보여 주지만 툴팁의 값은 표시하지 않습니다. 툴팁은 굵은 색상의 단어 위에 마우스를 올리면 표시되는 정보 상자입니다.
이 구문 강조 덕분에 복잡한 표현식이라도 올바르게 작성하기가 매우 쉽습니다. LimeSurvey 팀은 표현식 빌더 GUI를 만들 계획이지만, 현재의 구문 강조 기능으로도 오타를 빠르게 찾아 수정할 수 있습니다. 또한 툴팁을 사용하여 표현식이 정확한지 검증할 수 있습니다(예: 원하는 변수를 제대로 선택했는지 확인).
각 예제에는 세 개의 열이 있습니다.
- 소스 - LimeSurvey 질문 필드에 입력하는 원본 텍스트입니다.
- 보기 좋게 출력(Pretty Print) - 입력한 내용에 구문 강조를 적용한 결과입니다.
- 이 강조 표시에서 표현식은 황갈색 배경으로 표시되며 중괄호로 둘러싸이지 않는다는 점에 유의하십시오.
- EM은 재귀적 치환을 지원하므로 강조 표시에 중괄호를 표시하면 구문 오류가 발생합니다.
- 결과 - EM이 소스를 처리할 때 생성되는 출력입니다.
- 올바르게 치환할 수 있는 모든 것은 치환됩니다.
- 오류가 있는 표현식은 구문 강조와 함께 인라인으로 표시됩니다. 오류는 빨간 테두리 상자로 둘러싸입니다.
올바른 구문
다음은 올바른 구문의 예입니다.
- 값: 알려진 변수가 현재 페이지에서 설정되었는지 여부에 따라 색상으로 구분됨을 보여 줍니다.
- 질문 속성: 점 표기법으로 질문의 일부 속성에 접근할 수 있음을 보여 줍니다.
- 수학: 기본 및 복잡한 계산이 지원됨을 보여 줍니다.
- 텍스트 처리: 사용 가능한 텍스트 처리 함수 중 일부를 보여 줍니다.
- 날짜: 사용 가능한 날짜 관련 함수 중 두 가지를 보여 줍니다.
- 조건: if() 함수의 사용법을 보여 줍니다. 선택 항목은 중첩할 수 있습니다.
- 맞춤형 단락: 이전 값에 따라 보고서를 완전히 맞춤 설정할 수 있습니다.
- 문자열 내 EM 처리: 문자열 안에서도 치환할 수 있음을 보여 줍니다. 이 예제는 맞춤형 이미지 이름을 생성합니다.
- EM이 처리하지 않는 중괄호: 중괄호가 이스케이프되었거나 표현식과 중괄호 사이에 공백이 있으면 ES가 해당 표현식을 무시함을 보여 줍니다.

오류가 포함된 EM 구문
다음은 ES 표현식을 입력할 때 자주 발생하는 오류의 예입니다. 툴팁에서 추가 정보를 확인할 수 있습니다.
- 중괄호 뒤에 공백을 추가하지 않은 인라인 Javascript
- "document.write"가 중괄호 바로 뒤에 나오기 때문에 EM은 이를 표현식으로 간주하고, 정의되지 않은 변수와 함수인 "document"와 "write"를 각각 빨간 상자로 표시합니다.
- 알 수 없거나 철자가 잘못된 변수, 함수 및 연산자
- 여기서는 변수 이름으로 "sex" 대신 "gender"를 사용하고 있다는 사실을 잊었지만, EM이 그 오류를 잡아냅니다. 또한 지원되지 않는 연산자인 '++'도 빨간 상자로 표시합니다.
- eq 대신 =를 사용하거나 값 할당을 수행하면 경고
- '='와 '+='가 검은색이 아닌 빨간색 텍스트로 표시되어 있습니다. 마우스를 올리면 값을 할당하고 있다는 경고가 표시됩니다.
- 함수의 인수 개수 오류
- if()는 3개의 인수를 받지만 4개가 전달되었으므로, 빨간 상자로 표시된 "if" 위에 마우스를 올리면 오류 내용과 지원되는 구문이 표시됩니다.
- sum()은 인수 개수에 제한이 없지만 닫는 괄호 앞에 쉼표가 남아 있으므로 해당 부분이 빨간 상자로 표시됩니다.
- 괄호 불일치
- 표현식을 작성할 때 가장 흔한 오류 중 하나입니다.
- 닫는 괄호가 빠진 예 두 가지와 닫는 괄호가 하나 더 많은 예 한 가지를 보여 줍니다.
- 지원되지 않는 구문
- ES가 지원하지 않는 연산자나 문장 부호를 사용하면 빨간 상자로 표시됩니다.
- 잘못된 할당
- 일부 변수는 readWrite이므로 값을 변경할 수 있습니다. 나머지는 읽기 전용입니다.
- 읽기 전용 변수의 값은 변경할 수 없으며, EM은 해당 시도를 빨간 상자로 표시합니다.
- 수식이나 문자열에 값을 할당하려고 해도 오류가 발생합니다.

툴팁이 활성화된 구문 강조의 "라이브" 예제
| 소스 | 보기 좋게 출력 | 결과 |
|---|---|---|
| 툴팁이 포함된 올바른 구문의 예 안녕하세요 {if(gender=='M','Mr.','Mrs.')} {surname}님, 현재 시각은 {date('g:i a',time())}입니다. 귀하의 자녀와 반려동물 {sum(numPets,numKids)}명이 어디에 있는지 아십니까? | 툴팁이 포함된 올바른 구문의 예 안녕하세요 if(gender == 'M','Mr.','Mrs.') surname님, 현재 시각은 date('g:i a',time())입니다. 귀하의 자녀와 반려동물 sum(numPets,numKids)명이 어디에 있는지 아십니까? | 툴팁이 포함된 올바른 구문의 예 안녕하세요 Mr. Smith님, 현재 시각은 6:07 am입니다. 귀하의 자녀와 반려동물 3명이 어디에 있는지 아십니까? |
| 툴팁을 확인할 수 있는 흔한 오류 선언되기 전에 사용된 변수: {notSetYet} 알 수 없는 함수: {iff(numPets>numKids,1,2)} 알 수 없는 변수: {sum(age,num_pets,numKids)} 잘못된 매개변수 개수: {sprintf()},{if(1,2)},{date()} 읽기 전용 변수에 할당:{TOKEN:ATTRIBUTE_1+=10},{name='Sally'} 괄호 불일치: {pow(3,4},{(pow(3,4)},{pow(3,4))} | 툴팁을 확인할 수 있도록 일반적인 오류의 예를 보여 드립니다 선언되기 전에 사용된 변수: notSetYet 알 수 없는 함수: iff(numPets > numKids,1,2) 알 수 없는 변수: sum(age,num_pets,numKids) 잘못된 매개변수 개수: sprintf(),if(1,2),date() 읽기 전용 변수에 값 할당:TOKEN:ATTRIBUTE_1+=10,name='Sally' 괄호 짝이 맞지 않음: pow(3,4,(pow(3,4),pow(3,4)) | 툴팁을 확인할 수 있도록 일반적인 오류의 예를 보여 드립니다 선언되기 전에 사용된 변수: notSetYet 알 수 없는 함수: iff(numPets > numKids,1,2) 알 수 없는 변수: sum(age,num_pets,numKids) 잘못된 매개변수 개수: sprintf(),if(1,2),date() 읽기 전용 변수에 값 할당:TOKEN:ATTRIBUTE_1+=10,name='Sally' 괄호 짝이 맞지 않음: pow(3,4,(pow(3,4),pow(3,4)) |
| Here is some of the unsupported syntax No support for '++', '--', '%',';': {min(++age, --age,age % 2);} Nor '|', '&', '^': {(sum(2 | 3,3 & 4,5 ^ 6)}} Nor arrays: {name[2], name['mine']} | Here is some of the unsupported syntax No support for '++', '--', '%',';': min( ++ age, -- age,age % 2) ; Nor '|', '&', '^': (sum(2 | 3,3 & 4,5 ^ 6)} Nor arrays: name [ 2 ] ,name [ 'mine' ] | Here is some of the unsupported syntax No support for '++', '--', '%',';': min( ++ age, -- age,age % 2) ; Nor '|', '&', '^': (sum(2 | 3,3 & 4,5 ^ 6)} Nor arrays: name [ 2 ] ,name [ 'mine' ] |
맞춤화 예제
"{Mr}/{Mrs} Smith님께..."
if() 함수를 사용하여 'Mr.' 또는 'Mrs.' 중 무엇을 표시할지 조건에 따라 선택합니다.
구문은 if(test,do_if_true,do_if_false)입니다.
| # | 코드 | 질문 | 유형 |
| 1 | gender | 성별이 무엇입니까? | 성(姓) |
| 2 | example1 | {if(gender=='M','Mr.','Mrs.')} Smith님께, ... | 장문 자유 서술 |

아래에서 볼 수 있듯이, "Mr"와 "Mrs"는 응답자가 질문 "gender"에 대해 선택한 응답에 맞게 조정됩니다.

초대 이메일에서 "{Mr}/{Mrs} Smith님께..."
토큰 테이블의 속성을 사용하여 위 예제를 초대 이메일에서도 사용할 수 있습니다. if() 함수를 사용하여 이메일에 'Mr.' 또는 'Mrs.' 중 무엇을 사용할지 선택합니다.
구문은 "if(test,do_if_true,do_if_false)"입니다.
| # | 속성 | 값 |
| 1 | 성 | Smith |
| 2 | 이메일 주소 | test@test.com |
| 3 | ATTRIBUTE_2 | M |
초대 이메일의 텍스트:
Dear {if(ATTRIBUTE_2=='M','Mr','Mrs')} {LASTNAME},
you have been invited to participate in a survey:
https:/...

이메일 보기:

계산 / 평가 예제
런타임에 평가 값을 계산하고 결과를 설문조사 데이터에 저장
이 예제는 관련성(Relevance), 맞춤화, 수식 질문 유형을 포함한 EM의 모든 기능을 사용합니다.
또한 이 모든 기능이 JavaScript를 지원하므로, 페이지에 이러한 기능이 있으면 응답자가 응답을 입력하거나 변경할 때 내용이 동적으로 바뀝니다.
| # | 코드 | 질문 | 유형 | 관련성 |
| 1 | numKids | 자녀가 몇 명입니까? | 숫자 입력 | 1 |
| 2 | kid1 | 첫째 자녀는 몇 살입니까? | 숫자 입력 | numKids >= 1 |
| 3 | kid2 | 둘째 자녀는 몇 살입니까? | 숫자 입력 | numKids >= 2 |
| 4 | kid3 | 셋째 자녀는 몇 살입니까? | 숫자 입력 | numKids >= 3 |
| 5 | kid4 | 넷째 자녀는 몇 살입니까? | 숫자 입력 | numKids >= 4 |
| 6 | sumKidAges | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK)} | 수식 | 1 |
| 7 | kidSummary | You said that you have {numKids}. {if(numKids==1,'child','children')}. {if(numKids>1,implode(' ','The sum of ages of your first ',min(numKids,4),' kids is ',sumKidAges,'.'),' ')} | 텍스트 디스플레이 | 1 |
이 예제를 다운로드하려면 다음 링크를 클릭하십시오: 평가 설문조사 예제.
아래에서 대표적인 질문의 스크린샷을 확인할 수 있습니다. 보시다시피 EM은 맞춤 설정(tailoring)이 포함될 수 있는 모든 필드를 구문 강조 표시합니다. 여기에서는 관련성(Relevance), 수식 질문 유형, 질문 내 치환에 대한 구문 강조 표시 예시를 볼 수 있습니다. 도움말, 그룹 헤더 표시, 환영 메시지, 종료 메세지에서도 치환을 사용할 수 있습니다.
다음 예시에서는 관련성이 {numKids >= 2)이므로, 응답자가 자녀가 두 명 이상이라고 응답한 경우에만 이 질문이 표시됩니다.

아래에서 각 변수에 .NAOK 접미사가 붙어 있는 것을 볼 수 있습니다. 이는 EM이 연쇄 관련성(cascading relevance)을 지원하는 방식 때문입니다. .NAOK가 없으면 응답자가 자녀가 4명이라고 응답한 경우(즉, 모든 변수가 관련성이 있는 경우)에만 합계가 계산됩니다. .NAOK를 사용하면 일부 또는 모든 변수가 관련성이 없더라도(예: "해당 없음"(NA)이어도 괜찮음(OK)) 합계를 계산하겠다는 의미입니다.
그러나 .NAOK 속성은 변수가 EM에 전달되는지 여부에만 영향을 줍니다. 응답자가 처음에 자녀가 3명이라고 응답하고 각각의 나이를 입력한 다음, 마음을 바꿔 2명이라고 응답했다면, 이 경우 세 번째 자녀는 더 이상 "해당 없음"이므로 입력된 세 값의 합계가 표시되지 않아야 합니다.

각각의 개별 표현식은 황갈색 배경으로 색상 구분됩니다. 보시다시피 여기에는 세 개의 개별 표현식이 있습니다. 마지막 표현식에는 자녀가 한 명보다 많은 경우에만 조건부로 표시되는 메시지가 들어 있습니다.

이제 실제로 작동하는 설문조사의 스크린샷을 살펴보겠습니다.
페이지를 처음 방문하면 이와 같은 화면이 표시됩니다. "You have 0 child"가 아니라 "You have 0 children"으로 표시되는 점에 유의하십시오.

자녀 수 값을 1로 변경하면 같은 페이지에서도 화면이 즉시 다음과 같이 바뀝니다.

이제 "You have 1 child"로 문법이 올바르게 표시되는 것을 확인할 수 있습니다.
이제 자녀 수 값을 3으로 변경하면 화면이 즉시 다음과 같이 바뀝니다.
하단에 조건부 메시지가 표시되는 것을 확인할 수 있습니다: "The sum of ages of your first 3 kids is 0."
이제 가상의 자녀들의 나이를 입력하면 나이의 합계가 포함된 다음과 같은 화면이 표시됩니다.

이처럼 값을 입력하는 즉시 점수와 화면이 갱신되므로, 이 기능을 사용하여 평가 점수의 누적 합계를 표시할 수 있습니다.
이제 자녀 수 값을 2로 변경합니다. 화면이 다음과 같이 바뀝니다.

세 번째 자녀에 대해 5.5라는 값을 입력했음에도 불구하고, 보고서에는 이제 처음 두 자녀의 값만 합산되는 점에 유의하십시오.
그 이유는 세 번째 값이 이제 관련성이 없으며, 관련성이 없는 값은 EM에서 적극적으로 무시되기 때문입니다.
자녀 수를 다시 3으로 변경하면 이전에 입력한 5.5라는 값이 다시 표시됩니다. 따라서 페이지에 입력한 정보는 손실되지 않습니다.
그러나 다음 또는 이전 페이지로 이동하면 관련성이 없는 모든 값은 세션과 데이터베이스에서 NULL 처리됩니다. 따라서 값을 2로 유지한 채 다음 페이지로 이동했다가 돌아와서 실제로는 자녀가 3명이라고 응답하면 5.5라는 나이는 더 이상 표시되지 않습니다.
데이터를 입력하고 같은 페이지에서 입력한 내용에 대한 보고서가 동적으로 변경되는 것 확인하기
이 예시는 LimeSurvey의 맞춤 설정(Tailoring) 과정을 보여 줍니다.
이 예시를 다운로드하려면 다음 링크를 클릭하십시오: 동적 변경 설문조사 예시.
처음에 페이지는 다음과 같이 표시됩니다. 거주하는 도시를 묻는 질문만 표시됩니다.

응답을 입력하기 시작하면 맞춤화 과정도 시작됩니다.

응답을 입력하면 페이지 하단의 표가 업데이트되어 응답 코드와 입력한 응답 값이 표시됩니다.

일반적인 디버깅 예제
중첩된 if() 문(조건부 논리)
EM은 조건부 논리 또는 맞춤화를 수행할 수 있도록 "if(test,do_if_true,do_if_false)" 함수를 지원합니다. 이 함수를 중첩하면 "if { } else if { } else { }"와 동일한 기능을 수행할 수 있습니다. 괄호가 균형을 이루지 않거나(예: 닫는 오른쪽 괄호가 누락된 경우) 불필요한 오른쪽 괄호가 있으면 EM이 알려 줍니다. 긴 중첩 if 문을 작성할 때는 괄호의 개수를 세어 보고, 저장한 후 구문 오류를 확인하고, 오류가 있으면 수정하는 것이 좋습니다. 아래 예제를 함께 확인해 보겠습니다.
아래에서 사용하는 질문 그룹은 여기에서 받을 수 있습니다: Tailoring survey example.lsg
먼저 아무것도 입력하지 않으면 "안녕하세요."만 표시됩니다.

이름을 입력하면 "안녕하세요 {name}."라고 표시됩니다.

나이를 입력하면 취학 전 아동인지 여부에 따라 맞춤 메시지가 표시됩니다.

학령기 아동, 청소년 또는 성인의 경우도 마찬가지입니다. 다음은 익명을 원하는 청소년의 예입니다.

다음은 이 그룹의 논리 파일입니다. "if-based" 질문에서 볼 수 있듯이, 사람의 나이에 따라 중첩된 if 문이 사용되었습니다.

이 질문을 처음 편집할 때는 어느 시점에 괄호 개수가 맞지 않을 가능성이 높습니다. 다음은 괄호가 부족한 경우에 나타나는 모습입니다.

빨간색 상자로 둘러싸인 "if" 단어 위에 마우스를 올리면 "Parentheses not balanced"(괄호가 균형을 이루지 않음)라고 표시됩니다. 이 경우 "already an adult!" 뒤에 닫는 괄호가 네 개 있어야 하지만 세 개만 있습니다.
반대로 오른쪽 괄호가 하나 더 많으면 다음과 같이 빨간색 상자로 둘러싸여 표시됩니다.

질문을 실제로 편집할 때 질문은 다음과 같이 표시됩니다.

