ตัวอย่าง ExpressionScript
From LimeSurvey Manual
โครงสร้าง
ส่วนแรกของบทความจะอธิบายว่านิพจน์ใช้ทำอะไรได้บ้าง และจะค้นหา/เพิ่มนิพจน์ได้ที่ใด ส่วนที่สองมีตัวอย่างวิธีการใช้นิพจน์
ประเภทของนิพจน์
LimeSurvey ใช้นิพจน์เพื่อวัตถุประสงค์ต่อไปนี้:
ความสัมพันธ์กัน
วัตถุประสงค์: การซ่อนกลุ่มคำถาม/คำถาม
ความสัมพันธ์กันใช้ควบคุมว่ากลุ่มคำถามหรือคำถามจะแสดงหรือซ่อน หากผลลัพธ์ของนิพจน์เป็น "จริง" (เช่น 1) องค์ประกอบนั้นจะถูกแสดง มิฉะนั้น (หากผลลัพธ์ของนิพจน์เป็น "เท็จ" (เช่น 0)) องค์ประกอบนั้นจะถูกซ่อน
การตรวจสอบ
วัตถุประสงค์: ตรวจสอบข้อมูลที่ป้อน/การดำเนินการในคำถาม/คำถามย่อย/คำตอบ
การตรวจสอบใช้ควบคุมว่าข้อมูลที่ผู้ตอบป้อนในคำถามหรือการดำเนินการนั้นถูกต้องหรือไม่ หากผลลัพธ์ของนิพจน์เป็น "จริง" (เช่น 1) คลาส "good" จะถูกนำไปใช้กับองค์ประกอบและข้อความการตรวจสอบ มิฉะนั้น หากผลลัพธ์ของนิพจน์เป็น "เท็จ" (เช่น 0) คลาส "error" จะถูกนำไปใช้กับองค์ประกอบและข้อความการตรวจสอบ คุณสามารถกำหนดสไตล์สำหรับคลาสเหล่านี้ได้ใน template.css
การแสดงผลข้อความ
วัตถุประสงค์: (ทำบางอย่าง) และเขียนข้อความออกมา
นิพจน์สามารถใช้เขียนข้อความออกมาได้ ตัวอย่างเช่น คุณสามารถทดสอบหรือคำนวณบางอย่าง แล้วกำหนดผลลัพธ์ที่แสดงตามผลของการทดสอบหรือการคำนวณนั้น นอกจากนี้ยังใช้แทรกข้อความคำถาม คำตอบ ประเภทคำถาม ฯลฯ ของคำถามที่ใช้ก่อนหน้านิพจน์ได้ด้วย การแสดงผลข้อความใช้ได้ทุกที่ที่มีการแสดงข้อความ และสามารถส่งคืนผลลัพธ์ได้ทุกชนิด
| กรณีการใช้งาน | คำอธิบาย |
|---|---|
| การปรับแต่งข้อความเฉพาะบุคคล | ปรับข้อความ เช่น เขียนว่า "นาย" หรือ "นาง" ขึ้นอยู่กับคำถามเรื่องเพศที่ถามไว้ก่อนหน้า |
| การคำนวณ | คำนวณค่าแล้วแสดงออกมา เช่น "รายได้ครอบครัวของคุณคือ xxx" |
| การอ้างอิง | แทรกข้อความจากองค์ประกอบหนึ่ง เช่น "คุณชื่อ xxx คุณอายุเท่าไร?" |
การจัดเก็บคำตอบ
วัตถุประสงค์: (ทำบางอย่าง) (เขียนข้อความออกมา) และจัดเก็บบางอย่างในฐานข้อมูล
คำถามประเภทสมการสามารถใช้จัดเก็บข้อมูลในฐานข้อมูลได้ คุณสามารถทำบางอย่างด้วยนิพจน์ แสดงคำถามสมการ (ซึ่งคล้ายกับการแสดงผลข้อความ) และจัดเก็บผลลัพธ์ของนิพจน์ไว้ในฐานข้อมูล โดยจะจัดเก็บคำตอบไว้ในตารางการตอบกลับ จากนั้นสามารถนำผลลัพธ์ไปใช้ในฟีเจอร์สถิติ หรือนำเข้าสู่รูปแบบใดรูปแบบหนึ่งที่ฟังก์ชันส่งออกของ LimeSurvey มีให้ได้
ตัวอย่างนิพจน์
แทรกคำตอบจากคำถามก่อนหน้า
การใช้คำถามสมการที่ซ่อนไว้เพื่อกรอกคำตอบอัตโนมัติ
ปัญหา: สมมติว่าคุณมีคำถามสองข้อคือ Q1 และ Q2 โดย Q1 ถามอายุของผู้ตอบ ส่วน Q2 แบ่งผู้ตอบเป็นสามกลุ่ม ได้แก่ อายุต่ำกว่า 20 ปี อายุ 20 ปี และอายุมากกว่า 20 ปี ดังนั้น Q2 ควรใช้ค่า "1", "2", "3" ซึ่งสอดคล้องกับเงื่อนไขข้างต้น นอกจากนี้ อย่าลืมซ่อน Q2 ด้วย (คำถามจะไม่แสดงในแบบสำรวจ แต่ค่าจะถูกบันทึกไว้ในตารางการตอบกลับผ่าน "กระบวนการเบื้องหลัง")
วิธีกรอกข้อมูลในฐานข้อมูลโดยใช้คำถามประเภทสมการ:
- ขั้นแรก สร้างคำถามที่มีรหัส Q1 เป็นคำถามอินพุตตัวเลข
- จากนั้นสร้างคำถามอีกข้อที่มีรหัส Q2 เป็นคำถามสมการ
- ในส่วนแท็บ "Display settings" ของ Q2:
- ตั้งค่าฟิลด์ "ซ่อนคำถามนี้" เป็น "เปิด"
- พิมพ์นิพจน์ลงในฟิลด์ "สมการ":
{if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}
สร้างหน้าสรุปโดยใช้ตัวแทนที่
บทแนะนำนี้แสดงวิธีสร้างภาพรวมท้ายแบบสำรวจ โดยแสดงรายการคำถามและคำตอบทั้งหมดผ่านตัวแทนที่ของ ExpressionScript นอกจากนี้ยังแสดงวิธีจำกัดภาพรวมให้แสดงเฉพาะคำถามที่มีการตอบแล้วด้วย
คุณสามารถดาวน์โหลดตัวอย่างของเราได้จากที่นี่: ตัวอย่างแบบสำรวจตัวแทนข้อความ (placeholder)
ประเภทคำถามที่ใช้ในตัวอย่างนี้:
1. คำถามแบบเลือก 1 คำตอบ / คำถามข้อความเดี่ยว/ตัวเลขเดี่ยว
- รายการแบบทิ้งตัวลง
- รายการ(กำหนดคำตอบเอง) [L]
- ใช่/ไม่ใช่ [Y]
- ข้อความแบบยาว [T]
- ข้อความแบบสั้น [S]
- อินพุตตัวเลข [N]
- สมการ [*]
2. คำถามที่มีคำถามย่อย
- ข้อความสั้นหลายรายการ [Q]
- เลือกตอบได้หลายตัว [M]
- อาร์เรย์ [F]
- อาร์เรย์ (ใช่/ไม่ใช่/ไม่แน่ใจ) [C]
- อาร์เรย์ (ตัวเลือก 10 คะแนน) [B]
3. คำถามที่มี 2 มาตราส่วน
- อาร์เรย์แบบสองมาตราส่วน [1]
4. คำถามที่มีมาตราส่วนแกน X และ Y
- อาร์เรย์ (ตัวเลข) [:]
5. คำถามแบบคำตอบกำหนดไว้แล้ว
- การแสดงผลข้อความ [X]
ในตัวอย่างง่าย ๆ นี้ ภาพรวมของเราจะเป็นรายการแบบง่ายที่มีรูปแบบดังนี้:
- ข้อความคำถาม: คำตอบของผู้ใช้
คำถามแบบเลือก 1 คำตอบ / คำถามข้อความเดี่ยว/ตัวเลขเดี่ยว
สำหรับประเภทคำถามเหล่านี้ทั้งหมด LimeSurvey จะเก็บการตอบคำถามเพียงค่าเดียว:
- รายการแบบทิ้งตัวลง
- รายการ(กำหนดคำตอบเอง)
- รายการพร้อมความคิดเห็น
- ตัวเลือก 5 คะแนน
- ใช่/ไม่ใช่
- ข้อความแบบสั้น
- ข้อความแบบยาว
- ข้อความแบบยาวพิเศษ
- อินพุตตัวเลข
- สมการ
- วันที่
- เพศ
สมมติว่ารหัสคำถามของคำถามคือ q1 เราสามารถอ้างอิงข้อความคำถามและคำตอบได้โดยใช้:
- {q1.question}: {q1.shown}
ตัวอย่าง:
- คุณอายุเท่าไร?: 25
หากต้องการตรวจสอบว่าคำถามนั้นได้รับคำตอบแล้วหรือไม่ คุณสามารถใส่คำสั่ง IF ครอบเอาต์พุตของคุณได้:
{if(!is_empty(q1),join("- ",q1.question,": ",q1.shown),"")}
สิ่งนี้ "แปลความหมาย" ได้ว่า: IF คำถามที่มีรหัส q1 ไม่ว่างเปล่า ให้แสดงผล "- " AND ข้อความคำถาม AND ": " AND ข้อความคำตอบ (ฟังก์ชัน join() จะรวมองค์ประกอบต่าง ๆ เป็นสตริงใหม่); ELSE: ไม่แสดงผลอะไร ("" หมายถึงสตริงว่าง)
คำถามที่มีคำถามย่อย
สำหรับประเภทคำถามเหล่านี้ทั้งหมด LimeSurvey จะใช้คำถามย่อย:
- ข้อความสั้นหลายรายการ
- เลือกตอบได้หลายตัว
- เลือกตอบได้หลายตัวพร้อมความคิดเห็น
- อาร์เรย์
- อาร์เรย์ (ตัวเลือก 5 คะแนน)
- อาร์เรย์ (ตัวเลือก 10 คะแนน)
- อาร์เรย์ (ใช่/ไม่ใช่/ไม่แน่ใจ)
- อาร์เรย์ (เพิ่มขึ้น / เท่าเดิม / ลดลง)
- อาร์เรย์ตามคอลัมน์
สมมติว่ารหัสคำถามของคำถามคือ q2 และคำถามย่อยมีหมายเลข SQ001, SQ002 (LimeSurvey กำหนดหมายเลขให้อัตโนมัติ) เราสามารถอ้างอิงข้อความคำถามและคำตอบได้โดยใช้:
- {q2_SQ001.question}: {q2_SQ001.shown}
- {q2_SQ002.question}: {q2_SQ002.shown}
สำหรับคำถามแบบเลือกตอบได้หลายตัว ควรแสดงตัวอักษร Y สำหรับแต่ละตัวเลือกที่เลือก แทนที่จะแสดงข้อความของคำถามย่อยที่ถูกทำเครื่องหมาย:
- {q2_SQ001.question}: {q2_SQ001}
- {q2_SQ002.question}: {q2_SQ002}
...
โปรดทราบว่าปัจจุบันยังไม่สามารถแสดงข้อความคำถามของคำถามที่มีคำถามย่อยได้ ดูคำขอฟีเจอร์นี้
ตัวอย่างที่ 1 (สมมติว่าชนิดของคำถามคือเลือกตอบได้หลายตัว)
- คุณรู้จักยี่ห้อรถยนต์เหล่านี้หรือไม่?
-- Mercedes: Y
-- Audi: N
-- Volvo: Y
หากต้องการแสดงเฉพาะรายการที่ถูกเลือก คุณสามารถใช้คำสั่ง IF ครอบผลลัพธ์ของคุณและตรวจสอบค่าของช่องทำเครื่องหมายได้:
{ if( q2_SQ001=="Y", join( "- ", q2_SQ001.question, ": ", q2_SQ001.shown ), "" ) }
ใช้ฟังก์ชัน listifop หากคุณต้องการแสดงรายการเฉพาะรายการที่เลือก เช่น Mercedes, Volvo
{ listifop( 'value', '==', 'Y', 'question', ', ', that.q2.sgqa ) }
โดยที่ that.q2 จะขยายเป็นคำถามย่อยทั้งหมดของ q2 ดูรายละเอียดเพิ่มเติมได้ที่ self, this และ that
ตัวอย่างที่ 2 (สมมติว่าชนิดของคำถามคืออาร์เรย์ (ตัวเลือก 10 คะแนน))
- โปรดให้คะแนนคุณภาพของยี่ห้อรถยนต์ด้านล่างตามมาตราส่วนตั้งแต่ 1=แย่มาก ถึง 10=ดีมาก
-- Mercedes: 7
-- Audi: 9
-- Volvo: 9
หากต้องการแสดงเฉพาะรายการที่ได้รับการให้คะแนน คุณสามารถใช้คำสั่ง IF ครอบผลลัพธ์ของคุณ และตรวจสอบว่าคำถามย่อยปัจจุบันได้รับคำตอบแล้วหรือไม่ โดยใช้:
{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }
ใช้ฟังก์ชัน listifop หากคุณต้องการ เช่น แสดงรายการเฉพาะรายการที่เลือกซึ่งมีค่ามากกว่าแปด เช่น Audi / Volvo
{ listifop( 'value', '>', 8, 'question', ' / ', that.q3.sgqa ) }
คำถามที่มีสองมาตราส่วน
สมมติว่ามีการใช้รหัสดังต่อไปนี้:
- รหัสคำถาม: q4
- รหัสคำถามย่อย: SQ001, SQ002, ...
- รหัสคำตอบมาตรวัดที่ 1: A1, A2, ...
- รหัสคำตอบมาตรวัดที่ 2: B1, B2, ...
ตัวอย่างการอ้างอิงถึงคำตอบของคำถามย่อยที่สามและมาตราส่วนที่สอง: q4_SQ003_1 - คำถามที่ 4 คำถามย่อยที่ 3 มาตราส่วนที่สอง
มาแสดงผลลัพธ์ของทั้งสองมาตราส่วนสำหรับคำถามย่อยสองข้อแรกกัน:
- {q4_SQ001_0.question}: {q4_SQ001_0.shown} / {q4_SQ001_1.shown}
- {q4_SQ002_0.question}: {q4_SQ002_0.shown} / {q4_SQ002_1.shown}
หากต้องการแสดงข้อความของคำถามย่อย คุณต้องเพิ่ม ScaleID ลงในตัวแทนที่ (placeholder) (แม้ว่าข้อความจะเหมือนกันทั้งสองมาตราส่วนก็ตาม) ดังนั้นแทนที่จะใช้ {q4_SQ001.question} เราต้องใช้ {q4_SQ001_0.question} หรือ {q4_SQ001_1.question}
หากคุณต้องการส่งออก/แสดงผลลัพธ์ของคำถามย่อยที่มีอย่างน้อยหนึ่งคำตอบเท่านั้น ให้ใช้ไวยากรณ์นี้สำหรับแต่ละคำถามย่อย:
{if(count(q4_SQ001_0,q4_SQ001_1)>0,join("- ",q4_SQ001_0.question,": ",q4_SQ001_0.shown," / ",q4_SQ001_1.shown),"")}
คำถามที่มีสเกล X และ Y
ส่วนนี้ใช้กับคำถามแบบเมทริกซ์ทั้งหมดที่อนุญาตให้ตอบได้ในทุกเซลล์ (ไม่ใช่เพียงทุกแถวเหมือนที่แสดงไว้ก่อนหน้านี้):
- อาร์เรย์ (ข้อความ)
- อาร์เรย์ (ตัวเลข)
รหัสที่สมมติใช้:
- รหัสคำถาม: q5
- รหัสคำถามย่อย: SQ001, SQ002, ...
- รหัสคำตอบ: A1, A2, ...
หากต้องการอ้างอิงผลลัพธ์ของคำถามย่อยหนึ่งจากคอลัมน์หนึ่ง คุณต้องใช้ QuestionCode . '_' . SubQuestionCode . '_' . AnswerCode ตัวอย่างการอ้างอิงคำตอบของคำถามย่อยที่สามและคอลัมน์ที่สอง: q5_SQ003_A2
มาแสดงผลลัพธ์ของคอลัมน์ที่ 1-3 ของคำถามย่อยสองข้อแรกกัน:
- {q5_SQ001_A1.question}: {q5_SQ001_A1.shown} | {q5_SQ001_A2.shown} | {q5_SQ001_A3.shown}
- {q5_SQ002_A1.question}: {q5_SQ002_A1.shown} | {q5_SQ002_A2.shown} | {q5_SQ002_A3.shown}
เนื่องจากในคำถามประเภทนี้ แต่ละเซลล์ (การรวมกันของแกน X และแกน Y) เท่ากับหนึ่งตัวเลือกคำตอบ จึงต้องตรวจสอบว่ามีข้อมูลอยู่หรือไม่ในแต่ละเซลล์ ตัวอย่าง:
{if(!is_empty(q5_SQ001_A1),join("- ",q5_SQ001_A1.question,": ",q5_SQ001_A1.shown),"")}
}
ซ่อนคำถามหากคำตอบจากคำถามก่อนหน้าว่างเปล่า
| วัตถุประสงค์ | ซ่อนคำถามหากคำตอบจากคำถามก่อนหน้าว่างเปล่า |
| ประเภท | ความสัมพันธ์กันของคำถาม |
| ตัวอย่าง | คำถามที่หนึ่ง: รหัสคำถาม "name" ข้อความคำถาม "What's your name?" คำถามที่สอง: ข้อความคำถาม "{name}, how old are you?" สิ่งที่ต้องทำ: ซ่อนคำถามที่สองหากช่องข้อความของคำถามที่หนึ่งว่างเปล่า |
| นิพจน์ | !is_empty(name) |
| คำอธิบาย | is_empty() ใช้ตรวจสอบว่าตัวแปรถือว่าว่างเปล่าหรือไม่ เครื่องหมาย "!" ใช้กลับค่าผลลัพธ์ ดังนั้นหากตัวแปรไม่ว่างเปล่า นิพจน์จะเป็นจริงและคำถามจะแสดงขึ้น |
| ขั้นตอน | สร้าง/แก้ไขคำถามที่สอง ใส่ "!is_empty(name)" ลงใน "สมการความสัมพันธ์กัน:" |
| ไฟล์ตัวอย่าง | Hide_question_if_empty_question_group.zip |
![]()
| |
ซ่อนกลุ่มคำถามหากคำตอบจากคำถามก่อนหน้าคือ ใช่ หรือ ไม่ใช่
| วัตถุประสงค์ | ซ่อนกลุ่มคำถามหากคำตอบจากคำถามก่อนหน้าคือ ใช่ หรือ ไม่ใช่ |
| ประเภท | ความเกี่ยวข้องของกลุ่ม |
| ตัวอย่าง | หน้าที่หนึ่ง กลุ่มคำถามที่หนึ่ง คำถามที่หนึ่ง: รหัสคำถาม "PET" ข้อความคำถาม "Do you have a pet?" -ใช่ -ไม่ใช่ หน้าที่สอง กลุ่มคำถามที่สอง: ชื่อเรื่อง "About your pet(s)" สิ่งที่ต้องทำ: แสดง/ซ่อนกลุ่มคำถามที่สองตามคำตอบของคำถามที่หนึ่งว่าเป็น ใช่/ไม่ใช่ |
| นิพจน์ | PET == "Y" |
| คำอธิบาย | PET คือรหัสคำถามของคำถามที่คุณต้องการตรวจสอบคำตอบ หากคุณไม่ใช้คำต่อท้าย EM จะใช้ "Qcode.code" ดังนั้นคุณจึงเปรียบเทียบรหัสคำตอบของคำถาม PET กับค่า "Y" หากผู้เข้าร่วมตอบว่า "ใช่" นิพจน์จะเป็นจริงและกลุ่มคำถาม "About your pet(s)" จะแสดงขึ้น |
| ขั้นตอน | สร้าง/แก้ไขกลุ่มคำถามที่สอง ใส่ "PET == "Y"" ลงใน "สมการความสัมพันธ์กัน:" |
| ไฟล์ตัวอย่าง | Hide_question group_if_answer_from_previous_question_is_Yes_or_No.zip |
![]()
| |
แสดงค่าของช่องคำถามแบบป้อนหลายคำตอบ
| วัตถุประสงค์ | แสดงค่าของช่องคำถามแบบป้อนหลายคำตอบ |
| ประเภท | การอ้างอิง |
| ตัวอย่าง | คำถามที่หนึ่ง: รหัสคำถาม "AskChildAge" ข้อความคำถาม "How old are your children?" รหัสคำถามย่อย -Child1 -Child2 -Child3 - ChildXXX คำถามที่สอง: รหัสคำถาม "ReportChildAge" ข้อความคำถาม "About your first child: - CHILD1 is AGE1." |
| นิพจน์ | {AskChildAge_Child1.question}, {AskChildAge_Child1.value} |
| คำอธิบาย | คุณต้องการใช้ค่าของคำถามย่อยในคำถามถัดไป คุณสามารถเข้าถึงค่าของคำถามย่อยได้ด้วยนิพจน์ในรูปแบบนี้: QcodeQuestion_QcodeSubquestion.value |
| ขั้นตอน | สร้าง/แก้ไขคำถามที่สอง ใส่ข้อความนี้ในคำอธิบาย: "About your first child: - {AskChildAge_Child1.question} is {AskChildAge_Child1.value}." |
| ไฟล์ตัวอย่าง | Display_value_of_a_multiple_answer_input_question_field.zip |
| |
ตรวจสอบจำนวนช่องที่ทำเครื่องหมายในแต่ละแถวสำหรับคำถาม "อาร์เรย์ (ตัวเลข) แบบช่องทำเครื่องหมาย"
| วัตถุประสงค์ | ตรวจสอบจำนวนช่องที่ทำเครื่องหมายในแต่ละแถว |
| ประเภท | การตรวจสอบ |
| ตัวอย่าง | คำถามประเภท "อาร์เรย์ (ตัวเลข) (รูปแบบการวางตัวเลือก: ช่องทำเครื่องหมาย)" |
| นิพจน์ | sum(...) |
| คำอธิบาย | (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) ใช้ตรวจสอบว่ามีการทำเครื่องหมายอย่างน้อย X ช่องในแถว A หรือไม่ หากต้องการตรวจสอบทั้งสามแถว (A, B, C) คุณสามารถเชื่อมนิพจน์ด้วย "&&": (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) && (sum(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= X) && (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= X) |
| ขั้นตอน | สร้าง/แก้ไขคำถามประเภท "อาร์เรย์ (ตัวเลข) (รูปแบบการวางตัวเลือก: ช่องทำเครื่องหมาย)" ใส่นิพจน์ข้างต้นลงใน "สมการการตรวจสอบของคำถาม" ในการตั้งค่าคำถามขั้นสูง (คุณอาจต้องปรับชื่อตัวแปรให้เหมาะสม!) |
| ไฟล์ตัวอย่าง | Validate number of boxes ticker per row for an Array (Numbers) Checkbox.lss |
![]()
| |
คำนวณความแตกต่างระหว่างสองวันที่
| วัตถุประสงค์ | คำนวณความแตกต่างระหว่างสองวันที่ |
| ประเภท | ความสัมพันธ์กัน / คำถามประเภทสมการ / การตรวจสอบ |
| ตัวอย่าง | คำถามที่หนึ่ง (วันที่/เวลา รหัส: DOB): คุณเกิดวันที่เท่าไร? คำถามที่สอง (วันที่/เวลา รหัส: datetoday): วันนี้วันที่เท่าไร? คำถามที่สาม (boilerplate): คุณมีอายุ XXXX วัน สิ่งที่ต้องทำ: คำนวณและแสดงจำนวนวันระหว่างวันที่ที่ระบุในคำถามที่ 1 และคำถามที่ 2 |
| นิพจน์ | {(strtotime(datetoday)-strtotime(DOB))/60/60/24} |
| คำอธิบาย | strtotime คำนวณจำนวนวินาทีระหว่างวันที่ 1 มกราคม 1970 กับวันที่ที่กำหนด นิพจน์ข้างต้นคำนวณจำนวนวินาทีระหว่างสองวันที่ที่กำหนด ส่วน "/60/60/24" ใช้แปลงจำนวนวินาทีเป็นจำนวนวัน แทนที่จะถามหา "datetoday" คุณสามารถใช้ strtotime('now') หรือเพียงแค่ time() ซึ่งส่งคืนจำนวนวินาทีตั้งแต่เดือนมกราคม 1970 จนถึงตอนนี้โดยตรง (เช่น เวลาที่ทำแบบสำรวจ) ดังนั้นคุณจึงสามารถหาอายุของบุคคลเป็นปีได้อย่างรวดเร็วด้วยสมการ {(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25} ในทุกกรณี สิ่งสำคัญคือต้องป้อนวันที่ในรูปแบบที่ถูกต้อง มิฉะนั้นฟังก์ชัน strtotime() จะทำงานไม่ถูกต้อง |
| ขั้นตอน | สร้างคำถามวันที่สองข้อ (สำหรับวันเกิดและวันที่ปัจจุบัน) และคำถาม boilerplate หนึ่งข้อ ในข้อความคำถามของคำถาม boilerplate ให้ใส่: "On {datetoday} you were {(strtotime(today)-strtotime(dob))/60/60/24} days days old." โปรดทราบ: ฟังก์ชัน strtotime ใช้งานได้กับรูปแบบวันที่จำนวนมากแต่ไม่ใช่ทุกรูปแบบ หากพบปัญหา ให้ตั้งค่ารูปแบบวันที่ของแบบสำรวจเป็น mm/dd/yyyy หรือ yyyy-mm-dd หรือ dd.mm.yyyy" |
| ไฟล์ตัวอย่าง | Date_difference.zip |
| |
การใช้ ExpressionScript สำหรับการประเมินผล
นี่คืออีกตัวอย่างหนึ่งของการใช้ ExpressionScript กับคำถามประเภทอาร์เรย์และการประเมินผล:</ br>
สมมติว่าคุณมีคำถามอาร์เรย์สองข้อและต้องการบันทึกผลลัพธ์ของการคำนวณลงในฐานข้อมูล ซึ่งทำได้ง่ายมาก คุณเพียงสร้างและทดสอบอาร์เรย์ของคุณ แล้วส่งการตอบคำถามจำลองเพื่อดูว่าใช้งานได้และแสดงผลลัพธ์ในหน้าเสร็จสมบูรณ์หรือไม่
รายละเอียดการดำเนินการ:
- เพิ่มคำถามประเภทสมการ
- เพิ่มบรรทัดต่อไปนี้ โดยสมมติว่า Q1 คือรหัสคำถามอาร์เรย์ของคุณ และ Q2 คือคำถามที่สอง:
{sum(Q1_SQ001.value,Q2_SQ001.value)}
โปรดทราบว่า SQ001 คือรหัสเริ่มต้นของคำถามย่อยทุกข้อ หากคุณเปลี่ยนรหัสคำถามย่อย ให้ปรับสมการข้างต้นให้สอดคล้องกัน
การใช้ em_validation_q ในอาร์เรย์
คุณสามารถใช้สมการการตรวจสอบของคำถามเพื่อควบคุมอาร์เรย์ด้วยเงื่อนไขใดก็ได้
รายละเอียดการดำเนินการ:
- สำหรับอาร์เรย์แรก: อาร์เรย์แบบตัวเลือกเดียว
- รหัสคำถามคือ ARRAY
- รหัสคำถามย่อยคือ SQ01,SQ02,SQ03 และ SQ04
- อัปเดตสมการการตรวจสอบของคำถามทั้งข้อ แล้วใส่
!is_empty(ARRAY_SQ01) and !is_empty(ARRAY_SQ03)
- สำหรับอาร์เรย์ที่สอง: อาร์เรย์แบบข้อความ
- รหัสคำถามคือ ARRAYTEXT
- รหัสคำถามย่อยบนแกน Y คือ SY01,SY02,SY03 และ SY04
- อัปเดตสมการการตรวจสอบของคำถามทั้งข้อ แล้วใส่
count(self.sq_SY01 >= 1) and count(self.sq_SY03 >= 3)








