x

Bab utama

  1. LimeSurvey Cloud vs LimeSurvey CE
  2. Panduan memulai cepat - LimeSurvey 3.0+
  3. Instalasi - LimeSurvey CE
  4. Cara merancang survei yang baik (panduan)
  5. Memulai
  6. Mengelola LimeSurvey
  7. Survei - pengantar
  8. Pengaturan survei
  9. Menu survei
  10. Struktur survei
  11. Pertanyaan - pengantar
  12. Grup pertanyaan - pengantar
  13. Survei - manajemen
  14. Opsi toolbar survei
  15. Survei multibahasa
  16. ExpressionScript Engine - Panduan memulai cepat
  17. Fitur tanpa kategori dan fitur lanjutan
  18. FAQ Umum
  19. Pemecahan Masalah
  20. Solusi Sementara
  21. Lisensi
  22. Log perubahan versi
  23. Plugin
 Actions

ExpressionScript - Presentasi

From LimeSurvey Manual

Halaman ini mungkin diterjemahkan oleh mesin dan dapat mengandung kesalahan. Tampilkan versi asli bahasa Inggris · Perbaiki terjemahan ini
This page is a translated version of the page ExpressionScript - Presentation and the translation is 100% complete.


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

  1. 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.
  2. 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.
  3. 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.
  4. 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
  5. 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".
  6. 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.


Catatan:
  • 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:

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:

  1. Menampilkan pesan yang disesuaikan kepada responden secara bersyarat berdasarkan tanggapan sebelumnya;
  2. Membuat penilaian dan menampilkan hasil penilaian (atau membuat percabangan atau menampilkan pesan secara bersyarat) berdasarkan hasil tersebut, tanpa menggunakan modul penilaian itu sendiri;
  3. Mengonjugasikan kata kerja dan mengubah bentuk kata benda di dalam pertanyaan, jawaban, dan laporan;
  4. 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
Demi konsistensi antara JavaScript dan PHP, operator plus (+) melakukan penjumlahan jika kedua operan berupa angka, tetapi melakukan penggabungan jika kedua bagian berupa string non-numerik. Namun, kami menyarankan untuk menggunakan fungsi "join()" untuk penggabungan, karena maksud Anda menjadi lebih jelas. Fungsi ini juga menghindari hasil yang tidak terduga jika Anda mengharapkan string tetapi justru mendapatkan angka (atau sebaliknya).

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...


  Perhatian : Penugasan hanya dilakukan di PHP. Artinya nilai tidak diperbarui pada halaman yang sama, melainkan hanya ketika pengguna berpindah ke halaman berikutnya. Karena itu, harap berhati-hati ketika operator penugasan digunakan pada halaman yang sama dengan ekspresi lainnya.



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.


Perhatikan bahwa XSS diaktifkan secara default di setiap instalasi LimeSurvey.


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 &amp;
  • < menjadi &lt;
  • > menjadi &gt;

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
  1. sufiks adalah salah satu sufiks qcode normal (misalnya NAOK, value, shown)
  1. 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".

Sebaiknya Anda tidak menggunakan variabel ini jika
  • 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)
Klik di sini jika Anda ingin mengetahui lebih lanjut tentang fungsi yang direncanakan (atau sedang dipertimbangkan).

<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:

  1. q1 tidak ditambahkan ke klausa LEManyNA()
  2. 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.


Yang dimaksud dengan tooltip adalah pesan popup yang ditampilkan saat Anda mengarahkan kursor ke fungsi dan variabel tertentu.


Bacaan tambahan

Contoh survei ExpressionScript

Kasus penggunaan dan panduan cara

Contoh langkah demi langkah

Referensi untuk Pengembang

RoadMap, status, daftar tugas