ExpressionScript - Presentasi
From LimeSurvey Manual
Pendahuluan
LimeSurvey menggunakan Skrip ekspresi yang memungkinkan LimeSurvey mendukung percabangan, penilaian, validasi, dan penyesuaian yang lebih kompleks. Fitur ini menggantikan cara LimeSurvey mengelola Replacements, Kondisi, dan Penilaian di sisi back-end. Fitur ini juga mempercepat pemrosesan secara signifikan karena menghilangkan sebagian besar pembacaan database saat runtime. Skrip ekspresi dikembangkan oleh Dr. Thomas White (TMSWhite).
Definisi utama
- Ekspresi: Apa pun yang diapit oleh kurung kurawal:
- Selama tidak ada spasi tepat setelah kurung kurawal buka atau sebelum kurung kurawal tutup.
- Isi ekspresi dievaluasi oleh EM, sehingga dapat berisi rumus matematika, fungsi, serta pemrosesan string dan tanggal yang kompleks.
- Penyesuaian (Tailoring): Kadang disebut "piping". Ini adalah proses memodifikasi teks secara bersyarat:
- Anda memiliki akses ke semua 'kolom pengganti', data peserta, dan data tanggapan.
- Anda juga lebih mudah mengakses pertanyaan, jawaban, dan properti-propertinya.
- Persamaan yang berhubungan (Relevance Equation): Atribut pertanyaan baru yang mengontrol visibilitas pertanyaan:
- Jika ada persamaan relevansi, maka pertanyaan hanya ditampilkan jika relevansi bernilai benar.
- Secara internal, semua perintah array_filter dan array_filter_exclude menjadi relevansi tingkat subpertanyaan.
- SGQA (cara variabel dinamai pada masa lalu):
- Singkatan dari Survey-Group-Question-Answer
- Nama variabel SGQA terlihat seperti 123X5X382X971, dan dapat memiliki akhiran subpertanyaan.
- Nama variabel ini spesifik terhadap kode database S/Q/G/A yang mendasarinya, sehingga sering kali perlu diubah
- Persamaan (Equation) sebagai jenis pertanyaan: Jenis pertanyaan baru yang menyimpan perhitungan atau laporan ke database:
- Jenis ini seperti pertanyaan Boilerplate, tetapi isinya disimpan ke database meskipun Anda mengatur "Selalu sembunyikan pertanyaan ini".
- Kode pertanyaan: Ini adalah nama variabel yang disarankan untuk EM:
- Kode ini dapat berupa nama deskriptif yang menunjukkan tujuan pertanyaan, sehingga logika yang kompleks lebih mudah dibaca.
- Kode pertanyaan yang valid TIDAK boleh diawali dengan angka, jadi ketika menggunakan kode pertanyaan untuk menomori pertanyaan, cukup gunakan "q1", "q1a", atau "g1q2".
- Kode ini menjadi nama variabel jika Anda mengekspor data ke SPSS atau R. Jadi, jika Anda melakukan analisis statistik, Anda harus membuat kode pertanyaan yang unik.
Apakah saya harus menggunakan Skrip ekspresi?
Jawaban singkatnya adalah "tidak". Namun, hal ini sangat bergantung pada kompleksitas survei yang ingin Anda buat.
Misalnya, editor Kondisi mencakup beberapa ekspresi dasar yang dapat diterapkan pada pertanyaan survei Anda. Namun, editor Kondisi terbatas. Itulah sebabnya Skrip ekspresi digunakan - ia memperluas cakupan kemungkinan kustomisasi.
Bisakah saya mencampur Kondisi dan Persamaan yang berhubungan?
Ya. Anda dapat menggunakan editor Kondisi untuk beberapa pertanyaan dan Persamaan yang berhubungan untuk pertanyaan lainnya.
Anda tidak dapat mengatur kondisi dan ekspresi sekaligus dalam pertanyaan yang sama! Setelah kondisi diatur, kondisi tersebut menggantikan ekspresi apa pun yang tertulis di kolom persamaan yang berhubungan. Selain itu, kolom Persamaan yang berhubungan tidak dapat lagi diedit secara manual.
Namun, ada cara untuk menggunakan ekspresi dan kondisi sekaligus dalam satu pertanyaan. Seperti disebutkan di atas, kondisi menggantikan kolom persamaan yang berhubungan. Setelah itu, periksa persamaan yang baru dibuat dan salin ke editor teks. Hapus kondisi yang baru dibuat dari editor Kondisi, lalu edit pertanyaan dengan menambahkan ekspresi berbasis kondisi dari berkas editor teks Anda bersama ekspresi lain yang ingin Anda gunakan.
Bagaimana saya memilih antara Kondisi dan Relevansi?
Berikut daftar kelebihan dan kekurangan masing-masing gaya:
| Gaya | Kelebihan | Kekurangan |
|---|---|---|
| Kondisi | 1. GUI yang bagus untuk membuat kondisi sederhana. 2. GUI terdokumentasi dengan baik dan dipahami oleh tim dukungan |
1. Hanya mendukung perbandingan sederhana dan kurang baik dalam menangani kondisi "AND" dan "OR". 2. Kondisi berjenjang bekerja secara tidak menentu 3. Lambat - banyak menggunakan database - dapat memperlambat survei yang panjang. 4. Ada beberapa masalah yang dilaporkan saat memuat ulang kondisi. 5. GUI tidak berskala dengan baik ketika ada puluhan, ratusan, atau ribuan pertanyaan. 6. Konversi survei berbasis kertas bisa lambat karena harus menggunakan nama SGQA. 7. Sering kali membutuhkan programmer untuk membuat kode logika khusus bagi percabangan yang kompleks. |
| Relevansi | 1. Mendukung logika yang sangat kompleks, termasuk 80+ fungsi dan operator matematika/string. 2. Dukungan sempurna untuk logika berjenjang. 3. Cepat - tanpa panggilan database tambahan, mendukung survei dengan 1000+ pertanyaan. 4. Tidak ada masalah saat memuat ulang logika karena tidak memerlukan kode SGQA. 5. Penyorotan sintaks berskala hingga survei dengan 1000+ pertanyaan. 6. Mudah dan cepat digunakan oleh kelompok yang ingin mengomputerisasi survei berbasis kertas yang sudah ada. 7. Mendukung wawancara semi-terstruktur dan survei epidemiologi dengan mudah tanpa memerlukan programmer. |
1. Tidak ada GUI untuk kondisi sederhana - sebagai gantinya menggunakan penyorotan sintaks. |
- Kami menyarankan Anda menggunakan mana pun yang paling sesuai dengan kebutuhan Anda.
- Untuk penjelasan yang lebih rinci tentang fitur EM, klik tautan berikut.
Memulai
Cara terbaik untuk memulai dengan EM adalah:
- Instal versi stabil terbaru dari https://www.limesurvey.org/en/download.
- Impor dan jelajahi beberapa survei contoh.
- Jelajahi kasus penggunaan dan panduan cara, serta contoh langkah demi langkah.
- Jelajahi dokumentasi EM (halaman ini)
- Unit Test Ekspresi Terisolasi (lanjutan)
- menampilkan contoh penggunaan semua fungsi dan operator EM, serta hasil PHP dan JavaScript;
- perhatikan bahwa ada beberapa fungsi yang menghasilkan hasil berbeda pada versi PHP dan JavaScript, sehingga halaman ini membantu Anda merencanakan logika EM dengan tepat.
- Unit Test Ekspresi Terisolasi (lanjutan)
Terminologi
Kata-kata berikut umum digunakan untuk menjelaskan kemampuan EM:
- Percabangan berbasis relevansi - jika sebuah pertanyaan relevan, maka tanyakan, jika tidak jangan (misalnya, buat tidak terlihat dan tandai sebagai NULL di database). Anda dapat menemukan kolom Relevansi di panel editor pertanyaan maupun di panel editor grup pertanyaan. Yang terakhir digunakan untuk menerapkan sekumpulan kondisi pada seluruh grup tanpa harus menyalin kondisi yang sama ke setiap pertanyaan, dan/atau menggabungkan logika bersyarat tingkat grup dan tingkat pertanyaan).
- Penyesuaian (Tailoring) - Setelah Anda mengetahui pertanyaan mana yang harus ditanyakan, penyesuaian (kadang disebut piping) menentukan bagaimana pertanyaan tersebut ditanyakan. Ini memungkinkan Anda mendukung tidak hanya substitusi sederhana (seperti {TOKEN:FIRSTNAME}), tetapi juga konjugasi kata kerja dan deklinasi kata benda berdasarkan jenis kelamin atau jumlah subjek Anda. Ini juga memungkinkan Anda mengubah pesan yang Anda sampaikan kepada responden survei berdasarkan apakah mereka menjawab (atau bagaimana mereka menjawab) pertanyaan lain.
- Persamaan - EM menambahkan jenis pertanyaan baru bernama Persamaan yang menyimpan hasil sebuah Ekspresi. Hasil persamaan dihitung dan ditulis ke database, bahkan jika Anda menyembunyikannya di halaman. Dengan demikian, jenis ini digunakan untuk perhitungan skor tersembunyi, navigasi berdasarkan persamaan kompleks, penilaian, dan laporan yang akan dihasilkan dan disimpan dalam database.
Relevansi dan Relevansi Berjenjang
Setiap jenis pertanyaan kini memiliki opsi Relevansi yang mengontrol apakah pertanyaan ditampilkan atau tidak. EM memproses setiap Persamaan yang berhubungan sesuai urutan kemunculannya dalam survei. Jika ekspresi bernilai benar (atau tidak ada - untuk mendukung survei lama), pertanyaan akan ditampilkan. Jika tidak relevan, pertanyaan akan disembunyikan, dan nilainya akan di-NULL-kan di database. Jika tidak ada pertanyaan yang relevan dalam sebuah grup, seluruh grup akan dilewati.
Selain itu, jika salah satu variabel dalam ekspresi tidak relevan, maka ekspresi tersebut selalu bernilai salah. Hal ini memungkinkan Relevansi Berjenjang sehingga Anda tidak perlu menulis Persamaan yang berhubungan yang sangat panjang untuk setiap pertanyaan.
Misalkan Anda memiliki lima pertanyaan Q1-Q5, dan Anda hanya ingin menampilkan Q2 jika Q1 dijawab, dan Q3 jika Q2 dijawab, dan seterusnya. Persamaan relevansinya dapat berupa:
| Kode pertanyaan | Relevansi | Pertanyaan |
|---|---|---|
| Q1 | 1 | Siapa nama Anda? |
| Q2 | Q1 | {Q1}, berapa usia Anda? |
| Q3 | Q2 | Jadi, usia Anda {Q2} tahun. Apakah Anda sudah menikah? |
| Q4 | Q3 == "Y" | {Q1}, sudah berapa lama Anda menikah? |
| Q5 | Q4 | Berapa jumlah anak Anda, {Q1}? |
Relevansi Tingkat Grup
ExpressionScript juga mendukung relevansi tingkat grup. Hal ini mempermudah penerapan perulangan (looping). Misalkan Anda ingin mengumpulkan informasi dari hingga 10 entitas (seperti produk atau orang dalam satu rumah tangga), di mana Anda terlebih dahulu menentukan berapa banyak entitas yang memerlukan tindak lanjut (misalnya dengan menanyakan berapa banyak orang yang tinggal di rumah tangga atau meminta orang mencentang produk mana yang mereka sukai dari daftar panjang). Setelah mengetahui berapa banyak entitas yang memerlukan tindak lanjut, Anda dapat menggunakan relevansi tingkat grup seperti {count >= 1}, {count >=2}, ... {count >= 10} untuk masing-masing dari 10 grup pertanyaan tindak lanjut. Dalam setiap grup, Anda dapat memiliki logika bersyarat tingkat pertanyaan (misalnya, pertanyaan tindak lanjut khusus jenis kelamin atau usia untuk setiap subjek). Persamaan relevansi tingkat pertanyaan dan tingkat grup digabungkan dengan AND untuk menentukan mana yang harus ditampilkan.
Untuk melihat contoh tersebut, impor survei berikut: Contoh survei sensus.
Pada tangkapan layar di bawah dapat dilihat bahwa grup Person 1 ditampilkan (atau relevan) jika responden tinggal bersama setidaknya satu penghuni lain:

Penyesuaian/Piping
Apa pun di dalam kurung kurawal kini diperlakukan sebagai ekspresi (dengan satu pengecualian yang dijelaskan di bawah). Ekspresi memiliki akses ke semua LimeReplacementFields dan variabel (melalui beberapa alias), semua operator persamaan yang umum (matematika, logika, dan perbandingan), serta puluhan fungsi (yang bahkan bekerja secara dinamis di sisi klien).
Dengan menggunakan persamaan ini, Anda dapat melakukan hal-hal seperti:
- Menampilkan pesan yang disesuaikan kepada responden secara bersyarat berdasarkan tanggapan sebelumnya;
- Membuat penilaian dan menampilkan hasil penilaian (atau membuat percabangan atau menampilkan pesan secara bersyarat) berdasarkan hasil tersebut, tanpa menggunakan modul penilaian itu sendiri;
- Mengonjugasikan kata kerja dan mengubah bentuk kata benda di dalam pertanyaan, jawaban, dan laporan;
- Menampilkan ringkasan tanggapan sebelum halaman "Tampilkan jawaban Anda" di akhir survei.
Persamaan
Ada jenis pertanyaan baru bernama Persamaan. Anggap saja seperti jenis pertanyaan Tampilan teks, hanya saja jenis ini menyimpan nilai dari apa yang ditampilkan ke dalam basis data. Jadi, jika teks pertanyaan Persamaan berisi perhitungan penilaian, nilai tersebut akan disimpan di basis data dalam sebuah variabel yang dapat ditampilkan dalam statistik publik atau pribadi.
Sintaks
Apa pun yang berada di dalam kurung kurawal kini dianggap sebagai ekspresi (dengan satu pengecualian: tidak boleh ada spasi di awal atau di akhir - hal ini diperlukan agar ExpressionScript tidak mencoba memproses JavaScript yang tertanam).
Perhatikan bahwa ekspresi boleh terdiri dari beberapa baris, selama tidak ada spasi setelah kurung kurawal pembuka atau sebelum kurung kurawal penutup. Hal ini sangat berguna untuk pernyataan "if()" bersarang seperti ini:
{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 mendukung sintaks berikut:
- Semua operator matematika standar (mis. +,-,*,/,!);
- Semua operator perbandingan standar (mis. <,<=,==,!=,>,>=, beserta padanannya: lt, le, eq, ne, gt, ge);
- Tanda kurung (sehingga Anda dapat mengelompokkan subekspresi);
- Operator kondisional (mis. &&,| | beserta padanannya: and, or);
- String dengan tanda kutip tunggal dan ganda (yang masing-masing dapat menyematkan string dengan jenis kutip lainnya);
- Operator koma (sehingga dapat memiliki daftar ekspresi dan hanya mengembalikan hasil akhirnya);
- Operator penugasan (=);
- Variabel yang telah ditentukan (untuk merujuk ke pertanyaan, atribut pertanyaan, dan tanggapan) - mis. kode SGQA;
- Fungsi yang telah ditentukan (saat ini sudah ada 80+, dan mudah untuk menambahkan lebih banyak).
Operator
Sintaks EM mengikuti prioritas operator yang normal:
| Tingkat | Operator | Deskripsi |
|---|---|---|
| 1 | () | tanda kurung untuk pengelompokan atau pemanggilan fungsi |
| 2 | ! - + | operator unary: not, negasi, unary-plus |
| 3 | * / | kali, bagi |
| 4 | + - | tambah, kurang |
| 5 | < <= > >= lt le gt ge | perbandingan relatif |
| 6 | == != eq ne | perbandingan kesetaraan |
| 7 | and | AND logika |
| 8 | or | OR logika |
| 9 | = | operator penugasan |
| 10 | , | operator koma |
Peringatan terkait ketidakcocokan angka dan string serta perbandingan alfabetis/numerik
Saat Anda ingin membandingkan nilai dengan perbandingan relatif atau kesetaraan, perhatikan ketidakcocokan tipe. Nilai yang dimasukkan oleh pengguna (atau diberikan melalui kode jawaban) dapat digunakan sebagai angka jika jelas merupakan angka.
Jika Anda mengapit salah satu nilai dengan ", perbandingan teks/string akan dilakukan. Jika Anda ingin membandingkan sebagai angka, jangan pernah mengapit angka dengan ".
Misalnya Q0.NAOK > "50" bernilai benar jika Q0.NAOK adalah pertanyaan numerik dengan nilai 9. Hal ini karena operator > akan menganggapnya sebagai perbandingan alfabetis dan bukan perbandingan numerik.
Untuk memastikan Anda membandingkan nilai bilangan bulat, Anda dapat menggunakan intval(Q0.NAOK) > 50. Ingat bahwa jika Q0.NAOK bukan angka (kosong atau string), maka intval(Q0.NAOK) === 0. Untuk membandingkan nilai string ("A" < "B") gunakan strcmp secara langsung: strcmp(Q0.NAOK,"B") atau strcmp(Q0.NAOK,"A5").
Perhatian dalam menggunakan operator penugasan (=)
Anda sebaiknya menghindari penggunaan operator penugasan kecuali benar-benar diperlukan, karena dapat menimbulkan efek samping yang tidak terduga. Misalnya, jika Anda mengubah nilai tanggapan sebelumnya, logika relevansi berjenjang dan validasi antara pertanyaan tersebut dan pertanyaan saat ini tidak dihitung ulang, sehingga Anda bisa berakhir dengan data yang tidak konsisten secara internal (mis. pertanyaan yang tetap terjawab padahal seharusnya di-NULL-kan, atau pertanyaan yang dilewati padahal seharusnya dijawab). Secara umum, jika Anda ingin menetapkan nilai ke sebuah variabel, Anda sebaiknya membuat pertanyaan jenis Persamaan, dan menggunakan ekspresi untuk menetapkan nilainya. Namun, ada beberapa kasus langka ketika orang benar-benar membutuhkan operator ini, jadi kami menyediakannya.
Sebagai peringatan untuk operator ini, operator tersebut ditampilkan dengan huruf merah di dalam persamaan sintaks (agar Anda tidak mengiranya sebagai "==").
Menggunakan operator penugasan
Alasan utama Anda mungkin ingin menggunakan operator penugasan adalah:
- Anda perlu menetapkan nilai default melalui persamaan untuk pertanyaan yang tidak menerima nilai default (seperti daftar radio, di mana antarmuka pengguna memungkinkan Anda memilih salah satu opsi jawaban, tetapi tidak memungkinkan Anda memasukkan persamaan). Namun, berhati-hatilah, karena LimeSurvey tidak dapat memvalidasi bahwa persamaan Anda menghasilkan salah satu jawaban yang diizinkan untuk pertanyaan tersebut;
- Anda perlu mengubah secara paksa tanggapan untuk pertanyaan sebelumnya berdasarkan tanggapan yang muncul kemudian;
- dll...
Anda dapat menggunakan seluruh sistem expression manager untuk tujuan ini. Lebih baik menggunakan Persamaan untuk tujuan ini.
Beberapa contoh:
- Menetapkan jawaban untuk pertanyaan teks pendek menjadi huruf kecil :
{QCODE=strtolower(QCODE.NAOK)}; - Menetapkan jawaban default untuk jenis pertanyaan larik di awal survei :
{Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}; - Menetapkan jawaban default untuk jenis pertanyaan larik teks di awal survei :
{Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}; - Menetapkan jawaban dengan kondisi :
{QCODE=if(YesNo="Y","A1","")}.
Keamanan XSS
Dengan XSS diaktifkan, beberapa bagian dari sistem expression manager tidak dapat digunakan:
- memulai tag HTML dalam satu ekspresi tetapi mengakhirinya di ekspresi lain;
- menggunakan ekspresi yang kompleks di dalam URL.
Contoh dan solusi alternatif:
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}tidak berfungsi dengan keamanan XSS, di sini Anda dapat menggunakan{if(1,"<strong>information</strong>","information")};<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, di sini Anda dapat menggunakan pertanyaan persamaan karena penggunaan kode pertanyaan yang lengkap diperbolehkan :<a href="/script.php?value={EQUATION.NAOK}">next</a>.
Akses ke variabel
ExpressionScript menyediakan akses baca-saja ke variabel apa pun yang mungkin Anda perlukan. Demi kompatibilitas mundur, ExpressionScript menyediakan akses ke hal-hal berikut:
- TOKEN:xxx - nilai sebuah TOKEN (misalnya TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (hanya untuk survei yang tidak anonim).
- Semua nilai {XXX} yang digunakan oleh tema.
- Dalam teks pertanyaan, Anda dapat menggunakan {QID} yang diganti dengan ID pertanyaan dan {SGQ} yang diganti dengan SGQA pertanyaan tersebut.
- {SAVEDID} untuk ID tanggapan saat ini
Selain itu, ExpressionScript memungkinkan Anda merujuk variabel berdasarkan Kode pertanyaan (kolom 'title' pada tabel pertanyaan di dalam basis data). Ini juga merupakan label variabel yang digunakan saat Anda mengekspor data ke SPSS, R, atau SAS. Misalnya, jika Anda memiliki pertanyaan tentang nama, usia, dan jenis kelamin, Anda dapat menyebut variabel tersebut name, age, dan gender sebagai ganti 12345X13X22, 12345X13X23, dan 12345X13X24. Hal ini membuat persamaan lebih mudah dibaca dan logikanya lebih mudah divalidasi oleh siapa pun, serta memungkinkan Anda mengacak urutan pertanyaan tanpa harus melacak nomor grup atau pertanyaan.
Penting: Lebih aman merujuk variabel yang muncul pada halaman atau pertanyaan sebelumnya.
Selanjutnya, ExpressionScript memungkinkan Anda mengakses banyak properti pertanyaan:
| Sintaks | Arti | Contoh | Hasil contoh |
|---|---|---|---|
| Qcode | alias untuk Qcode.code | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | kode tanggapan yang dipilih untuk pertanyaan jika relevan (jika tidak, kosong), atau nilai teks jika bukan pertanyaan berkode | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | sama seperti Qcode - lihat pembahasan tentang NAOK | {gender.NAOK} | 'M' |
| Qcode.value | nilai penilaian untuk pertanyaan jika relevan (jika tidak, kosong), atau nilai teks jika bukan pertanyaan berkode | {gender.value} | '1' |
| Qcode.valueNAOK | sama seperti Qcode.value - lihat pembahasan tentang NAOK | {gender.valueNAOK} | '1' |
| Qcode.shown | nilai tampilan untuk pertanyaan | {implode(',',name.shown,gender.shown)} | 'Tom','Male' |
| Qcode.question | teks pertanyaan | {gender.question} | 'What is your gender?' |
| Qcode.mandatory | apakah pertanyaan bersifat wajib (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | nomor pertanyaan internal (bukan nomor urut) | {gender.qid} | 337 |
| Qcode.type | jenis pertanyaan | {gender.type} | 'G' |
| Qcode.jsName | nama javascript yang benar untuk pertanyaan, terlepas dari apakah dideklarasikan di halaman ini atau tidak | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | nomor grup internal (bukan nomor urut) | {gender.gid} | 3 |
| Qcode.qseq | nomor urut pertanyaan, dimulai dari 0 | {gender.qseq} | 5 |
| Qcode.gseq | nomor urut grup, dimulai dari 0 | {gender.gseq} | 1 |
| Qcode.relevanceStatus | apakah pertanyaan saat ini relevan (0 atau 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | persamaan relevansi tingkat pertanyaan | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | persamaan relevansi tingkat grup | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | nilai SGQA untuk pertanyaan ini | {gender.sgqa} | '1827X3X337' |
Masalah pada editor HTML
Jika Anda menggunakan editor HTML, beberapa karakter diganti dengan entitas HTML.
- & menjadi &
- < menjadi <
- > menjadi >
Jika Anda menggunakan editor HTML, Anda perlu menggunakan:
- and untuk &
- lt untuk <
- le untuk <=
- gt untuk >
- ge untuk >=
Disarankan untuk membersihkan HTML yang muncul di dalam ekspresi Anda. Jika Anda menggunakan editor HTML LimeSurvey, klik tombol "Source" (terletak di bagian kiri atas editor) dan hapus semua karakter yang tidak terkait dengan ekspresi Anda (misalnya
,
, dan sebagainya).
Penamaan variabel Qcode
Berikut detail cara menyusun Qcode (dan mengakses beberapa properti) berdasarkan jenis pertanyaan. Secara umum, Qcode disusun sebagai:
QuestionCode . '_' . SubQuestionID . '_' . ScaleId
Untuk komentar dan lainnya, kode pertanyaan yang sesuai masing-masing adalah QuestionCode_comment dan QuestionCode_other.
| Jenis | Deskripsi | Kode | Subpertanyaan | Opsi jawaban | Skala | Kode jawaban | Jawaban yang ditampilkan | Relevansi |
|---|---|---|---|---|---|---|---|---|
| 5 | 5 Point Choice Radio-Buttons | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | Array (10 Point Choice) Radio-Buttons | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | Array (5 Point Choice) Radio-Buttons | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | Array (Flexible Labels) Dual Scale | Q4 | sq1-sq5 | 0:a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
| H | Array (Flexible) - Column Format | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | Array (Flexible) - Row Format | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | Array (Increase/Same/Decrease) Radio-Buttons | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | Array (Multi Flexi) 1 To 10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | Array (Multi Flexi) Text | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | Array (Yes/Uncertain/No) Radio-Buttons | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | Boilerplate Question | Q11 | {Q11.shown} | |||||
| D | Date | Q12 | {Q12} | {Q12.shown} | ||||
| * | Equation | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | File Upload (records number of files uploaded) | Q14 | {Q14} | {Q14>0} | ||||
| G | Gender Drop-Down List | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | Huge Free Text | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | Language Question | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | List - Dropdown | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | List Drop-Down/Radio-Button List | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | List With Comment Drop-Down/Radio-Button List + Textarea | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | Long Free Text | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | Multiple Choice Checkbox | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | Multiple Choice With Comments Checkbox + Text | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | Multiple Numerical Question | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | Multiple Short Text | Q25 | A-F | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
| N | Numerical Question Type | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
| R | Ranking Style | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | Short Free Text | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | Yes/No Radio-Buttons | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
Penggunaan NAOK
NAOK --> "Not Applicable" (NA) tidak masalah (OK)
Menggunakan NAOK berarti bahwa semua atau sebagian variabel tidak relevan (misalnya "Not Applicable" (NA) tidak masalah (OK)).
Misalnya: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) selalu memberikan string kosong jika salah satu subpertanyaan Q1 difilter. Untuk menghitung jumlah subpertanyaan yang dicentang pada pertanyaan seperti itu, Anda dapat menggunakan count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Jika subpertanyaan disembunyikan, EM mengembalikan string kosong.
Tanpa NAOK, jika satu pertanyaan atau satu subpertanyaan disembunyikan, EM selalu mengembalikan string kosong (sama dengan mengembalikan false).
Sufiks .shown selalu menggunakan sistem NAOK (string kosong jika disembunyikan), tetapi jika Anda memerlukan kode jawaban: sebaiknya selalu tambahkan .NAOK setelah kode pertanyaan (kecuali jika Anda memang membutuhkannya dan tahu apa yang Anda lakukan).
Informasi lebih lanjut tersedia di subbagian Mengesampingkan Kondisi Bertingkat.
Variabel khusus "this", "self", dan "that"
Cukup sering Anda ingin mengevaluasi semua bagian dari sebuah pertanyaan, misalnya menghitung berapa banyak subpertanyaan yang telah dijawab atau menjumlahkan skor. Pada kesempatan lain Anda hanya ingin memproses baris atau kolom tertentu dari sebuah pertanyaan (misalnya mendapatkan jumlah baris atau kolom dan menyimpannya di basis data). Variabel khusus ini membuat proses tersebut relatif mudah.
Variabel "This"
Variabel "this" digunakan secara eksklusif dalam opsi "Persamaan validasi pertanyaan" dan "Persamaan validasi subpertanyaan" (yang terakhir tidak dapat diatur dari GUI). Variabel ini diperluas menjadi nama variabel dari setiap sel di dalam pertanyaan tersebut. Jadi, jika Anda ingin memastikan bahwa setiap entri lebih besar dari tiga, Anda dapat mengatur "Persamaan validasi subpertanyaan" menjadi (this > 3).
Variabel "Self"
Variabel "self" dan "that" lebih canggih, dan berfungsi sebagai makro yang diperluas sebelum persamaan diproses. Pilihan sintaks untuk variabel "self" adalah:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
- sufiks adalah salah satu sufiks qcode normal (misalnya NAOK, value, shown)
- sub-selector dapat berupa salah satu dari berikut:
- comments - hanya subpertanyaan yang berupa komentar (misalnya pilihan ganda dengan komentar dan daftar dengan komentar);
- nocomments - hanya subpertanyaan yang bukan komentar;
- sq_X - dengan X adalah pengenal baris atau kolom. Hanya subpertanyaan yang cocok dengan pola X yang dipilih. Perhatikan bahwa pencarian dilakukan pada pengenal kode lengkap, lalu sq_X mencocokkan dan menyertakan subpertanyaan nX, X, Xn (misalnya jika Anda menggunakan sq_1, subpertanyaan a1, 1a, 1, 11 atau 001 akan disertakan). Berhati-hatilah pada jenis pertanyaan skala ganda, di mana kode subpertanyaan berupa QCODE_SQCODE_1 dan QCODE_SQCODE_1, serta pada jenis pertanyaan peringkat, di mana kode subpertanyaan berupa QCODE_1,QCODE_2 ....
Contoh:
- Apakah ada bagian dari pertanyaan yang sudah dijawab? -> {count(self.NAOK)>0}
- Berapa skor penilaian untuk pertanyaan ini? -> {sum(self.value)}
Anda juga dapat menggunakannya untuk mendapatkan total baris dan kolom. Misalkan Anda memiliki larik angka dengan baris A-E dan kolom 1-5.
- Berapa total keseluruhan? -> {sum(self.NAOK)}
- Berapa total baris B? -> {sum(self.sq_B.NAOK)}
- Berapa total kolom 3? -> {sum(self.sq_3.NAOK)}
Variabel "That"
Variabel "that" adalah seperti variabel "self", tetapi memungkinkan Anda merujuk ke pertanyaan lain. Sintaksnya adalah:
- that.qname
- that.qname.sufiks
- that.qname.sub-selector
- that.qname.sub-selector.sufiks
qname adalah nama pertanyaan tanpa ekstensi subpertanyaan apa pun. Jadi, mari buat pertanyaan 'q1', dengan 'q' yang juga mewakili qname-nya.
Contoh:
- Apakah ada bagian dari pertanyaan q1 yang sudah dijawab? -> {count(that.q1.NAOK)>0}
- Berapa skor penilaian untuk q2? -> {sum(that.q2.NAOK)}
- Berapa total keseluruhan q3? -> {sum(that.q3.NAOK)}
- Berapa total baris C pada q4? -> {sum(that.q4.sq_C.NAOK)}
- Berapa total kolom 2 pada q4? -> {sum(that.q4.sq_2.NAOK)}
Variabel "self" dan "that" dapat digunakan dalam relevansi, validasi, atau penyesuaian (tailoring) apa pun.
Satu hal yang perlu diperhatikan: saat Anda menggunakan fitur Show logic file, fitur ini akan menampilkan nilai "self" dan "that" yang sudah diperluas. Dengan begitu Anda dapat melihat persamaan sebenarnya yang akan dihasilkan sehingga Anda (dan EM) dapat memvalidasi apakah variabel tersebut ada atau tidak. Hal ini mungkin tampak membingungkan karena Anda dapat melihat persamaan yang cukup panjang. Namun, jika Anda mengedit pertanyaan, Anda akan melihat persamaan asli yang menggunakan "self" dan/atau "that".
- Anda ingin menyebutkan secara eksplisit setiap variabel yang digunakan dalam persamaan, atau
- menggunakan variabel yang tidak memiliki subpertanyaan (misalnya pertanyaan dengan satu jawaban). Dalam kasus tersebut, menambahkan awalan "that" pada variabel berlebihan, dan Anda berisiko mendapatkan hasil yang tidak terduga.
Akses ke fungsi
ExpressionScript menyediakan akses ke fungsi matematika, string, dan fungsi yang ditentukan pengguna, seperti yang ditunjukkan di bawah. ExpressionScript memiliki padanan PHP dan JavaScript untuk fungsi-fungsi ini sehingga bekerja identik di sisi server (PHP) dan sisi klien (JavaScript). Menambahkan fungsi baru sangat mudah.
Fungsi yang diimplementasikan
Fungsi berikut saat ini tersedia:
| Fungsi | Arti | Sintaks |
|---|---|---|
| abs | Nilai mutlak | number abs(number) |
| acos | Arc cosinus | number acos(number) |
| addslashes | Mengapit string dengan garis miring | string addslashes(string) |
| asin | Arc sinus | number asin(number) |
| atan | Arc tangen | number atan(number) |
| atan2 | Arc tangen dari dua varibel | number atan2(number, number) |
| ceil | Bulatkan pecahan ke atas | number ceil(number) |
| checkdate | Mengembalikan true(1) jika tanggal valid dalam kalender gregorian | bool checkdate(month,day,year) |
| convert_value | Mengonversi nilai numerik menggunakan inputTable dan outputTable berisi nilai numerik | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | Cosinus | number cos(number) |
| count | Menghitung jumlah pertanyaan yang dijawab (tidak kosong) dalam daftar | number count(arg1, arg12, ..., argN) |
| countif | Menghitung jumlah pertanyaan yang dijawab dalam daftar yang sama dengan argumen pertama | number countif(matches, arg1, arg2, ... argN) |
| countifop | Menghitung jumlah pertanyaan yang dijawab dalam daftar yang memenuhi kriteria (arg op value) | number countifop(op, value, arg1, arg2, ... argN) |
| date | Format tanggal/waktu lokal | string date(format [, timestamp=time()]) |
| exp | Menghitung eksponen dari e | number exp(number) |
| fixnum | Menampilkan angka dengan koma sebagai pemisah desimal, jika diperlukan | string fixnum(number) |
| floor | Bulatkan pecahan ke bawah | number floor(number) |
| gmdate | Format tanggal/waktu GMT | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | Mengonversi semua entitas HTML menjadi karakter yang sesuai (selalu menggunakan ENT_QUOTES dan UTF-8) | string html_entity_decode(string) |
| htmlentities | Mengonversi semua karakter yang sesuai menjadi entitas HTML (selalu menggunakan ENT_QUOTES dan UTF-8) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | Mengonversi karakter khusus menjadi entitas HTML (selalu menggunakan ENT_QUOTES dan UTF-8) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | Mengonversi entitas HTML khusus kembali menjadi karakter (selalu menggunakan ENT_QUOTES dan UTF-8) | string htmlspecialchars_decode(string) |
| idate | Bentuk tanggal/waktu lokal sebagai angka | string idate(string [, timestamp=time()]) |
| if | if gaya Excel: if(test,result_if_true,result_if_false) | if(test,result_if_true,result_if_false) |
| implode | Sambungkan elemen array dengan rangkaian karakter | string implode(glue,arg1,arg2,...,argN) |
| intval | Dapatkan nilai angka dari variabel | int intval(number [, base=10]) |
| is_empty | Menentukan apakah sebuah variabel dianggap kosong | bool is_empty(var) |
| is_float | Mencari tahu apakah tipe variabel adalah float | bool is_float(var) |
| is_int | Mencari tahu apakah tipe variabel adalah integer | bool is_int(var) |
| is_nan | Mencari tahu apakah sebuah nilai bukan sebuah angka | bool is_nan(var) |
| is_null | Cari tahu apakah variabel adalah NULL | bool is_null(var) |
| is_numeric | Mencari tahu apakah sebuah variabel adalah angka atau string numerik | bool is_numeric(var) |
| is_string | Mencari tahu apakah tipe variabel adalah string | bool is_string(var) |
| join (New in 2.0 build 130129) | Menggabungkan elemen menjadi string baru | join(arg1, arg2, ... argN) |
| list | Mengembalikan daftar nilai tidak kosong yang dipisahkan koma | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Mengembalikan daftar yang dipisahkan 'glue' dari properti pertanyaan yang ditentukan (retProp) dari pertanyaan dalam daftar yang memenuhi kriteria (cmpProp op value) | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| ltrim | Hapus spasi kosong (atau karakter lain) dari awal string | string ltrim(string [, charlist]) |
| max | Cari nilai tertinggi | number max(arg1, arg2, ... argN) |
| min | Cari nilai terendah | number min(arg1, arg2, ... argN) |
| mktime | Ambil timestamp UNIX untuk sebuah tanggal (masing-masing dari 6 argumen bersifat opsional) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | Fungsi modulo belum didukung. Anda dapat menggunakan fungsi floor() sebagai gantinya | floor(x/y)==(x/y) |
| nl2br | Menyisipkan jeda baris HTML sebelum semua baris baru dalam string | string nl2br(string) |
| number_format | Bentuk angka dengan mengelompokkan ribuan | string number_format(number) |
| pi | Ambil nilai dari pi | number pi() |
| pow | Lambang eksponen | number pow(base, exp) |
| quoted_printable_decode | Mengonversi string quoted-printable menjadi string 8 bit | string quoted_printable_decode(string) |
| quoted_printable_encode | Mengonversi string 8 bit menjadi string quoted-printable | string quoted_printable_encode(string) |
| quotemeta | Kuota meta karakter | string quotemeta(string) |
| rand | Hasilkan angka acak, lihat contoh ini | int rand() OR int rand(min, max) |
| regexMatch | membandingkan string dengan persamaan reguler | bool regexMatch(pattern,input) |
| round | Membulatkan angka ke dalam ketepatan opsional | number round(val [, precision]) |
| rtrim | Hapus spasi kosong (atau karakter lain) dari akhir string | string rtrim(string [, charlist]) |
| sin | Sinus | number sin(arg) |
| sprintf | Mengembalikan string yang diformat | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | Akar kuadrat | number sqrt(arg) |
| stddev | Hitung Deviasi standar sampel untuk daftar angka | number stddev(arg1, arg2, ... argN) |
| str_pad | Lengkapi string hingga panjang tertentu dengan string lain | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | Ulangi rangkaian karakter | string str_repeat(input, multiplier) |
| str_replace | Ganti semua kemunculan string pencarian dengan string pengganti | string str_replace(search, replace, subject) |
| strcasecmp | Perbandingan string peka huruf besar kecil yang aman untuk biner | int strcasecmp(str1, str2) |
| strcmp | Perbandingan string yang aman untuk biner | int strcmp(str1, str2) |
| strip_tags | Hapus tag HTML dan PHP dari string | string strip_tags(str, allowable_tags) |
| stripos | Cari posisi kemunculan pertama dari string unicode yang tidak peka huruf besar-kecil (dimulai dari 0, mengembalikan false jika tidak ditemukan) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | Menghapus tanda kutip dari rangkaian karakter yang terdapat di dalam tanda kutip | string stripslashes(string) |
| stristr | Strstr tidak peka huruf besar - kecil | string stristr(haystack, needle [, before_needle=false]) |
| strlen | Ambil panjang rangkaian karakter | int strlen(string) |
| strpos | Cari posisi kemunculan pertama dari string unicode (dimulai dari 0, mengembalikan false jika tidak ditemukan) | int strpos(haystack, needle [ offset=0]) |
| strrev | Balikkan rangkaian karakter | string strrev(string) |
| strstr | Cari kemunculan pertama dari rangkaian karakter | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | Ubah string menjadi huruf kecil | string strtolower(string) |
| strtotime | Mengurai hampir semua deskripsi tanggal-waktu berbahasa Inggris menjadi timestamp Unix | int strtotime(string) |
| strtoupper | Ubah string menjadi huruf besar | string strtoupper(string) |
| substr | Mengembalikan sebagian dari string unicode | string substr(string, start [, length]) |
| sum | Hitung jumlah nilai-nilai dalam susunan | number sum(arg1, arg2, ... argN) |
| sumifop | Menjumlahkan nilai pertanyaan yang dijawab dalam daftar yang memenuhi kriteria (arg op value) | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | Tangen | number tan(arg) |
| time | Kembalikan timestamp UNIX ssaat ini | number time() |
| trim | Hapus spasi kosong (atau karakter lain) dari awal dan akhir string | string trim(string [, charlist]) |
| ucwords | Ubah huruf pertama setiap kata dalam string menjadi huruf besar | string ucwords(string) |
| unique | Mengembalikan benar jika semua respons yang tidak kosong adalah unik | boolean unique(arg1, ..., argN) |
<span id="Create_new_expression_functions_with_plugin_ (New in 4.0.0 )">
Buat fungsi ekspresi baru dengan plugin (New in 4.0.0 )
Jika Anda membutuhkan fungsi baru yang tidak ada di inti, Anda dapat membuatnya dengan plugin. Fungsi baru tersebut dibuat menggunakan event expressionManagerStart.
ExpressionScript mengetahui variabel mana yang bersifat lokal
Agar dapat membangun JavaScript untuk sebuah halaman dengan benar, EM perlu mengetahui variabel mana yang ditetapkan di halaman tersebut dan apa ID JavaScript-nya (misalnya, untuk document.getElementById(x)). EM juga harus mengetahui variabel mana yang ditetapkan di halaman lain (sehingga dapat memastikan bahwa kolom <input type='hidden' value='x'> yang diperlukan tersedia dan terisi).
Kondisi Berjenjang
Jika salah satu variabel tidak relevan, seluruh persamaan akan menjadi tidak relevan (false). Sebagai contoh, pada tabel berikut, N/A berarti salah satu variabel tidak relevan:
| Operator | Contoh | a | b | Hasil |
|---|---|---|---|---|
| + (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 |
Mengesampingkan Kondisi Berjenjang
Misalkan Anda ingin menampilkan total berjalan dari semua jawaban yang relevan. Anda mungkin mencoba menggunakan persamaan {sum(q1,q2,q3,...,qN)}. Namun, persamaan ini diterjemahkan secara internal menjadi LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2"),LEMval("q3"),...,LEMval("qN"))). Jadi, jika salah satu nilai q1-qN tidak relevan, persamaan akan selalu mengembalikan false. Dalam kasus ini, sum() akan menampilkan "0" sampai semua pertanyaan dijawab.
Untuk mengatasinya, setiap variabel dapat diberi sufiks ".NAOK" (artinya Not Applicable is OK, atau Tidak Berlaku tidak masalah). Dalam kasus tersebut, perilaku berikut terjadi. Misalkan Anda memiliki variabel q1.NAOK:
- q1 tidak ditambahkan ke klausa LEManyNA()
- LEMval('q1') akan tetap memeriksa apakah tanggapan relevan dan akan mengembalikan "" jika tidak relevan (jadi tanggapan individual yang tidak relevan akan diabaikan, tetapi tidak membatalkan seluruh ekspresi).
Jadi, solusi untuk masalah total berjalan adalah menggunakan persamaan sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
Penggunaan sufiks .NAOK juga memungkinkan penyusun merancang survei yang memiliki beberapa jalur yang mungkin, tetapi kemudian menyatu kembali pada jalur yang sama. Sebagai contoh, misalkan responden menjawab survei dengan cara yang berada di luar rentang tanggapan normal. Penyusun dapat memperingatkan responden bahwa mereka mungkin tidak mendapatkan hasil yang valid, dan menanyakan apakah mereka benar-benar ingin melanjutkan survei. Jika mereka menjawab "Ya", sisa pertanyaan akan ditampilkan. Kondisi untuk "sisa pertanyaan" akan memeriksa apakah tanggapan awal dijawab dalam rentang normal ATAU apakah responden menjawab "Ya" pada pertanyaan yang hanya relevan jika mereka menjawab di luar rentang normal.
Bagaimana ExpressionScript mendukung micro-tailoring bersyarat?
Berikut adalah contoh micro-tailoring (di mana Question Type=='expr' berarti Persamaan):
| Kode pertanyaan | Relevansi | Jenis pertanyaan | Pertanyaan |
|---|---|---|---|
| name | 1 | text | Siapa nama Anda? |
| age | 1 | text | Berapa usia Anda? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | Maaf, {name}, Anda terlalu {if( (age<16),'muda',if( (age>80),'tua','dewasa') ) } untuk tes ini. |
| kids | !badage | yesno | Apakah Anda memiliki anak? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | Berapa jumlah anak Anda? |
| kid1 | parents && numKids >= 1 | text | Berapa usia anak pertama Anda? |
| kid2 | parents && numKids >= 2 | text | Berapa usia anak kedua Anda? |
| kid3 | parents && numKids >= 3 | text | Berapa usia anak ketiga Anda? |
| kid4 | parents && numKids >= 4 | text | Berapa usia anak keempat Anda? |
| kid5 | parents && numKids >= 5 | text | Berapa usia anak kelima Anda? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | text | {name}, Anda mengatakan bahwa usia Anda {age} dan Anda memiliki {numKids} anak. Jumlah usia dari {min(numKids,5)} anak pertama Anda adalah {sumage} |
Untuk mengunduh contoh survei di atas, klik tautan berikut: Contoh survei jumlah anak.
Semua pertanyaan ini dapat berada di satu halaman (misalnya, dalam grup yang sama), dan hanya pertanyaan yang relevan yang akan ditampilkan. Selain itu, saat Anda memasukkan usia anak-anak, ekspresi sum() pada pertanyaan terakhir akan diperbarui secara dinamis.
ExpressionScript menyediakan fungsi ini dengan mengapit setiap ekspresi dalam elemen <span> bernama. Setiap kali sebuah nilai berubah, ExpressionScript menghitung ulang ekspresi yang seharusnya muncul di elemen <span> tersebut dan membuat ulang tampilannya. Anda dapat memiliki puluhan atau bahkan ratusan ekspresi tailoring seperti ini di halaman yang sama.
Penyorotan sintaks
Untuk membantu memasukkan dan memvalidasi ekspresi, EM menyediakan penyorotan sintaks dengan fitur-fitur berikut:
Jenis dan Arti Penyorotan Sintaks
| Warna | Contoh | Arti | Tooltip | Komentar |
|---|---|---|---|---|
| latar belakang cokelat muda | Sample | seluruh persamaan | tidak ada | Semua yang berada di dalam kurung kurawal dan dikenali sebagai persamaan (misalnya, tidak ada spasi di awal atau di akhir) akan diberi kode warna dengan latar belakang cokelat muda agar mudah dibedakan dari teks di sekitarnya |
| teks merah tebal | Sample | Kesalahan | Penjelasan singkat tentang kesalahan | Dapat berupa variabel yang tidak dikenal atau kesalahan pada fungsi. Survei rusak dan pertanyaan yang bergantung pada ekspresi tersebut tidak akan ditampilkan kepada responden. |
| teks biru | Sample | nama fungsi | arti dan sintaks yang diperbolehkan | Merujuk pada nama fungsi atau hal-hal yang seharusnya fungsi karena diikuti tanda kurung buka. Ditampilkan dengan teks biru tebal. Tooltip menampilkan arti dan sintaks yang diperbolehkan untuk fungsi tersebut. |
| teks abu-abu | Sample | string | tidak ada | String dengan tanda kutip tunggal dan ganda ditampilkan dengan teks abu-abu. |
| teks sian | Sample | variabel yang ditetapkan di halaman yang sama, | [nama]: pertanyaan; nilai; answerList yang menampilkan kode untuk setiap nilai | Setiap variabel yang ditetapkan di halaman yang sama dengan pertanyaan yang sedang Anda edit ditampilkan dengan teks sian (dapat diperbarui dalam javascript). Tooltip menampilkan namanya, pertanyaan sebenarnya, dan nilainya saat ini (atau kosong jika belum ditetapkan). Jika jenis pertanyaan mengharapkan tanggapan dari kumpulan nilai terenumerasi, pemetaan kode ke nilai tampilan akan ditampilkan. |
| teks hijau | Sample | variabel yang ditetapkan di halaman sebelumnya | [nama]: pertanyaan; nilai; answerList yang menampilkan kode untuk setiap nilai | Setiap variabel yang ditetapkan di halaman sebelumnya ditampilkan dengan teks hijau tebal. Tooltip menampilkan namanya, pertanyaan sebenarnya, dan nilainya saat ini (atau kosong jika belum ditetapkan). Jika jenis pertanyaan mengharapkan tanggapan dari kumpulan nilai terenumerasi, pemetaan kode ke nilai tampilan akan ditampilkan. |
| teks merah muda tebal | Sample | variabel yang ditetapkan di halaman berikutnya umumnya: kosong saat survei dimulai, tetapi dapat terisi melalui indeks atau tombol sebelumnya | [nama atau kode SGQA]: pertanyaan; nilai; answerList yang menampilkan kode untuk setiap nilai | Setiap variabel yang ditetapkan di halaman berikutnya ditampilkan dengan teks merah muda tebal. Tooltip menampilkan namanya, pertanyaan sebenarnya, dan nilainya saat ini (atau kosong jika belum ditetapkan). Jika jenis pertanyaan mengharapkan tanggapan dari kumpulan nilai terenumerasi, pemetaan kode ke nilai tampilan akan ditampilkan. |
| teks cokelat tebal | Sample | nilai pengganti lime | nilainya | String Pengganti Lime (seperti {TOKEN:xxx}, {PRIVACY_MESSAGE}) ditampilkan dengan teks cokelat tebal. |
| teks merah | Sample | operator penugasan (=) | pesan peringatan | Jika Anda menggunakan salah satu operator penugasan (=), operator tersebut akan ditampilkan dengan teks merah. Ini dimaksudkan untuk membantu mencegah penugasan ulang nilai yang tidak disengaja ketika Anda sebenarnya bermaksud memeriksa apakah a == b, bukan menetapkan nilai a = b. |
| teks hitam biasa | Sample | tanda baca | tidak ada | Semua tanda baca lainnya di dalam ekspresi ditampilkan dengan teks hitam biasa. |
| teks dalam kotak merah | garis merah tebal mengelilingi kesalahan | kesalahan sintaks | deskripsi kesalahan | Setiap kesalahan sintaks yang terdeteksi ditampilkan dalam kotak merah. Tooltip menampilkan kesalahannya. Contohnya meliputi tanda kurung yang tidak berpasangan, penggunaan fungsi yang tidak terdefinisi, pemberian jumlah argumen yang salah pada fungsi, ekspresi dengan struktur yang buruk (misalnya, operator yang hilang di antara variabel), mencoba menetapkan nilai baru ke variabel hanya-baca, mencoba menetapkan nilai ke selain variabel, atau menggunakan sintaks yang tidak didukung. Perlu diperhatikan bahwa sistem deteksi kesalahan sintaks mungkin hanya melaporkan satu kesalahan dalam sebuah ekspresi meskipun ada beberapa kesalahan; namun, jika ada kesalahan yang terdeteksi, setidaknya satu kesalahan akan ditampilkan. |
Bacaan tambahan
Contoh survei ExpressionScript
Kasus penggunaan dan panduan cara
Contoh langkah demi langkah
Referensi untuk Pengembang