You are on page 1of 230

15 ก.พ.

2021 (พพิมพพ์ครรรั้งททที่ 4)
พพิมพพ์ครรรั้งททที่ 1 : 12 พ.ย. 2019
พพิมพพ์ครรรั้งททที่ 2 : 1 ธ.ค. 2019
พพิมพพ์ครรรั้งททที่ 3 : 2 เม.ย. 2020
พพิมพพ์ครรรั้งททที่ 4 : 15 ก.พ. 2021
หลลักการเขขียนโปรแกรม
Google Apps Script

เรรียบเรรียงโดย
วสสันตต์ คคุณดดิลกเศวต

wasankds@gmail.com
Line ID : wasankds
08-1459-8343
www.poeclub.org
สารบลัญ
สารบลัญ...............................................................................4
คคานคา................................................................................14
บททขีที่ 1 Hello World..............................................................17
1.1. Google Apps Script แบบ Embbed Script และ Stand alone .......................18
1.1.ก.) แบบ Embbed Script (ฝฝังอยยยู่ในไฟลล) (18)
1.1.ข.) แบบ Stand alone (ไฟลลโดด) (19)
1.2. โคค้ดแรก และ คทยพ์ลรดททที่สสสำครญในกสำรเขทยนโคค้ด ...........................................................20
1.2.ก.) โคค้ดแรก (20)
1.2.ข.) คอมเมค้นตล (20)
1.2.ค.) คคียลลลัด (21)
1.2.ง.) รลันโคค้ด (22)
1.2.จ.) เปปิดดย Logs (23)
1.2.ฉ.) Logs - Chrome V8 (23)
1.2.ช.) Logs – New IDE (24)
1.3. Apps Script Dashboard .................................................................................... 25
บททขีที่ 2 ตลัวแปร และ โอเปอรร์เรเตอรร์..........................................27
2.1. Variables และ Data Types ................................................................................ 28
2.2. Operators ............................................................................................................ 29
2.2.ก.) Arithmetic Operators (สสสำหรลับตลัวเลข) (29)
2.2.ข.) Assignment operators(30)
2.2.ค.) String operators (30)
2.2.ง.) Comparison operators (31)
2.2.จ.) Logical Operators (31)
2.2.ฉ.) in (32)
2.2.ช.) Ternary Operator (ประกสำศตลัวแปรตสำมเงงงื่อนไข) (33)
2.2.ซ.) ใชค้ || และ && ประกสำศตลัวแปรตสำมเงงงื่อนไข (33)
2.3. Backticks – Chrome V8 ..................................................................................... 34
2.3.ก.) ใชค้ตลัวแปรใน Backticks (34)
2.3.ข.) พพิมพลอลักขระพพิเศษใน Backticks (34)
2.4. Use Strict – Chrome V8 .................................................................................... 35
2.5. Bitwise Operators ............................................................................................... 36
บททขีที่ 3 var, let และ const (Chrome V8)...................................37
3.1. let และ var ........................................................................................................... 38
3.1.ก.) Global Scope (38)
3.1.ข.) Function Scope (38)
3.1.ค.) Block Scope (39)
3.1.ง.) Redeclaring Variables (ประกสำศตลัวแปรซสซสำ) (39)
3.1.จ.) Loop Scope (40)
3.2. Global Variables in HTML ................................................................................ 40
3.2.ก.) ตลัวแปร Global scope ทคีงื่ประกสำศดค้วย var เปป็นของ Window object (40)
3.2.ข.) ตลัวแปร Global scope ทคีงื่ประกสำศดค้วย let ไมยู่ไดค้เปป็นของ Window object (41)
3.3. กสำรประกสำศตรวแปรซสรั้สำ ............................................................................................ 42
3.4. Hoisting ................................................................................................................ 43
3.5. const ..................................................................................................................... 44
3.5.ก.) Block Scope (44)
3.5.ข.) Assigned when Declared (44)
3.6. เปลทที่ยนไดค้ หรรือไมม่ไดค้ ................................................................................................ 44
3.6.ก.) Not Real Constants (44)
3.6.ข.) Primitive Values (45)
3.6.ค.) Constant Objects can Change (45)
3.6.ง.) Constant Arrays can Change (45)
3.7. Redeclaring (const) ........................................................................................... 46
บททขีที่ 4 ฟฟังกร์ชลัที่น....................................................................47
4.1. ฟฟังกพ์ชรที่น (Functions) ............................................................................................. 48
4.1.ก.) โครงสรค้สำงของฟฝังกลชลังื่น (48)
4.1.ข.) Globally declared และ Locally declared (48)
4.1.ค.) ตลัวอยยู่สำง – ฟฝังกลชลังื่นทคีงื่มคีกสำรสยู่งผยู่สำน Agruments 2 ตลัว (49)
4.1.ง.) ตลัวอยยู่สำง - เรคียกใชค้ฟฝังกลชลังื่นองงื่น จสำกอคีกฟฝังกลชลังื่น (49)
4.1.จ.) ตลัวอยยู่สำง – เกก็บฟฝังกลชลังื่นไวค้ในตลัวแปร (49)
4.1.ฉ.) ตลัวอยยู่สำง – Agruments ทคีงื่เปป็นฟฝังกลชลังื่น (50)
4.1.ช.) สรค้สำงฟฝังกลชลังื่นไวค้ใชค้งสำนใน Google Sheet (50)
4.1.ซ.) ทสสำใหค้เรคียกใชค้งสำนไดค้เหมงอนกลับฟฝังกลชลังื่น Built-in (51)
4.1.ฌ.) โคค้ดแบบ Global declared (51)
4.1.ญ.) Global variable เกก็บคยู่สำจสำกกสำรรลันไวค้หรงอไมยู่ ? (52)
4.2. Arrow function - Chrome V8 ........................................................................... 53
4.3. ฟฟังกพ์ชรที่น Generator ............................................................................................... 54
4.4. Default parameters – Chrome V8 ..................................................................55
4.5. วรตถถุ Arguments ................................................................................................... 55
บททขีที่ 5 คคาเฉพาะ..................................................................57
5.1. undefined ........................................................................................................... 58
5.2. null ....................................................................................................................... 58
5.3. this ........................................................................................................................ 59
5.4. infinity .................................................................................................................. 59
5.5. continue .............................................................................................................. 60
5.6. break .................................................................................................................... 62
บททขีที่ 6 ตลัวแปรวลัตถถ...............................................................65
6.1. ตรวแปร Object (วรตถถุ) ........................................................................................... 66
6.2. เพพิที่ม, ลบ, แทรก สมสำชพิกใหค้ Object ........................................................................ 67
6.3. get, set และ Object method - Chrome V8 ...................................................68
6.3.ก.) get และ function ใน Object (68)
6.3.ข.) set (69)
6.3.ค.) Object.defineProperty() (69)
6.4. Object Constructors - Chrome V8 .................................................................70
6.4.ก.) Object Types (Blueprints) (Classes) (70)
6.5. Object Prototypes - Chrome V8 - ยค้สำย ..........................................................71
6.6. Classes - Chrome V8 - ยค้สำย ............................................................................... 72
6.6.ก.) Classes (72)
6.6.ข.) The Constructor Method (72)
6.6.ค.) Class Methods (73)
6.7. Class Inheritance หรรือ Child classes ..............................................................74
6.7.ก.) Class Inheritance (74)
6.7.ข.) Getters and Setters (75)
6.7.ค.) Hoisting (76)
6.8. เมถอด static ......................................................................................................... 77
6.9. Object destructuring – Chrome V8 *** ........................................................79
บททขีที่ 7 วลัตถถ Object..............................................................83
7.1. assign() ................................................................................................................. 84
7.2. create() ................................................................................................................ 84
7.3. defineProperty() ................................................................................................ 87
7.4. Descriptors .......................................................................................................... 88
7.5. defineProperties() ............................................................................................. 89
7.6. entries() ............................................................................................................... 89
7.7. fromEntries() ....................................................................................................... 90
7.8. freeze() ................................................................................................................ 91
7.9. isFrozen() ............................................................................................................. 91
7.10. seal() .................................................................................................................. 92
7.11. isSealed() ........................................................................................................... 93
7.12. is() ....................................................................................................................... 93
7.13. isExtensible() .................................................................................................... 94
7.14. preventExtensions() ........................................................................................ 95
7.15. keys() *** .......................................................................................................... 96
7.16. values() *** ....................................................................................................... 97
7.17. getOwnPropertyDescriptor() .........................................................................97
7.18. getOwnPropertyDescriptors() ........................................................................ 99
7.19. getOwnPropertyNames() ................................................................................ 99
7.20. getOwnPropertySymbols() ..........................................................................100
7.21. getPrototypeOf() ........................................................................................... 101
บททขีที่ 8 วลัตถถนน่าสนใจ............................................................103
8.1. วรตถถุ Set ............................................................................................................... 104
8.2. วรตถถุ WeakSet ..................................................................................................... 104
8.3. วรตถถุ Map ............................................................................................................ 105
8.4. วรตถถุ WeakMap ................................................................................................... 107
8.5. วรตถถุ Symbol ...................................................................................................... 107
บททขีที่ 9 เทคนนิคตลัวแปรวลัตถถ....................................................109
9.1. จรบ Key จสำก Value แบบททที่ 1 ............................................................................. 110
9.2. จรบ Key จสำก Value แบบททที่ 2 สรค้สำงเปป็นเมถอด ...................................................111
9.3. กรองตรวแปรวรตถถุททที่ซสรั้สำ ........................................................................................... 112
9.4. กรองตรวแปรวรตถถุททที่ซสรั้สำ โดยใชค้ 1 คทยพ์ .......................................................................113
9.5. กรองตรวแปรวรตถถุททที่ซสรั้สำ โดยใชค้ 1 คทยพ์ - Map ...........................................................114
9.6. กรองวรตถถุตสำมคทยพ์ททที่ระบถุ ......................................................................................... 114
บททขีที่ 10 เงงที่อนไขและลลูป.......................................................117
10.1. if – else if - else ............................................................................................. 118
10.1.ก.) รยปแบบของ if (118)
10.1.ข.) รยปแบบของ if – else (118)
10.1.ค.) รยปแบบของ if – else if - else(119)
10.2. switch ............................................................................................................... 119
10.3. for ..................................................................................................................... 120
10.4. for in ................................................................................................................ 122
10.5. for of ................................................................................................................ 124
10.6. while ................................................................................................................. 125
10.7. do while .......................................................................................................... 125
10.8. try catch throw finally ................................................................................. 126
10.8.ก.) try และ catch (126)
ผล (127)
10.8.ข.) throw (127)
10.8.ค.) finally (128)

บททขีที่ 11 อาเรยร์..................................................................131
11.1. อสำเรยพ์ครืออะไร ..................................................................................................... 132
11.2. พรืรั้นฐสำนขค้อมมูลชนพิดอสำเรยพ์ .................................................................................... 132
11.3. อสำเรยพ์ 2 มพิตพิ ....................................................................................................... 132
11.3.ก.) กสำรเขคียนอสำเรยล 2 มพิตพิ (133)
11.3.ข.) กสำรเขค้สำถถึงสมสำชพิกในอสำเรยล 2 มพิตพิ (133)
11.3.ค.) กสำรนลับจสสำนวนสมสำชพิกในอสำเรยล (133)
11.4. Spread operator (3 จถุด) - Chrome V8 .......................................................134
11.5. Rest parameter – Chrome V8 .....................................................................135
11.6. Array destructuring – Chrome V8 ..............................................................136
บททขีที่ 12 อาเรยร์เมถอด.........................................................139
12.1. push() .............................................................................................................. 140
12.2. unshift() ........................................................................................................... 140
12.3. pop() ................................................................................................................ 141
12.4. shift() ............................................................................................................... 141
12.5. splice() ............................................................................................................. 142
12.6. slice() ............................................................................................................... 143
12.7. ตรวอยม่สำงกสำรใชค้งสำนอสำเรยพ์เมถอดกรบอสำเรยพ์ 2 มพิตพิ ..................................................144
12.8. join() ................................................................................................................. 144
12.9. concat() ........................................................................................................... 145
12.10. indexOf() *** ............................................................................................... 146
12.11. lastIndexOf() ................................................................................................ 147
12.12. reverse() ........................................................................................................ 148
12.13. includes() - Chrome V8 ............................................................................. 148
12.14. toString() ....................................................................................................... 149
12.15. keys() ............................................................................................................. 149
12.16. fill ................................................................................................................... 150
12.17. Array.from() .................................................................................................. 150
บททขีที่ 13 อาเรยร์เมถอด ตระกลูลวนลลูป........................................153
13.1. map() ............................................................................................................... 154
13.1.ก.) map() และ อสำเรยล 1 มพิตพิ (154)
13.1.ข.) map() และ อสำเรยล 2 มพิตพิ (155)
13.2. filter() ............................................................................................................... 157
13.2.ก.) ตลัวอยยู่สำงทคีงื่ 1 (157)
13.2.ข.) ตลัวอยยู่สำงทคีงื่ 2 – ใสยู่ฟฝังกลชลังื่นเปป็น Argrument (157)
13.2.ค.) ตลัวอยยู่สำงทคีงื่ 3 - กรองตลัวเลข (158)
13.2.ง.) ตลัวอยยู่สำงทคีงื่ 4 - กรองขค้อควสำม (158)
13.2.จ.) ตลัวอยยู่สำงทคีงื่ 5 – คค้นหสำในอสำเรยล (159)
13.3. sort() ................................................................................................................ 160
13.3.ก.) ขค้อมยลเปป็นตลัวเลขทลัซงหมด (160)
13.3.ข.) ขค้อมยลเปป็นขค้อควสำมทลัซงหมด (161)
13.3.ค.) ขค้อมยลผสม (163)
13.3.ง.) เรคียงขค้อมยลในอสำเรยล 2 มพิตพิ (165)
13.3.จ.) เรคียงโดยใชค้ 2 คคียล (หรงอมสำกกวยู่สำ) – ใชค้อสำเรยลอยยู่สำงเดคียว (166)
13.3.ฉ.) เรคียงโดยใชค้ 2 คคียล (หรงอมสำกกวยู่สำ) – ใชค้ Object ชยู่วย (167)
13.4. every() และ some() ....................................................................................... 168
13.4.ก.) ตลัวอยยู่สำงทคีงื่ 1 : อสำเรยล 1 มพิตพิ (169)
13.4.ข.) ตลัวอยยู่สำงทคีงื่ 2 : อสำเรยล 2 มพิตพิ (169)
13.4.ค.) ตลัวอยยู่สำงทคีงื่ 3 : ตลัวแปรวลัตถถ (170)
13.5. forEach() .......................................................................................................... 171
13.5.ก.) รยปแบบกสำรใชค้งสำน (171)
13.5.ข.) ตลัวอยยู่สำงทคีงื่ 1 : กสำรใชค้งสำนแบบ 1 Argrument (171)
13.5.ค.) ตลัวอยยู่สำงทคีงื่ 2 : กสำรใชค้งสำนแบบ 2 Argruments (172)
13.5.ง.) ตลัวอยยู่สำงทคีงื่ 3 : : กสำรใชค้งสำนแบบ 3 Argruments (172)
13.5.จ.) ตลัวอยยู่สำงทคีงื่ 4 : ตลัวอยยู่สำงองงื่นๆ (173)
13.6. reduce() ........................................................................................................... 173
13.6.ก.) รยปแบบกสำรใชค้งสำน (174)
13.6.ข.) ตลัวอยยู่สำงทคีงื่ 1 : รวมคยู่สำของสมสำชพิกในอสำเรยล (174)
13.6.ค.) ตลัวอยยู่สำงทคีงื่ 2 : ลดมพิตพิของอสำเรยล (175)
13.6.ง.) ตลัวอยยู่สำงทคีงื่ 3 : หสำคยู่สำเฉลคีงื่ยของสมสำชพิกในอสำเรยล (175)
13.6.จ.) ตลัวอยยู่สำงทคีงื่ 4 : หสำตลัวซสซสำ และจสสำนวนกสำรซสซสำ (176)
13.6.ฉ.) ตลัวอยยู่สำงทคีงื่ 5 : หสำจสสำนวนตลัวซสซสำ และจสสำนวนกสำรซสซสำ (2) (178)
13.6.ช.) ตลัวอยยู่สำงทคีงื่ 6 : หสำผลรวมเปป็นกลถยู่มๆ (178)

บททขีที่ 14 วลัตถถ Array............................................................181


14.1. วรตถถุ Array ......................................................................................................... 182
14.2. Array() constructor ....................................................................................... 182
14.3. Array prototype constructor ......................................................................183
14.4. Array.prototype.slice.call(arguments) ......................................................183
บททขีที่ 15 เทคนนิคอาเรยร์.........................................................185
15.1. จรบแถวและคอลรมนพ์ใน Google Sheets มสำใสม่อสำเรยพ์ ..........................................186
15.2. จรบเรค้นจพ์ใสม่ในอสำเรยพ์ จรบอสำเรยพ์ใสม่ในเรค้นจพ์ (Google Sheets) ...............................186
15.2.ก.) จลับเรค้นจลใน Google Sheet มสำใสยู่ในอสำเรยล (187)
15.2.ข.) จลับคยู่สำในอสำเรยล ไปใสยู่ใน Google Sheet(187)
15.3. นสสำคอลรมนพ์ในชทรั้ทมสำคสสำนวณ แลค้ววสำงไวค้อทกคอลรมนพ์หนนที่ง (Google Sheets) .........188
15.3.ก.) พลัฒนสำกสำรทคีงื่ 1 (188)
15.3.ข.) พลัฒนสำกสำรทคีงื่ 2 (189)
15.4. กรองแถววม่สำง หรรือ แถวททที่มทเซลลพ์วม่สำงทพิรั้ง ..............................................................190
15.5. กสำรกรองตรวซสรั้สำในอสำเรยพ์ ใหค้เหลรือแตม่ตรวททที่ไมม่ซสรั้สำ ....................................................191
15.5.ก.) เทคนพิคทคีงื่ 1 - สลัซนแตยู่มคีประสพิทธพิภสำพสยง (191)
15.5.ข.) เทคนพิคทคีงื่ 2 - แยกสมสำชพิกในอสำเรยลทคีงื่ซสซสำและไมยู่ซสซสำออกเปป็นอสำเรยล 2 กค้อน (192)
15.6. กสำรกรองตรวซสรั้สำในอสำเรยพ์ ใหค้เหลรือแตม่ตรวททที่มทกสำรซสรั้สำ ...............................................192
15.7. กรองตรวซสรั้สำในอสำเรยพ์ ใหค้เหลรือแตม่ตวร ททที่ Unique ....................................................194
15.8. กสำรกรองตรวซสรั้สำในอสำเรยพ์ 2 มพิตพิ ใหค้เหลรือแตม่แถวททที่ Unique ..................................194
15.8.ก.) วพิธคีทคีงื่ 1 (194)
15.8.ข.) วพิธคีทคีงื่ 3 (195)
15.9. เปรทยบเททยบอสำเรยพ์ 2 กค้อน .................................................................................. 195
15.9.ก.) เปรคียบเทคียบอสำเรยล 2 กค้อน เกก็บตลัวทคีงื่ไมยู่ซสซสำกลันไวค้ (195)
15.9.ข.) เปรคียบเทคียบอสำเรยล 2 กค้อน เกก็บตลัวทคีงื่ไมยู่ซสซสำกลันไวค้ วพิธคีทคีงื่ 2 (196)
15.10. กรองเซลลพ์วม่สำงทพิงรั้ (ขค้อมมูล 1 คอลรมนพ์) ...............................................................196
15.11. ใชค้ filter() กรองตสำรสำงขค้อมมูลใน Google Sheet .............................................197
15.11.ก.) พลัฒนสำกสำรทคีงื่ 1 : จลับคยู่สำในคอลลัมนลมสำกรอง (198)
15.11.ข.) พลัฒนสำกสำรทคีงื่ 2 : ใสยู่ผลกสำรกรองกลลับไปทคีงื่ชคีซท (198)
15.11.ค.) พลัฒนสำกสำรทคีงื่ 3 : กรอง 2 เงงงื่อนไข (199)
15.12. ทสสำ VLOOKUP ดค้วยอสำเรยพ์ ............................................................................... 200
15.13. ทสสำ Lookup แบบครืนหลสำยคม่สำ .......................................................................... 201
15.14. วนลมูปเซซ็ตขค้อมมูลลงใน Google Sheets ...........................................................202
15.15. แทรกคอลรมนพ์ลงในอสำเรยพ์ 2 มพิตพิ ........................................................................203
15.16. จรบคอลรมนพ์ออกมสำจสำกอสำเรยพ์ 2 มพิตพิ ...................................................................204
15.17. กสำรรวมอสำเรยพ์ 2 มพิตพิ ......................................................................................... 204
15.18. ทสสำทรสำนสโพสอสำเรยพ์ 2 มพิตพิ ............................................................................... 205
15.19. หสำคม่สำสมูงสถุดตสสำสถุดในอสำเรยพ์ โดยใชค้ Spread operator – Chrome V8 .............205
15.20. สรค้สำงอสำเรยพ์วม่สำง ................................................................................................. 206
15.21. สรค้สำงอสำเรยพ์วม่สำง 2 มพิตพิ ....................................................................................... 206
15.21.ก.) สรค้สำงอสำเรยลวยู่สำง 2 มพิตพิ (206)
15.21.ข.) วนลยปกสสำหนดคยู่สำใหค้กลับอสำเรยล 2 มพิตพิ (207)
15.22. SUM แถวและคอลรมนพ์ในอสำเรยพ์ 2 มพิตพิ ...............................................................208
15.23. กรองคอลรมนพ์ในอสำเรยพ์ 2 มพิตพิ ............................................................................. 209
15.24. Piovt table โดยใชค้เมถอดของอสำเรยพ์ - ขนรั้นบทใหมม่ ..........................................211
บททขีที่ 16 รลูรู้จลักกลับ Google Services..........................................213
16.1. สรถุป OOP .......................................................................................................... 214
16.2. Google Services (G Suite services) .............................................................214
16.3. กสำรเรทยกใชค้ Google Services ...........................................................................215
16.4. Enum หรรือ Enumeration ............................................................................... 216
16.5. Interfaces ........................................................................................................ 219
บททขีที่ 17 คลาส Logger และ console......................................223
17.1. คลสำส Logger .................................................................................................... 224
17.2. log() .................................................................................................................. 224
17.3. คลสำส console .................................................................................................. 225
บททขีที่ 18 Triggers...............................................................227
18.1. Triggers ครืออะไร ............................................................................................... 228
18.2. Simple Triggers .............................................................................................. 228
18.2.ก.) ตลัวอยยู่สำง เมงงื่อคอลลัมนล A เปลคีงื่ยน พพิมพลเวลสำไวค้ทคีงื่คอลลัมนล B(229)
18.3. Event Objects ................................................................................................. 229
18.4. Installable Triggers ........................................................................................ 231
18.5. newTrigger() .................................................................................................... 233
บททขีที่ 19 การใชรู้โปรเจจ็ค Google Apps Script ในไฟลร์องที่น...............235
19.1. กสำรนสสำโปรเจซ็ค Google Apps Script ไปใชค้ในไฟลพ์อรืที่น .......................................236
19.1.ก.) ปฝัญหสำกสำรใชค้งสำน 1 โปรเจก็ค(แบบฝฝัง) ในหลสำยไฟลล (236)
19.1.ข.) กสำรนสสำโปรเจก็ค Google Apps Script ไปใชค้ในไฟลลองงื่น (236)
19.1.ค.) กสำรนสสำโปรเจก็คไปใชค้ในไฟลลองงื่นแบบขค้สำม Account และ ขค้สำม Domain (239)
19.1.ง.) สรถป (239)
คคานคา
ใครทคีงื่ตค้องกสำรเรพิงื่มตค้นเขคียนโปรแกรมดค้วย Google Apps Script หนลังสงอเลยู่มนคีซ เหมสำะสสสำหรลับกสำรเรพิงื่มตค้น
ผยค้เขคียน เขคียนหนลังสงอเลยู่มนคีซ “หลรกกสำรเขทยนโปรแกรม Google Apps Script” จถดประสงคลดลัซงเดพิม กก็คงอ เกซ็บไวค้
อม่สำนเอง
เมงงื่อผยค้เขคียนศถึกษสำเรงงื่องอะไร กก็จะไปเรคียนรยค้จสำกสงงื่อออนไลนลในอพินเตอรลเนก็ต ทลัซงคอรลสออนไลนล วพิดคีโอ หรงอ เอกสสำร
ทลัซงในแบบฟรคีและเสคียเงพิน
แตยู่ยถคนคีซ เรสำตค้องเรคียนรยค้อะไรใหค้เรก็ว โดยเฉพสำะเรงงื่องของ IT ผยค้เขคียนจถึงตลัซงใจจะดยวพิดคีโอเพคียงรอบเดคียว จถึงดยไป
พพิมพลสรถปไปดค้วย เวลสำจสสำอะไรไมยู่ไดค้ มสำดยจสำกทคีพงื่ พิมพลสรถปไวค้ งยู่สำยกวยู่สำกสำรไปยค้อนดยจสำกวพิดคีโอ นอกจสำกนคีกซ ก็ยลังนสสำมสำทบทวน
ไดค้งยู่สำย ในอนสำคตสสำมสำรถเพพิงื่มเตพิมเสรพิมแตยู่งเนงซอหสำไดค้เรงงื่อยๆดค้วย
หนลังสงอเลยู่มนคีซ ควสำมตลัซงใจดลัซงเดพิมของผยค้เขคียน กก็คงอ ตรรั้งใจเกซ็บไวค้อม่สำนเองคนเดทยว อยยู่สำงไรกก็ดคี อถตสยู่สำหลพพิมพลไวค้เปป็น
หนลังสงอแลค้ว จะเกก็บไวค้อยู่สำนคนเดคียวกก็รยค้สถึกเสคียดสำย ฉะนลัซน ผยค้เขคียนจถึงนสสำออกมสำแบยู่งปฝัน
เนรืที่องดค้วย ผมูค้เขทยนใหค้ควสำมสสสำครญกรบประเดซ็นดค้สำนลพิขสพิทธพิธิ์มสำก ฉะนรรั้นจนงขอแจค้งไวค้ ณ ททที่นทรั้ ตรรั้งแตม่ตค้น
กซ็ครือ
1. เนงซอหสำในหนลังสงอ ผยค้เขคียนรวบรวมมสำจสำกแหลยู่งตยู่สำงๆในอพินเตอรลเนก็ต โดยจะพยสำยสำมใหค้มสำกทคีงื่สดถ ทคีจงื่ ะบอก
ลพิงคลหรงอแหลยู่งทคีงื่มสำในแตยู่ละหลัวขค้อ เพรสำะหนลังสงอเลยู่มนคีซถยกเขคียนไวค้นสำนแลค้ว บสำงเรงงื่องลงมกก็กก๊อปปปปี้ลพิงคลมสำแปะไวค้
2. ผยค้เขคียนรวบรวมเนงซอหสำมสำจสำกแหลยู่งตยู่สำงๆ และเขคียนเพพิงื่มเตพิมไปดค้วย
3. หนลังสงอเลยู่มนคีซแจกฟรคี ผยค้เขคียนไมยู่มคีรสำยไดค้จสำกหนลังสงอเลยู่มนคีซ

หนลังสงอเลยู่มนคีซยลังไมยู่จบเสคียทคีเดคียว หสำกผยค้เขคียนวยู่สำง จะมสำเขคียนเพพิงื่มเตพิมเรงงื่อยๆ ใหค้ดยเวอรลชลังื่นตสำมวลันทคีงื่ทคีงื่ปลยู่อยหนลังสงอ


ขอขอบคถุณลมูกคค้สำทถุกทม่สำน สสสำหรรบกสำรจค้สำงงสำน ไมม่วม่สำจะงสำนอบรม(ทรรั้งออนไลนพ์ และ ออนไซตพ์) หรรือ งสำน
เขทยนโปรแกรม เพรสำะทสสำใหค้ผมูค้เขทยนมทเนรืรั้อหสำใหมม่ๆ และททที่จะอรพเดทหนรงสรือเลม่มนทรั้อยมูม่เสมอๆ

วสลันตล คถณดพิลกเศวต
wasankds@gmail.com
081-459-8343
Line ID : wasankds
บททขีที่ 1
Hello World
1.1. Google Apps Script แบบ Embbed Script และ Stand alone
โปรเจก็ค Google Apps Script มคี 2 ลลักษณะใหญยู่ๆ กก็คงอ แบบ Embbed Script(แบบฝฟังอยมูม่ในไฟลพ์)
และ แบบ Stand alone(แบบไฟลพ์โดด)

1.1.ก.) แบบ Embbed Script (ฝฝังอยยยู่ในไฟลล)


ขณะทสสำงสำนอยยยู่กลับไฟลล Google Apps เชยู่น Google Sheet, Google Docs หรงอ Google Slide เปป็นตค้น
เรสำสสำมสำรถสรค้สำงโปรเจก็ค Google Apps Script ไดค้โดย ไปทคีงื่เมนย Tools → Script Editor ตสำมภสำพ

จะปรสำกฎหนค้สำเวก็บสสสำหรลับเขคียนโคค้ด ซถึงื่งเรสำเรคียกหนค้สำนคีซวยู่สำ หนค้สำโปรเจซ็ค Google Apps Script ตสำมภสำพ

สสสำหรลับ IDE ตตัวใหมยู่ หรงอ Googl Apps Script Editor ตตัวใหมยู่ (เรรริ่มใชช้ ม.ค. 2021) กก็คงอ ตลัวแอพทคีงื่ใชค้
เขคียนโปรแกรม Google Apps Script มคีหนค้สำตสำดลังนคีซ
( หากตต้องการกลลับไปใชต้ Editor ตลัวเกก่า ใหต้คลลิกททที่ปปปุ่ม Use legacy editor )

Google Apps Script แบบฝฝังอยยยู่ในไฟลล Google Apps จะมองไมม่เหซ็นเปป็นชรืที่อไฟลพ์ใน Google Drive


เพรสำะฝฝังอยยยู่กลับไฟลลของ Google Apps

16 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


1.1.ข.) แบบ Stand alone (ไฟลลโดด)

เรสำสสำมสำรถสรค้สำง Google Apps Script แบบ Stand alone ไดค้ทคีงื่ Google Drive
โดย ทคีงื่หนค้สำแรก Google Drive ไปทคีงื่ New → More → Google Apps Script (ตสำมภสำพถลัดไป) จะ
เปป็นกสำรสรค้สำงโปรเจก็คและไฟลล Google Apps Script ขถึซนมสำ
โปรเจก็ค Google Apps Script แบบนคีซ สสำมสำรถมองเหก็นเปป็นไฟลลใน Google Drive ดค้วยเหตถนคีซจถึงเรคียกวยู่สำ
Stand alone (ไฟลลโดด)

หมสำยเหตถุสสสำครญ !!!
หสำกเมนย New → More → Google Apps Script ไมยู่มคี ใหค้เรสำเชงงื่อมตยู่อ Google Drive กลับแอพ Google
Apps Script กยู่อน โดย ...
ทคีงื่หนค้สำแรก Google Drive ไปทคีงื่เมนย New → More → Connection more apps จะปรสำกฎหนค้สำตยู่สำง(ตสำม
ภสำพ) ใหค้คค้นหสำดค้วยคสสำวยู่สำ apps script จะพบแอพทคีงื่ชงงื่อ Google Apps Script (ตสำมภสำพ) จสำกนลัซนใหค้คลพิกทคีงื่
Connect เพงงื่อเชงงื่อมตยู่อกลับแอพดลังกลยู่สำว

บททขีริ่ 1 : Hello World 17


1.2. โคค้ดแรก และ คคียย์ลลัดทคีที่สสสำคลัญในกสำรเขคียนโคค้ด
เมงงื่อสรค้สำงโปรเจก็ค Google Apps Script มสำแลค้ว ใหค้เรสำมสำเรพิงื่มตค้น เขคียนโคค้ดแรกกลันกยู่อน เพงงื่อทสสำควสำมเขค้สำใจ
กลับระบบโดยรวมกยู่อน
1.2.ก.) โคค้ดแรก

เขคียนโคค้ดดลังตยู่อไปนคีซ
function myFunction(){
Logger.log(“Hellow, World !!!”) ;
// ใชช้ console.log() เหมมือน Javascript ไดช้แลช้ว
console.log(“Hellow, World !!!”) ;
}

ตอนพพิมพล Logger ตสำมดค้วย . (จจุด) จะปรสำกฎ Trigger Suggest ซถึงื่งเปป็นรสำยกสำรของเมถอด หรงอ


Properties ของคลสำส Logger ใหค้เลงอก กก็ชยู่วยใหค้เรสำเขคียนโคค้ดงยู่สำยขถึซน

1.2.ข.) คอมเมค้นตล

คอมเมค้นตพ์ กก็คอง บรรทลัดของโคค้ดทคีงื่เรสำไมยู่ตค้องกสำรใหค้รลัน แตยู่มคีไวค้สสสำหรลับใหค้ผยค้เขคียนโคค้ดเขคียนอธพิบสำย


ใชค้เครงงื่องหมสำย // คอมเมค้นตล เพงงื่อมสำรลควยู่สำ บรรทลัดนคีซเปป็นคอมเมค้นตล
ใชค้เครงงื่องหมสำย /* คอมเมค้นตล */ เพงงื่อมสำรลควยู่สำภสำยในบลก็อคเปป็นคอมเมค้นตล
ตลัวอยยู่สำง
function myFunction(){
// พพิมพลขค้อความ Hellow, World !!! ททที่หนค้าตยู่าง Logger
Logger.log(“Hellow, World !!!”) ;
/*
โคค้ดในบลล็อคนทนี้ ไมยู่ถกย รตัน
*/
}

18 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


1.2.ค.) คทยลลตัด

<Ctrl></> = ใสยู่(หรงอเอสำออก) เครงงื่องหมสำย // หนค้สำบรรทลัด กก็คอง บรรทลัดนลัซนจะเปป็นคอมเมค้นตล


<Ctrl><Space> = เปปิด Trigger Suggestion เพงงื่อดยรสำยกสำร Services/Method/sProperties …
<Tab> / <Ctrl><[> = เพพิงื่มยยู่อหนค้สำใหค้กลับบรรทลัด (Indent Line)
<Shift><Tab> / <Ctrl><]>= ลยู่นยยู่อหนค้สำใหค้กลับบรรทลัด (Outdent Line)
คทยลลตัดสสาหรตับ New IDE (ททที่เพพิที่มเขค้ามา)
<F1> = ดยคสสำสลังื่งทลัซงหมด (Command pallete)

<Enter> = ขถึซนบรรทลัดใหมยู่
<Ctrl><Shift><Enter> = เพพิงื่มบรรทลัดใหมยู่ไวค้กยู่อนหนค้สำบรรทลัดปฝัจจถบลัน

<F2> = เปลคีงื่ยนชงงื่อ Symbol ทลัซงหมด (Rename symbol) –


( Symbol หมสำยถนงตรวแปร, ชรืที่อฟฟังกพ์ชรที่นททที่เรสำตรงรั้ เอง เปป็นตค้น )
<Ctrl><F2> = เพพิงื่มเคอรลเซอรล ณ ตสสำแหนยู่งทคีงื่พบทลัซงหมด (Change all occurences)

<Ctrl><D> = เพพิงื่มเคอรลเซอรล ณ ตสสำแหนยู่งทคีงื่พบ ตลัวถลัดไป (Add selection to next find match)


<Alt><Shift> + <Down>/<Up> = เพพิงื่มเคอรลเซอรล ณ บรรทลัดลยู่สำง/บน
<Ctrl><U> = ยกเลพิกเคอรลเซอรล (ทคีละอลันทคีงื่พถึงื่งสรค้สำงไป)

<Alt> + <Down>/<Up> = ยค้สำยโคค้ดไปบรรทลัดลยู่สำง/บน


<Ctrl><Shift> + <Left>/<Right> = เลงอกทลัซงคสสำ ไปทสำงดค้สำนซค้สำย/ดค้สำนขวสำ
F1 → Editor Font Zoom In = ซยมเขค้สำ (ตลัวอลักษรใหญยู่ขถึซน)
F1 → Editor Font Zoom Out = ซยมออก (อลักษรเลก็กลง)
F1 → Editor Font Zoom Reset = รคีเซก็ตกสำรซยม

<Ctrl><F> = คค้นหสำ
<Ctrl><H> = คค้นหสำและแทนทคีงื่
( เมงงื่อไดค้ผลกสำรคค้นหสำแลค้ว )
<Enter> = โดดไปยลังคสสำทคีงื่คค้นหสำตลัวถลัดไป (เคอรลเซอรลตค้องอยยยู่ทคีงื่ Search Box)
<Shift><Enter> = โดดไปยลังคสสำทคีงื่คค้นหสำตลัวกยู่อนหนค้สำ (เคอรลเซอรลตค้องอยยทยู่ คีงื่ Search Box)

<Ctrl><Shift> + <[> = มค้วนบรรทลัดของโคค้ดเกก็บ (ซยู่อนโคค้ดในบลก็อค)


<Ctrl><Shift> + <]> = คลคีงื่บรรทลัดของโคค้ดออก (แสดงโคค้ดในบลก็อค)

บททขีริ่ 1 : Hello World 19


<Ctrl><Shift><O> = เปปิดหนค้สำตยู่สำงเพงงื่อเลงอกโดดไปยลัง Symbol ทคีตงื่ ค้องกสำร เชยู่น ตลัวแปร, ฟฝังกลชลังื่น
<Ctrl><Shift><I> = จลัดรยปแบบเอกสสำรทลัซงหมด (Format document)
<Ctrl> + <Down>/<Up> = เลงงื่อนหนค้สำจอขถึซน 1 บรรทลัด (เคอรลเซอรลไมยู่ขยลับ)
<Ctrl><Shift> + <K> = ลบทลัซงบรรทลัด
<Ctrl><Shift> + <\> = โดดไปยลังไปวงเลก็บทคีงื่เปป็นคยยู่กลัน สลลับไปมสำ
หมสำยเหตถุ : คสสำสลังื่งองงื่นๆใหค้กด <F1> จะปรสำกฎรสำยกสำรคสสำสลังื่งและคคียลลลัด
1.2.ง.) รตันโคค้ด
โคค้ดถยกเขคียนอยยยู่ในบลก็อคของฟฝังกลชลังื่น เวลสำรลันโคค้ดเรสำจะรลันทคีฟงื่ ฝังกลชลังื่น ซถึงื่งสสำมสำรถรลันไดค้ดลังนคีซ
ขรรั้นตอนกสำรรรนโคค้ด
1. บรนทนกโปรเจซ็ค - คลพิกทคีงื่ปถปุ่ม Save หรงอกด <Ctrl><S>
( <Ctrl><Shift><S> = บลันทถึกทถกไฟลล - New IDE ไมยู่มคีแลค้ว )
2. เลรือกฟฟังกพ์ชรที่นททที่จะรรน – เชยู่น ฟฝังกลชลังื่นชงงื่อ helloWorld
3. รรนโคค้ด - คลพิกปถปุ่ม Run(ปจุปุ่ม 3 เหลทที่ยม) หรงอกด <Ctrl><R>

สสสำหรลับ New IDE

20 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


1.2.จ.) เปปิดดย Logs

( IDE ตรวใหมม่ ไมม่มทแบบนทรั้แลค้ว )

Logs เปป็นหนค้สำตยู่สำงทคีงื่ใชค้รลับผลจสำกกสำรรลันโคค้ดมสำแสดง เมงงื่อรลันโคค้ดแลค้ว ถค้สำโคค้ดของเรสำเรคียกใชค้บรพิกสำรของ


Logger เรสำสสำมสำรถเปปิดดย Logs ไดค้โดยไปทคีงื่ เมนย View → Logs หรงอกด <Ctrl><Enter>

1.2.ฉ.) Logs - Chrome V8

( IDE ตรวใหมม่ ไมม่มทแบบนทรั้แลค้ว )


Google Apps Script รถนยู่ ลยู่สำสถดใชค้เครงงื่องยนตล Chrome V8 ไดค้เพพิงื่ม Logs ระบบใหมยู่ กก็คงอ Stackdriver
logging เมงงื่อรลันสครพิปตลแลค้วกด <Ctrl><Enter> เพงงื่อดย Logs แบบเดพิมกก็ไดค้ (แตยู่ชค้สำกวยู่สำเดพิมมสำก)

หรงอจะดย Logs ทคีงื่ Stackdriver logging กก็ไดค้ โดยไปทคีงื่เมนย View → Stackdriver logging จะปรสำกฎ
หนค้สำตสำมภสำพ

คลพิกทคีงื่ Apps Script Dashboard จะปรสำกฎหนค้สำเวก็บแสดง Logs ตสำมภสำพถลัดไป

บททขีริ่ 1 : Hello World 21


เมงงื่อรลันสครพิปตล ผลจสำก Logs จะปรสำกกฎทคีงื่นคีงื่ โดย Logs ตยู่สำงๆทคีงื่เรสำเคยรลันไวค้จะเกก็บไวค้ทคีงื่นคีงื่ดค้วย สสำมสำรถดย
ยค้อนหลลังไดค้ นคีงื่เปป็นขค้อดคีของ Logs แบบนคีซ

1.2.ช.) Logs – New IDE

New IDE ตลัวใหมยู่ ของ Google Apps Script เมงงื่อรลันสครพิปตลหนค้สำตยู่สำง Execution Log จะปรสำกฎเลย
กรณคีตค้องกสำรดยหนค้สำรวม Logs ใหค้คลพิกทคีงื่ปถุปุ่ม (Execution Log)

22 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


1.3. Apps Script Dashboard

เมงงื่อสรค้สำงโปรเจก็ค Google Apps Script อะไรกก็ตสำม ไมยู่วยู่สำจะแบบฝฝังในไฟลล หรงอ แบบไฟลลโดด เรสำ


สสำมสำรถดยโปรเจก็ค Google Apps Script ทลัซงหมดไดค้ทคีงื่ Apps Script Dashboard ตสำมลพิงคลดลังตยู่อไปนคีซนคีซ
https://script.google.com/home/my
สลังเกตถทคีงื่ไอคยู่อนหนค้สำชงงื่อโปรเจก็ค จะเหก็นวยู่สำเปป็นแบบฝฝังในไฟลลอะไร หรงอเปป็นแบบ Stand alone

บททขีริ่ 1 : Hello World 23


24 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)
บททขีที่ 2
ตลัวแปร และ
โอเปอรร์เรเตอรร์
2.1. Variables และ Data Types
Apps Script Blastoff
https://courses.benlcollins.com/courses/enrolled/435404
JavaScript Data Types
https://www.w3schools.com/js/js_datatypes.asp
Variables หรงอ ตรวแปร ใชค้เกก็บคยู่สำตยู่สำงๆ โดย Variables มคีหลสำยชนพิดแลค้วแตยู่วยู่สำจะใชค้เกก็บอะไร ฉะนลัซน
Variables จถึงจสสำแนกไดค้หลสำยชนพิด ซถึงื่งเรสำเรคียกคถณสมบลัตพินคีซวสำยู่ Data Types หรงอ ชนพิดขค้อมยล

ใหค้ทดสอบพพิมพลโคค้ดตยู่อไปนคีซ แลค้วดยทคีงื่ Logs เพงงื่อเรคียนรยค้เรงงื่องชนพิดของขค้อมยล


ใชค้ typeof (ชนพิดตตัวแปร) เพงงื่อดยวยู่สำ ตลัวแปรดลังกลยู่สำวมคี ชนพิดขค้อมยล เปป็นอะไร

// 1. String (text values) – ขช้อความ – ใหช้ใชช้ Single qoutes ครอบ ============


var myName = 'Wasan Khunnadiloksawet' ;
Logger.log(myName) ; // พรมพต์ : Wasan Khunnadiloksawet
Logger.log(typeof myName) ; // พรมพต์ : String

// 2. Number – ตลัวเลข =============================================


var myAge = 41 ;
Logger.log(myAge); // พรมพต์ : 41
Logger.log(typeof myAge); // พรมพต์ : number

// 3. Boolean – บบูลลขีน มขี 2 คค่า true/false ===============================


var result = true ;
Logger.log(result); // พรมพต์ : true
Logger.log(typeof result); // พรมพต์ : boolean
// ไมค่ไดช้ประกาศตลัวแปร แบบนขีนี้ไมค่ดขี
alpha = 10 ;
Logger.log(alpha) ;
Logger.log(typeof alpha) ;

// 4. Function - ตลัวแปรแบบฟฟังกต์ชลัริ่น ==================================


var newFunc = function(a,b){
return a+b ;
};
Logger.log(newFunc) ; // พรมพต์ : ( Code ของ newFunc )
Logger.log(typeof newFunc) ; // พรมพต์ : function
// ตลัวอยค่างการเรขียกใชช้งานฟฟังกต์ชลัริ่น
Logger.log(newFunc(5,11)) ; // พรมพต์ : 16

26 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


// 5. Object – ตลัวแปรวลัตถคุ ============================================
var myDetail = {
name :'Wasan' ,
lastname :'KDS' ,
age : 43
};
Logger.log(myDetail); // พรมพต์ : {name=Wasan, age=43.0, lastname=KDS}
Logger.log(typeof myDetail); // พรมพต์ : object
// 6. Array – อาเรยต์ - กช้อนขช้อมบูล ============================================
var myArray = [ 1 , 2 , 3 , 4 , "AAA" ] ;
Logger.log(myArray); // พรมพต์ : [1.0, 2.0, 3.0, 4.0, AAA]
Logger.log(typeof myArray); // พรมพต์ : object *** Array is an object data type.

2.2. Operators
JavaScript Operators
https://www.w3schools.com/js/js_operators.asp

Operators หรงอ ตรวดสสำเนพินกสำร เชยู่น เครงองื่ งหมสำย +, -, *, / เปป็นตค้น แลค้วแตยู่วสำยู่ กสำรคสสำนวณของเรสำเปป็น


สยตรแบบไหน สยตรตลัวเลข ขค้อควสำม บยลลคีน อสำเรยล เปป็นตค้น กก็จะมคีเครงงื่องหมสำยโอเปอรลเตอรลใหค้เลงอกใชค้ตยู่สำงกลัน
ทดสอบพพิมพลโคค้ดตยู่อไปนคีซ แลค้วดยทคีงื่ Logger
2.2.ก.) Arithmetic Operators (สสาหรตับตตัวเลข)

function mathOperators() {
var a = 10 ;
var b = 2 ;
// โอเปอรต์เรเตอรต์พมืนี้นฐาน ============================================
Logger.log(a+b) ; // พรมพต์ : 12.0
Logger.log(a-b) ; // พรมพต์ : 8.0
Logger.log(a*b) ; // พรมพต์ : 20.0
Logger.log(a/b) ; // พรมพต์ : 5.0
Logger.log(a**b) ; // พรมพต์ : 100 ( 10 ยกกกาลลัง 2 ) - ใชช้ไดช้แลช้วใน Chrome V8
// หารเอาเศษ ============================================
Logger.log(a%b) ; // พรมพต์ : 0
Logger.log(5%2) ; // พรมพต์ : 1.0
Logger.log(1%0) ; // พรมพต์ : NaN
// ยกกกาลลัง ============================================
// Math object ( ดบูเพรริ่มเตรมขช้อ บททขีริ่ 16 รบูช้จลักกลับ Google Services หนช้า 203 )
var c = Math.pow(a, b) ;
Logger.log(c) ;

บททขีริ่ 2 : ตลัวแปร และ โอเปอรต์เรเตอรต์ 27


2.2.ข.) Assignment operators
ใชค้กสสำหนดคยู่สำใหค้กลับตลัวแปร กก็คอง =, +=, -=, *=, /=, %= และ **=
// เพรริ่มคค่าหรมือลดคค่าดช้วย 1 ============================================
var i=0 ; Logger.log(i) ; // พรมพต์ : 0
i++ ; Logger.log(i) ; // พรมพต์ : 1
i-- ; Logger.log(i) ; // พรมพต์ : 0
// เพรริ่มคค่าหรมือลดคค่า ดช้วยคค่าอขีกตลัว ========================================
var x = 1
var y = 50
var z = 5
var w = 100
for ( var i = 1 ; i < 5 ; i++){
x += i ; // x = x + i
y -= i ; // y = y + i
z *= i ; // z = z + i
w /= i ; // w = w + i
}
Logger.log(x) ; // พรมพต์ : 11
Logger.log(y) ; // พรมพต์ : 40
Logger.log(z) ; // พรมพต์ : 120
Logger.log(w) ; // พรมพต์ : 4.1666666666666667
}

ดยกสำรลยปแตยู่ละครลัซง ตสำมตสำรสำงตยู่อไปนคีซ
ลยป i x y x w
1 1 2 49 5 100
2 2 4 47 10 50
3 3 7 44 30 16.6666668
4 4 11 40 120 4.16666667

2.2.ค.) String operators


เครงงื่องหมสำย + ใชค้เชงงื่อม String (อลักขระ ตลัวอลักษร หรงอขค้อควสำม)
function stringOperators(){
// ใชค้เครรที่องหมาย Single qoutes หรรอ Doubles qoutes ครอบคยู่าททที่เปป็นขค้อความ
// ตลัวไหนกก็ไดช้ แตค่ตอช้ งเหมมือนกลันทลันี้งบรรทลัด
var string1 = "Wasan"; // Double quotes
var string2 = 'Khunnadiloksawet' ; // Single quotes
var string3 = 'Napabhorn'; // Single quotes
// ใชค้เครรที่องหมาย + ในการเชรที่อมขค้อความ
var fullname = string3+" & "+ string1 + " " + string2 ;
Logger.log(fullname) ;
// พรมพต์ : Napabhorn & Wasan Khunnadiloksawet
}

28 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


2.2.ง.) Comparison operators
ใชค้สสสำหรลับเปรคียบเทคียบ ไดค้ทลัซงตลัวเลขและขค้อควสำม เชยู่น เครงงื่องหมสำย =, <, >, ! เปป็นตค้น เนค้นทสสำควสำม
เขค้สำใจกลับเครงงื่องหมสำยเทยู่สำกลับ เพรสำะมทถนง 3 แบบ กก็คงอ = , == , ===

function comparisonOperators(){
var a=10 ; // Number
var b='10' ; // Text – เปป็นขช้อความ แตค่หนช้าตาเปป็นตลัวเลข
Logger.log(a) ; // พรมพต์ : 10.0
Logger.log(typeof a) ; // พรมพต์ : number
Logger.log(b) ; // พรมพต์ : 10
Logger.log(typeof b) ; // พรมพต์ : string
// 1. Single = : เครมืริ่องหมาย = อลันเดขียว เอาคค่าจากขวาไปใสค่ซช้าย
a = b;
Logger.log(a) ;
Logger.log(typeof a) ;
// 2. Double == : เปรขียบเทขียบเฉพาะคค่า
Logger.log(a==b) ; // พรมพต์ : true - แมช้ชนรดขช้อมบูลไมค่ตรงกลัน
// 3. Triple === : เปรขียบเทขียบคค่าและชนรดขช้อมบูล
Logger.log(a===b) ; // พรมพต์ : false - ตรวจสอบทลันี้งคค่าและชนรดของขช้อมบูล
// 4. Not equal != : เปรขียบเทขียบเฉพาะคค่า
Logger.log(a != b) ; // พรมพต์ : false - เพราะ คค่าตรงกลัน
// 5. Not equal !== : เปรขียบเทขียบทลันี้งคค่าและชนรด
Logger.log(a !== b) ; // พรมพต์ : true - เพราะ ชนรดขช้อมบูล ไมค่ตรงกลัน
// 6. Greater than, Less than operators
var c=50 ;
var d=100 ;
Logger.log(c>d); // พรมพต์ : false
Logger.log(c>=d); // พรมพต์ : false
Logger.log(c<d); // พรมพต์ : true
Logger.log(c<=d); // พรมพต์ : true
}

2.2.จ.) Logical Operators


Logical Operators
https://www.w3schools.com/js/js_comparisons.asp
Logical Operators หรงอ ตตัวดสาเนพินการตรรกะ มคี 3 ตลัวกก็คงอ && (และ) , || (หรงอ) และ ! (ไมยู่)

Operators Description Example


&& and (x < 10 && y > 1)
|| or (x == 5 || y == 5)
! not !(x == y)

บททขีริ่ 2 : ตลัวแปร และ โอเปอรต์เรเตอรต์ 29


ตรวอยม่สำง
function myFunction() {
var num = 62 ;
if(num > 0 && num < 100) { // คะแนนมากกวค่า 0 และ นช้อยกกวค่า 100
Logger.log("คะแนนของคจุณ ครอ " + num) ;
} else {
Logger.log("Error") ;
} ; // End – if
} // End – function

ตรวอยม่สำงททที่ 2
function myFunction2() {
var xxx = 62 ;
var yyy ; // ประกาศตลัวแปรแตค่ไมค่ไดช้กกาหดนคค่า - undefined
if(xxx) {
Logger.log(xxx) ; // 62
}
if(yyy) {
Logger.log(yyy) ;
}else{
Logger.log(typeof yyy) ; // undefined
}
} // End – function

2.2.ฉ.) in
The in Operator
https://www.w3schools.com/jsref/jsref_operators.asp
in จะคงนคยู่สำกลลับมสำเปป็น true ถค้สำคถณสมบลัตพิหรงอคคีย(ล Property/Key)ทคีงื่ระบถ มคีในอก๊อบเจก็กตล กรณคีเปป็นอก๊อบ
เจก็กตล ระบถโดยใชค้คคียล กรณคีเปป็นอสำเรยล ระบถโดยใชค้ดรรนคีลสสำดลับ(ใชค้คถณสบลัตพิ length กก็ไดค้) ตรวอยม่สำง
// Arrays
var cars = ["Saab", "Volvo", "BMW"] ;
"Saab" in cars // false (specify the index number instead of value)
0 in cars // true
1 in cars // true
4 in cars // false (does not exist)
"length" in cars // true (length is an Array property)
// Objects
var person = {firstName:"John", lastName:"Doe", age:50} ;
"firstName" in person // true
"age" in person // true
// Predefined objects - วลัตถคุทขีริ่มอขี ยบูค่แลช้วในระบบ
"PI" in Math // true
"NaN" in Number // true
"length" in String // true

30 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


2.2.ช.) Ternary Operator (ประกาศตตัวแปรตามเงรที่อนไข)

JavaScript Comparison and Logical Operators


https://www.w3schools.com/js/js_comparisons.asp
ขค้อนคีซ ไมยู่รยค้วสำยู่ ควรจะจลัดอยยยู่ในหลัวขค้อ ตรวแปร หรงอ Operator ดคี เพรสำะมลันคสำบเกคีงื่ยวกลันทลัซง 2 อยยู่สำง
เรสำสสำมสำรถประกสำศตลัวแปร ตสำมเงงงื่อนไขไดค้ดค้วย โดยใชค้ Operator ? ตสำมรยปแบบกสำรใชค้งสำนตยู่อไปนคีซ
variablename = (condition) ? value1 : value2
// true false

ถค้สำเงงงื่อนไขเปป็น true ตลัวแปร จะเกก็บคยู่สำ value1 แตยู่ถค้สำเปป็น false จะเกก็บคยู่สำ value2 ไวค้
ตรวอยม่สำง
var voteable, age = 19 ;
ar voteable = (age < 18) ? "Too young" : "Old enough" ;
Logger.log(voteable) ; // พรมพต์ : Old enough

2.2.ซ.) ใชค้ || และ && ประกาศตตัวแปรตามเงรที่อนไข

มคีอคีกแบบทคีงื่คลค้สำยกลับ Ternary Operator กก็คงอกสำรใชค้ || หรงอ &&


ตรวอยม่สำง
var a = false ;
// true ไดช้ตลัวแรก false ไดช้ตลัวทขีริ่ 2
var b = a || "Hello" ;
Logger.log(b) ; // ผล : Hello
var x ; // ตอนนขีเนี้ ปป็น undefined
var y = x || "No" ;
Logger.log(y) ; // ผล : No

ตรวอยม่สำง
var msg = 0 ;
var newMsgTxt = "You have " + msg + " messages." ;
var noNewMsgText = "Sorry, you have no new messages." ;
Logger.log(( msg && newMsgTxt) || noNewMsgText) ;

ผล – ถค้สำ msg = 0 ;
Sorry, you have no new messages.

ผล – ถค้สำ msg = 1 ;
You have 1 messages.

บททขีริ่ 2 : ตลัวแปร และ โอเปอรต์เรเตอรต์ 31


2.3. Backticks – Chrome V8

คยู่สำทคีงื่เปป็นสตรพิงนอกจสำกใชค้ ' ' หรรอ " " ครอบสตรพิงแลค้ว เรสำสสำมสำรถใชค้ Backticks หรงอ Grave accent
หรงอ เครรืที่องหมสำย ` ` ครอบไดค้ดค้วย แตยู่มคีควสำมพพิเศษในกสำรใชค้งสำนมสำกกวยู่สำ

หมสำยเหตถุ
Backticks ตค้องใชค้ปถปุ่มตลัวหนอนในกสำรพพิมพล ซถึงื่งใครทคีใงื่ ชค้ทสสำเปป็นปถปุ่มสลลับภสำษสำไปแลค้วจะพพิมพลไมยู่ไดค้ วพิธคีแกค้
- สสสำหรลับ Windows กด <Alt><96> (ไมยู่ไดค้ทดสอบใน Windows ถค้สำไมยู่ไดค้ขออภลัยดค้วย)
- สสสำหรลับ Linux <Ctrl><Shift><U> + <60> + <Enter> (ใชค้แปป้นพพิมพลภสำษสำอลังกฤษ)
ดบูเพรริ่มเตรม - https://www.fileformat.info/info/unicode/char/0060/index.htm
https://en.wikipedia.org/wiki/List_of_Unicode_characters

2.3.ก.) ใชค้ตตัวแปรใน Backticks


สสำมสำรถจลับตลัวแปรใสยู่ใน Backticks ไดค้ โดยใสยู่ใน ${ }
ตรวอยม่สำง
let a = 3 ;
let b = 4.123 ;
let c = -5.123 ;
console.log(`The max value is ${Math.max(a, b, c)} ` ) ;
// The max value is 4.123

2.3.ข.) พพิมพลอกตั ขระพพิเศษใน Backticks


ใน Backticks ถค้สำเรสำจะใชค้อลักระพพิเศษ ไมยู่ตค้องใชค้ \ พพิมพลไวค้กยู่อนหนค้สำอคีกแลค้ว ควสำมซลับซค้อนในกสำรสรค้สำง
ตลัวแปรขค้อควสำม กก็นค้อยลงดค้วย
ตรวอยม่สำง
let person = {
name : 'Wasan' ,
age : 43
};
// ใชช้ " "
let str = "<p>My name is " + person.name + ",</p>\n" +
"<p>I am " + person.age + " \! years old</p>\n"
// ใชช้ ` `
let newStr = `<p>My name is ${person.name},</p>
<p>I am ${person.age} ! years old</p> ` ;
console.log(str) ; // ดบูผลทขีริ่ Logs ------------------ > [ 01 ]
console.log(newStr) ; // ดบูผลทขีริ่ Logs ------------------ > [ 02 ]

32 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ผล – ใหค้ผลเหมงอนกลัน แตยู่ควสำมซลับซค้อนในกสำรสรค้สำงสตรพิงตยู่สำงกลัน

Logs
[ 01 ] <p>My name is Wasan,</p>
<p>I am 43 ! years old</p>
[ 02 ] <p>My name is Wasan,</p>
<p>I am 43 ! years old</p>

2.4. Use Strict – Chrome V8


JavaScript Use Strict
https://www.w3schools.com/js/js_strict.asp

คคียลเวพิรดล use strict ใชค้บอกโคค้ดวยู่สำควรจะทสสำงสำนในโหมด stick หรงอไมยู่ ถค้สำเปปิดโหมด stick เรสำจะไมยู่


สสำมสำรถใชค้ตลัวแปรทคีงื่ไมยู่ประกสำศไดค้ หรงอประกสำศผพิดรยปแบบกก็ใชค้งสำนไมยู่ไดค้
use strict ชยู่วยใหค้เรสำเขคียนโคค้ดทคีงื่ปลอดภลัย รอบคอบยพิงื่งขถึซน

Browser รถนยู่ ใหมยู่ๆ รองรลับคคียลเวพิรดล นคีซ แตยู่รถยู่นเกยู่สำๆ จะมองขค้สำมไป

ตรวอยม่สำง

"use strict" ;
x = 3.14 ; // Error เพราะ x ไมค่ไดช้ประกาศ
"use strict";

ตรวอยม่สำง
myFunction() ;
function myFunction() {
y = 3.14 ; // Error เพราะ y ไมค่ไดช้ประกาศ
}

use strict สสำมสำถใชค้แบบ Local ภสำยในฟฝังกลชลังื่นไดค้ดค้วย กก็คงอ มคีอสำณสำเขตกสำรทสสำงสำนเฉพสำะภสำยในฟฝัง


กลชลังื่นเทยู่สำนลัซน

x = 3.14 ; // OK - x ใชช้งานไดช้
myFunction() ;
function myFunction() {
"use strict" ;
y = 3.14 ; // Error เพราะ y ไมค่ไดช้ประกาศ
}

บททขีริ่ 2 : ตลัวแปร และ โอเปอรต์เรเตอรต์ 33


ตรวอยม่สำง : แมค้จะปรสำกสำศตลัวแปร แตยู่ถค้สำประกสำศนอกเหนงอโหมด Stick จะเกพิด Error เชยู่นกลัน
"use strict" ;
var x = 010 ; // Error เพราะ ไมค่อนคุญาตเลขฐาน 8
var y = "\010" ; // Error เพราะ ไมค่อนคุญาตเลขฐาน 8 ทขีริ่มขี \
var eval = 3.14 ; // Error เพราะ eval เปป็นคกาสงวน

2.5. Bitwise Operators


JavaScript Bitwise Operators
https://www.w3schools.com/jsref/jsref_operators.asp
( ผผต้เขทยนไมก่เคยใชต้ แตก่เขทยนเกก็บไวต้ เผผที่อมทโอกาสไดต้ใชต้ )

Bitwise Operators(ตลัวดสสำเนพินกสำรบพิต) ทสสำงสำนกลับตลัวเลข 32 บพิต ตลัวเลขใดๆ ในกสำรดสสำเนพินกสำรจะถยก


แปลงเปป็นตลัวเลข 32 บพิต ผลลลัพธลจะถยกแปลงกลลับเปป็นเลข JavaScript
ตลัวอยยู่สำง
Operator Description Example Same as Result Decimal
& AND x=5&1 0101 & 0001 0001 1
| OR x=5|1 0101 | 0001 0101 5
~ NOT x=~5 ~0101 1010 10
^ XOR x=5^1 0101 ^ 0001 0100 4
<< Left shift x = 5 << 1 0101 << 1 1010 10
>> Right shift x = 5 >> 1 0101 >> 1 0010 2

ตลัวอยยู่สำงขค้สำงตค้น ใชค้เลข 4 บพิตทคีงื่ไมยู่มคีลสำยเซก็น แตยู่ JavaScript ใชค้ตวลั เลขทคีงื่มคีลสำยเซก็น 32 บพิต


ดค้วยเหตถนคีซใน JavaScript ~5 จะไมยู่คงนคยู่สำ 10 มลันจะสยู่งคงน -6
~00000000000000000000000000000101 จะคงนมสำเปป็น 11111111111111111111111111111010

34 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


บททขีที่ 3
var, let และ const
(Chrome V8)
3.1. let และ var
JavaScript Let
https://www.w3schools.com/js/js_let.asp
ES2015 (และ Apps Script Chrome V8) เปปิดใชค้ let และ const โดยกยู่อนหนค้สำ ES2015 Javascript มคี
เพคียง var และ 2 Scopes กก็คงอ Global Scope และ Function Scope กก็คงอ ประกสำศตลัวแปรไวค้นอกฟฝังกลชลังื่น
หรงอ ในฟฝังกลชลังื่น
3.1.ก.) Global Scope
ตลัวแปรประกสำศไวค้นอกฟฝังกลชลังื่น สสำมสำรถเรคียกใชค้จสำกทคีงื่ไหนกก็ไดค้ในโปรแกรม Javascript
var carName = "Volvo" ;
// โคช้ดตรงนขีนี้สามารถใชช้ carName
function myFunction() {
// โคช้ดตรงนขีนี้สามารถใชช้ carName
}

ตลัวอยยู่สำง
var x = 2
Logger.log("X1 : " + x )

function test() {
var x = 20 ;
Logger.log("X2 : " + x )
}
Logger.log("X3 : " + x)

ผล – ใน Apps Script ตลัวแปรทคีงื่ประกสำศแบบ Global scope จะถยกดสสำเนพินกสำรกยู่อน ไมยู่วยู่สำจะอยยตยู่ รงไห


Logs
[] X1 : 2
[] X3 : 2
[] X2 : 20

3.1.ข.) Function Scope


ตลัวแปรประกสำศไวค้ในฟฝังกลชลังื่น เรคียกใชค้ไดค้เฉพสำะในฟฝังกลชลังื่นนลัซนๆ (สสำมสำรถใชค้ชงงื่อซสซสำไดค้ในฟฝังกลชลังื่นองงื่นๆ)
// โคช้ดตรงนขีนี้ไมค่สามารถใชช้ carName
function myFunction() {
var carName = "Volvo" ;
// โคช้ดตรงนขีนี้สามารถใชช้ carName
}
// โคช้ดตรงนขีนี้ไมค่สามารถใชช้ carName

36 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


3.1.ค.) Block Scope
ตลัวแปรประกสำศดค้วย var ไมยู่สสำมสำรถมคี Block Scope ตลัวแปรประกสำศดค้วย var ในบลก็อค { } สสำมสำรถ
เรคียกใชค้ไดค้จสำกภสำยนอก
เชยู่น

{
var x = 2 ;
}
// x สามารถใชช้ทขีริ่นขีริ่ไดช้

กยู่อนหนค้สำ ES2015 Javascript ไมยู่มคี Block scope


ตลัวแปรประกสำศดค้วย let สสำมสำรถใชค้ภสำยใน Block ไดค้ แตยู่ไมยู่สสำมสำรถเรคียกใชค้ไดค้จสำกภสำยนอก เชยู่น ใชค้ไดค้
เฉพสำะใน for(){} เปป็นตค้น
เชยู่น

{
let x = 2 ;
}
// x ไมค่สามารถใชช้ทขีริ่นขีริ่ไดช้

3.1.ง.) Redeclaring Variables (ประกาศตตัวแปรซสนี้า)


กสำรประกสำศตลัวแปรซสซสำ ดค้วย var อสำจสรค้สำงปฝัญหสำ กสำรประกสำศตลัวแปรซสซสำภสำยในบลก็อค จะประกสำศซสซสำ
นอกบลก็อคดค้วย
เชยู่น

function ftest() {
var x = 10 ;
// ตรงนขีนี้ x กก็คอมื 10
{
var x = 2 ;
// ตรงนขีนี้ x กก็คอมื 2
}
// ตรงนขีนี้ x กก็คอมื 2
}

บททขีริ่ 3 : var, let และ const (Chrome V8) 37


กสำรประกสำศตลัวแปรซสซสำ ดค้วย let แกค้ไขปฝัญหสำขค้สำงตค้นไดค้ กสำรประกสำศตลัวแปรซสซสำภสำยในบลก็อค จะไมยู่เกคีงื่ยว
กลับนอกบลก็อค
function ftest() {
var x = 10 ;
// ตรงนขีนี้ x กก็คมือ 10
{
let x = 2 ;
// ตรงนขีนี้ x กก็คมือ 2 – let ใชช้ไดช้แตค่ใน Block
}
// ตรงนขีนี้ x กก็คมือ 10
}

3.1.จ.) Loop Scope


กสำรใชค้ var ในลยป

var i = 5 ;
for (var i = 0 ; i < 10 ; i++) { // ประกาศซกนี้า – assign คค่าใหมค่
// โคช้ด
}
// ตรงนขีนี้ i กก็คมือ 10

กสำรใชค้ let ในลยป

var i = 5 ;
for (let i = 0 ; i < 10 ; i++) { // ประกาศซกนี้า - คนละตลัว
// โคช้ด
}
// ตรงนขีนี้ i กก็คมือ 5 – เพราะ i ทขีนริ่ กาไปวนลบูป เปป็นคนละตลัวกลับทขีริ่ประกาศดช้วย var

3.2. Global Variables in HTML

ดค้วย Javascript ตลัวแปรแบบ Global scope อยยยู่ในสภสำวะแวดลค้อมของ Javascript ใน HTML ตลัวแปร


แบบ Global scope กก็คงอ Window object

3.2.ก.) ตตัวแปร Global scope ททปที่ ระกาศดค้วย var เปป็นของ Window object
ตลัวอยยู่สำง
var carName = "Volvo";
// โคช้ดตรงนขีนี้สามารถใชช้ window.carName

38 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตลัวอยยู่สำง
<body>
<h2>JavaScript Global Variables</h2>
<p>In HTML, global variables defined with <b>var</b>, will become window variables. </p>
<p id="demo"></p>
<script>
var carName = "Volvo";
// โคช้ดตรงนขีนี้สามารถใชช้ window.carName
document.getElementById("demo").innerHTML = "I can display " + window.carName ;
</script>
</body>

ผล

3.2.ข.) ตตัวแปร Global scope ททปที่ ระกาศดค้วย let ไมยู่ไดค้เปป็นของ Window object

let carName = "Volvo" ;


// โคช้ดตรงนขีนี้ไมค่สามารถใชช้ window.carName

ตลัวอยยู่สำง
<body>
<h2>JavaScript Global Variables</h2>
<p>In HTML, global variables defined with <b>let</b>, will not become window variables.
</p>
<p id="demo"></p>
<script>
let carName = "Volvo";
// code here can use window.carName
document.getElementById("demo").innerHTML = "I can not display " + window.carName ;
</script>
</body>

บททขีริ่ 3 : var, let และ const (Chrome V8) 39


ผล

3.3. กสำรประกสำศตลัวแปรซสซสำ
กสำรประกสำศตลัวแปรซสซสำดค้วย var ทสสำไดค้ทกถ ทคีงื่ในโปรแกรม
var x = 2 ;
// x กก็คมือ 2
var x = 3 ;
// ตอนนขีนี้ x กก็คอมื 3 – ตอนนขีนี้ประกาศแบบนขีนี้ไมค่ไดช้แลช้ว Error กก็คอมื x ประกาศไปแลช้ว ประกาศซกนี้าไมค่ไดช้

กสำรประกสำศตลัวแปรซสซสำกลับ var ดค้วย let ใน Scope หรงอ Block เดคียวกลัน ไมม่สสำมสำรถทสสำไดค้


var x = 2 ; // Allowed
let x = 3 ; // Not allowed (ซกนี้าขช้างบน – ใน Scope เดขียวกลัน)
{
var x = 4 ; // Allowed
let x = 5 ; // Not allowed (ซกนี้าขช้างบน – ใน Scope เดขียวกลัน)
}

กสำรประกสำศตลัวแปรซสซสำกลับ let ดค้วย let ใน Scope หรงอ Block เดคียวกลัน ไมม่สสำมสำรถทสสำไดค้


let x = 2 ; // Allowed
let x = 3 ; // Not allowed (ซกนี้าขช้างบน – ใน Scope เดขียวกลัน)
{
let x = 4 ; // Allowed
let x = 5 ; // Not allowed (ซกนี้าขช้างบน – ใน Scope เดขียวกลัน)
}

กสำรประกสำศตลัวแปรซสซสำกลับ let ดค้วย var ใน Scope หรงอ Block เดคียวกลัน ไมม่สสำมสำรถทสสำไดค้


let x = 2 ; // Allowed
var x = 3 ; // Not allowed (ซกนี้าขช้างบน – ใน Scope เดขียวกลัน)
{
let x = 4 ; // Allowed
var x = 5 ; // Not allowed (ซกนี้าขช้างบน – ใน Scope เดขียวกลัน)
}

40 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


กสำรประกสำศตลัวแปรซสซสำกลับ let ดค้วย let นอก Scope หรงอ Block เดคียวกลัน สสำมสำรถทสสำไดค้
let x = 2 ; // Allowed
{
let x = 3 ; // Allowed
}
{
let x = 4 ; // Allowed
}

3.4. Hoisting

ตลัวแปรทคีงื่ประกสำศดค้วย var ถยกยกไปทคีงื่ดสำค้ นบน เรสำจนงสสำมสำรถใชค้ตรวแปรไดค้กม่อนททที่มรนจะถมูกประกสำศ


เชยู่น
<body>
<h2>JavaScript Hoisting</h2>
<p>With <b>var</b>, you can use a variable before it is declared:</p>
<p id="demo"></p>
<script>
carName = "Volvo" ; // ยลังไมค่ var
document.getElementById("demo").innerHTML = carName ;
var carName ;
</script>
</body>

ผล

ตลัวแปรทคีงื่ประกสำศดค้วย let ไมค่มขี Hoisting กสำรใชค้ตลัวแปร let กยู่อนทคีงื่มลันจะถยกประกสำศจะไดค้ผลลลัพธลเปป็น


ReferenceError ตลัวแปรอยยยู่ในพงซนทคีงื่ Dead Zone ชลังื่วครสำวตลัซงแตยู่เรพิงื่มบลก็อคจนกระทลังื่งถยกประกสำศ

จสำกตลัวอยยู่สำงขค้สำตค้น ถค้สำเปลคีงื่ยนเปป็น let carName ; จะไมยู่ปรสำกฎผลลลัพธล


JavaScript Hoisting
https://www.w3schools.com/js/js_hoisting.asp
Hoisting ใน Javascript เปป็นพฤตพิกรรมปกตพิในกสำรยค้สำยตลัวแปรไปดค้สำนบน – แนะนสสำใหค้ประกสำศตลัวแปรไวค้
ดค้สำนบนของ Scope เสมอ

บททขีริ่ 3 : var, let และ const (Chrome V8) 41


3.5. const
JavaScript Const
https://www.w3schools.com/js/js_const.asp

ตลัวทคีงื่ประกสำศดค้วย const มคีพฤตพิกรรมเหมงอน let เพคียงแตยู่ไมยู่สสำมสำรถใสยู่คยู่สำใหมยู่ลงไปไดค้ ประกสำศแลค้ว


กสสำหนดคยู่สำลงไปแลค้ว จะไมยู่สสำมสำรถกสสำหนดคยู่สำใหมยู่ลงไปไดค้
เชยู่น

const PI = 3.141592653589793 ;
PI = 3.14 ; // Error
PI = PI + 10 ; // Error เชค่นเดขียวกลัน

3.5.ก.) Block Scope


เหมงอนกลับ let เมงงื่อประกสำศใน Block scope

var x = 10 ;
// ตรงนขีนี้ x กก็คอมื 10
{
const x = 2 ;
// ตรงนขีนี้ x กก็คอมื 2
}
// ตรงนขีนี้ x กก็คอมื 10

3.5.ข.) Assigned when Declared


const ตค้องกสสำหนด value เมงงื่อประกสำศเสมอ

// ผรด
const PI ;
PI = 3.14159265359 ;
// ถบูก
const PI = 3.14159265359 ;

3.6. เปลคีที่ยนไดค้ หรรือไมม่ไดค้

3.6.ก.) Not Real Constants


const ชงงื่อของมลัน อสำจทสสำใหค้เขค้สำใจผพิดไดค้ เพรสำะมลันไมยู่ใชยู่กสำรกสสำหนดคยู่สำคงทคีงื่ แตยู่มลันเปป็นกสำรกสสำหนด กสำร
อค้สำงอพิงคงททที่ไปททที่คม่สำ
เพรสำะอยยู่สำงนคีซ เรสำจถึงไมยู่สสำมสำรถเปลคีงื่ยนคยู่สำคงทคีงื่ดลัซงเดพิมไดค้ (Constant primitive values) แตยู่เรสำสสำมสำรถ
เปลคีงื่ยนคถณสมบลัตพิของ วลัตถถคงทคีงื่ไดค้ (Constant objects)
42 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)
3.6.ข.) Primitive Values
ถค้สำเรสำกสสำหนดคยู่สำคงทคีดงื่ ลัซงเดพิมใหค้กลับ ตลัวแปรสลักตลัว เรสำจะไมยู่สสำมสำรถเปลคีงื่ยนคยู่สำคงทคีงื่ดลัซงเดพิมไดค้
ตลัวอยยู่สำง

const PI = 3.141592653589793 ;
PI = 3.14 ;
PI = PI + 10 ;
Logger.log(PI) // 3.141592653589793 – ยลังคงเปป็นคค่าแรก
// ถช้าเปป็น Javascript Error ไปแลช้ว

3.6.ค.) Constant Objects can Change


เรสำสสำมสำรถเปลคีงื่ยนคถณสมบลัตพิของวลัตถถคงทคีงื่ไดค้
ตรวอยม่สำง
// เราสามารถประกาศ Object แบบ const ไดช้
const car = {type:"Fiat", model:"500", color:"white"} ;
// เปลขียริ่ นคค่าของคคุณสมบลัตรไดช้
car.color = "red" ;
// เพรริ่มคคุณสมบลัตรไดช้
car.owner = "Johnson" ;
// ลบคคุณสมบลัตรไดช้
delete car.owner ;

อยยู่สำงไรกก็ดคี ไมม่สสำมสำรถกสสำหนดคม่สำใหมม่ ใหค้กรบตรวแปรททที่เปป็นวรตถถุคงททที่ไดค้

const car = {type:"Fiat", model:"500", color:"white"} ;


car = {type:"Volvo", model:"EX60", color:"red"} ;
Logger.log(car) // {type:Fiat, model:500, color:white} - car ยลังเปป็นบรรทลัดบน
// ถช้าเปป็น Javascript Error ไปแลช้ว

3.6.ง.) Constant Arrays can Change


เรสำสสำมสำรถเปลคีงื่ยนสมสำชพิกในอสำเรยลคงทคีงื่ไดค้
// เราสามารถประกาศ Array แบบ const ไดช้
const cars = ["Saab", "Volvo", "BMW"] ;
// เปลขียริ่ นคค่าของอรเลก็มเมช้นตต์ไดช้
cars[0] = "Toyota" ;
// เพรริ่มสมาชรกไดช้
cars[3] = "Nissan" ;
// เพรริ่มอรเลก็มเมช้นตต์ไดช้
cars.push("Audi") ;

บททขีริ่ 3 : var, let และ const (Chrome V8) 43


อยยู่สำงไรกก็ดคี ไมม่สสำมสำรถกสสำหนดคม่สำใหมม่ในอสำเรยพ์คงททที่ไดค้

const cars = ["Saab", "Volvo", "BMW"] ;


cars = ["Toyota", "Volvo", "Audi"] ;
Logger.log(cars) // ["Saab", "Volvo", "BMW"] - ยลังเปป็นบรรทลัดบน
// ถช้าเปป็น Javascript Error ไปแลช้ว

3.7. Redeclaring (const)

กสำรประกสำศตลัวแปรซสซสำกลับตลัวแปรทคีงื่ประกสำศดค้วย var หรงอ let ดค้วย const ภสำยใน Scope เดคียวกลัน ไมม่
สสำมสำรถทสสำไดค้

var x = 2 ; // Allowed
const x = 2 ; // Not allowed
{
let x = 2 ; // Allowed
const x = 2 ; // Not allowed
}

กสำรประกสำศตลัวแปรซสซสำกลับตลัวแปรทคีงื่ประกสำศดค้วย const ดค้วย const ภสำยใน Scope เดคียวกลัน ไมม่สสำมสำรถ


ทสสำไดค้

const x = 2 ; // Allowed
const x = 3 ; // Not allowed
x=3; // Not allowed
var x = 3 ; // Not allowed
let x = 3 ; // Not allowed

{
const x = 2 ; // Allowed
const x = 3 ; // Not allowed
x=3; // Not allowed
var x = 3 ; // Not allowed
let x = 3 ; // Not allowed
}

กสำรประกสำศตลัวแปรซสซสำกลับตลัวแปรทคีงื่ประกสำศดค้วย const ดค้วย const ภสำยนอก Scope สสำมสำรถทสสำไดค้

const x = 2 ; // Allowed
{
const x = 3 ; // Allowed
}
{
const x = 4 ; // Allowed
}

44 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


บททขีที่ 4
ฟฟังกร์ชลัที่น
4.1. ฟฟังกย์ชลัที่น (Functions)
ฟฝังกลชตัที่น (Functions) เปป็นบลก็อคของโคค้ด ทคีงื่ชวยู่ ยใหค้เรสำซอยโคค้ดเปป็นบลก็อคตยู่สำงๆ ทสสำใหค้โคค้ดอยู่สำนงยู่สำย และ
สสำมสำรถรคียยสโคค้ดไดค้ดวค้ ย เพรสำะฟฝังกลชลังื่นทคีงื่เขคียนไวค้แลค้ว เรสำสสำมสำรถเกก็บไวค้ใชค้ไดค้ตลอด เพคียงแตยู่ตค้องทรสำบวยู่สำ ตค้องสยู่ง
อะไรไปใหค้ฟฝังกลชลังื่น และฟฝังกลชลังื่นคงนอะไรกลลับมสำใหค้เรสำ

4.1.ก.) โครงสรค้างของฟฝังกลชตัที่น
Argrument (ตตัวแลกเปลทที่ยน) เปป็นวลัตถถดพิบทคีงื่เรสำตค้องสยู่งไปใหค้ฟฝังกลชลังื่นประมวลผล

function functionName(argrument1, argrument2, argrument3) {


// โคช้ด ทขีริ่จะทกางานเมมืริ่อฟฟังกต์ชลัริ่นถบูกเรขียกใชช้งาน
// argument1, argument2, argument3 คมือวลัตถคุดบร ทขีริ่จะนกามาประมวลผลในฟฟังกต์ชลัริ่น
}

ตรวอยม่สำง – กสำรสรค้สำงฟฝังกลชลังื่นอยยู่สำงงยู่สำย ทคีงื่ไมยู่มกคี สำรสยู่งผยู่สำน Argrument (ตตัวแลกเปลทที่ยน)


function firstFunction() {
Logger.log("Hello world!");
}

4.1.ข.) Globally declared และ Locally declared


กสำรประกสำศตรวแปร ในฟฝังกลชนตัที่ (Locally declared) และ นอกฟฝังกลชนตัที่ (Globally declared) ตยู่สำงกลัน
เชยู่น
ตลัวแปร price ประกสำศอยยใยู่ นฟฝังกลชลังื่น myPrice เปป็นตลัวแปรแบบ Locally declared สสำมสำรถใชค้งสำนไดค้
เฉพสำะในฟฝังกลชลังื่น myPrice() ไมยู่สสำมสำรถเรคียกใชค้จสำกนอกฟฝังกลชลังื่นไดค้
ตลัวแปร Const ประกสำศอยยยู่นอกฟฝังกลชลังื่น เปป็นตลัวแปรแบบ Globally declared ตลัวแปร Const สสำมสำรถถยก
เรคียกใชค้จสำกฟฝังกลชลังื่นใดกก็ไดค้
var Const = 100 ;
Logger.log(price); // Error เพราะตลัวแปร price อยบูค่ในฟฟังกต์ชลัริ่น แตค่เรขียกใชช้งานขช้างนอก
function myPrice() { // รลันฟฟังกต์ชลัริ่นนขีนี้
var price = 9.99;
Logger.log(price); // พรมพต์ : 9.99
Logger.log(Const); // พรมพต์ : 100
}
Logger.log(price); // Error เพราะตลัวแปร price อยบูค่ในฟฟังกต์ชลัริ่น แตค่เรขียกใชช้งานขช้างนอก

46 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


4.1.ค.) ตตัวอยยู่าง – ฟฝังกลชตัที่นททที่มทการสยู่งผยู่าน Agruments 2 ตตัว
ตลัวอยยู่สำงโคค้ดนคีซสยู่งผยู่สำน Agrument 2 ตลัว เมงงื่อฟฝังกลชลังื่นประมวลผลแลค้ว จะคงนคยู่สำกลลับมสำ ตสำมบรรทลัด
return
บรรทลัด Logger.log(addFunction(3,4)); ทคีงื่อยยยู่นอกฟฝังกลชลังื่น เปป็นกสำรเรคียกใชค้ฟฝังกลชลังื่น
function addFunction(firstNum, secondNum) {
return firstNum + secondNum ;
}
function call() {
Logger.log(addFunction(3,4)); // พรมพต์ : 7
}

4.1.ง.) ตตัวอยยู่าง - เรทยกใชค้ฟฝังกลชตัที่นอรนที่ จากอทกฟฝังกลชตัที่น


เรสำเรคียกใชค้ฟฝังกลชลังื่นองงื่น จสำกอคีกฟฝังกลชลังื่นไดค้ ซถึงื่งจะเหก็นแบบนคีซบยู่อยมสำกในกสำรเขคียนโคค้ด
function addFunction(firstNum, secondNum) {
return firstNum + secondNum ;
}
function runOtherFunction() { // รลันฟฟังกต์ชลัริ่นนขีนี้
var answer = addFunction(100,93) ;
// เรขียกใชช้ฟฟังกต์ชลัริ่น และ เกก็บการคมืนคค่าจากฟฟังกต์ชลัริ่นไวช้ในตลัวแปร
Logger.log(answer) ; // 193
}

4.1.จ.) ตตัวอยยู่าง – เกล็บฟฝังกลชตัที่นไวค้ในตตัวแปร


เรสำมสำรถเกก็บฟฝังกลชลังื่นไวค้ในตลัวแปรไดค้ เวลสำเรคียกใชค้งสำน จะเรคียกจสำกชงงื่อตลัวแปร
var mult = function(a,b) {
return a * b ;
}
Logger.log(mult); // พรมพต์ : (โคช้ดของฟฟังกต์ชลัริ่น) – ไมค่วค่าจะรลันฟฟังกต์ชลันไหนกก็ตาม
var power = function(a,b) {
return Math.pow(a,b) ;
}
function call() {
// เรขียกใชช้ฟฟังกต์ชลัริ่น mult
Logger.log(mult); // พรมพต์ : (โคช้ดของฟฟังกต์ชลัริ่น)
Logger.log(mult(5,10)) ; // พรมพต์ : 50
Logger.log(power(3,4)) ; // พรมพต์ : 81
}

บททขีริ่ 4 : ฟฟังกต์ชลัริ่น 47
4.1.ฉ.) ตตัวอยยู่าง – Agruments ททที่เปป็นฟฝังกลชตัที่น

Agrument ทคีงื่ใชค้สยู่งผยู่สำนกลันระหวยู่สำงฟฝังกลชลังื่น สสำมสำรถสยู่งผยู่สำนเปป็นฟฝังกลชลันไดค้ (ศถึกษสำเพพิงื่มเตพิมเรงงื่อง Callback


ของ Javascript)
function superFunc(functionArgument, a, b) {
return functionArgument(a,b) ;
}
function callFunc() {
Logger.log(superFunc(power,2,3)) ; // พรมพต์ : 8.0
Logger.log(superFunc(mult,2,3)) ; // พรมพต์ : 6.0
Logger.log(superFunc(addFunction,2,3)) ; // พรมพต์ : 5.0
}

4.1.ช.) สรค้างฟฝังกลชนตัที่ ไวค้ใชค้งานใน Google Sheet

เขคียนโคค้ด Google Apps Script ตยู่อไปนคีซเกก็บไวค้ ในโปรเจก็คแบบฝฝังในไฟลล Google Sheets จสำกนลัซนบลันทถึก


โคค้ด

function mulByX(x,y) {
return x*y ;
}

กสำรใชค้งสำนไมยู่ตค้องรลันโคค้ด แตยู่ใหค้เรคียกใชค้จสำก Google Sheets สสำมสำรถเรคียกใชค้ไดค้เหมงอนกสำรใชค้งสำน


ฟฝังกลชลังื่นทลังื่วไปของ Google Sheet อยยู่สำง SUM
ตลัวอยยู่สำงกสำรใชค้งสำน

=mulByX(5,8)

หลลังกด <Enter> เพงงื่อประมวลผล จะปรสำกฎขค้อควสำม Loading เพรสำะตค้องสยู่งโคค้ดไปประมวลผลทคีงื่


เซพิรฟล เวอรลของ Google

48 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


4.1.ซ.) ทสาใหค้เรทยกใชค้งานไดค้เหมรอนกตับฟฝังกลชตัที่น Built-in
(ลองแลค้วยรงไมม่ Work - แตม่เขทยนเกซ็บไวค้กม่อน)
รสำยละเอคียดเพพิงื่มเตพิม
https://developers.google.com/apps-script/guides/sheets/functions
https://yagisanatode.com/2018/08/24/google-apps-script-how-to-make-a-custom-function-to-use-in-google-sheets/

ใสยู่ Comment ในโคค้ดโดยระบถคยู่สำตลัวแปรตยู่สำงๆ ดลังตยู่อไปนคีซ


/*สามารถเขขียนคกาอธรบายไดช้ทขีริ่นขีริ่
* @param {number} oldVal Original Value
* @param {number} newVal New Value
* @return The percent change between new and old value.
* @customfunction*/
function percentChange(oldVal,newVal) {
return (newVal-oldVal)/oldVal;
}

4.1.ฌ.) โคค้ดแบบ Global declared


ถค้สำเรสำประกสำศตลัวแปรแบบ Globally declared และหรงอ มคีกสำรเขคียนโคค้ดไวค้แบบ Global declared จสำก
นลัซน เรสำเรคียกรลันฟฝังกลชลังื่นใดๆ คสสำถสำมกก็คอง โคค้ดแบบ Global declared ทสสำงสำนเลยหรงอไมยู่ ?
ตรวอยม่สำง
var a = 15 ;
var b = 20 ;
var c = a + b ;
var d ;
Logger.log(a) ; // ดบูผลทขีริ่ Logs ------------ > [ 01 ] - 15.0
Logger.log(b) ; // ดบูผลทขีริ่ Logs ------------ > [ 02 ] - 20.0
Logger.log(c) ; // ดบูผลทขีริ่ Logs ------------ > [ 03 ] - 35.0
Logger.log(d) ; // ดบูผลทขีริ่ Logs ------------ > [ 04 ] - null
function testGlobDeclared(){
d = 10 ;
Logger.log(d) ; // ดบูผลทขีริ่ Logs ------------ > [ 05 ] - 10.0
}

บททขีริ่ 4 : ฟฟังกต์ชลัริ่น 49
เมงงื่อรลันฟฝังกลชลังื่น testGlobDeclared() จะไดค้ผลดลังนคีซ
ผล - โคค้ดแบบ Global declared ทสสำงสำนเลย แมค้จะไมม่ไดค้อยมูม่ในฟฟังกพ์ชรที่นททที่ถมูกเรทยกใชค้งสำน และถถึงแมค้จะ
ยค้สำยโคค้ดแบบ Global declared ไปไวค้ในไฟลล .gs ไฟลลองงื่น ไมยู่ไดค้อยยยู่ในไฟลลเดคียวกลันกลับฟฝังกลชลังื่นทคีงื่ถยกเรคียกรลัน กก็จะใหค้
ผลแบบเดคียวกลัน
Logs
[ 01 ] 15.0
[ 02 ] 20.0
[ 03 ] 35.0
[ 04 ] null
[ 05 ] 10.0
4.1.ญ.) Global variable เกล็บคยู่าจากการรตันไวค้หรรอไมยู่ ?
ตยู่อจสำกขค้อกยู่อนหนค้สำ เมงงื่อรลันฟฝังกลชลังื่น testGlobDeclared() ไปแลค้ว d เกก็บคยู่สำ 10 ไวค้ มสำดยตยู่อวยู่สำ ถค้สำรลัน
ฟฝังกลชลังื่นอคีกตลัว กก็คอง afterTestGlobDeclared() ทคีงื่อสำค้ งอพิงตลัวแปร d จะไดค้ผลเปป็นอยยู่สำงไร d จะเกก็บคยู่สำ 10 ไวค้อยยยู่
หรงอเปลยู่สำ
var a = 15 ;
var b = 20 ;
var c = a + b ;
var d ;
Logger.log(a) ; // ดบูผลทขีริ่ Logs ------------ > [ 01 ] - 15.0
Logger.log(b) ; // ดบูผลทขีริ่ Logs ------------ > [ 02 ] - 20.0
Logger.log(c) ; // ดบูผลทขีริ่ Logs ------------ > [ 03 ] - 35.0
Logger.log(d) ; // ดบูผลทขีริ่ Logs ------------ > [ 04 ] - null
function testGlobDeclared(){
d = 10 ;
Logger.log(d) ;
}
function afterTestGlobDeclared(){
Logger.log(d) ; // ดบูผลทขีริ่ Logs ------------ > [ 05 ] - null
}

ผล – เมงงื่อรลัน afterTestGlobDeclared() จะไดค้ผลดลังนคีซ


[ 01 ] 15.0
[ 02 ] 20.0
[ 03 ] 35.0
[ 04 ] null
[ 05 ] null // d ไมค่ไดช้เกก็บคค่าทขีริ่รลันจากฟฟังกต์ชลันอมืริ่นๆไวช้

หมสำยเหตถุ : ถค้สำตค้องกสำรเกก็บคยู่สำใดๆ ไวค้ยสำวๆ ใหค้เกก็บไวค้ในโปรเจก็ค โดยใชค้ Script Properties ซถึงื่งสสำมสำรถ


กรอกเองกก็ไดค้ (เมนบู File → Project Properties → (แทก็บ) Script properties ) หรงอ เขคียนโปรแกรมเพงงื่อเกก็บ
กก็ไดค้ โดยใชค้เซอรลวพิส PropertiesService ( IDE ใหมค่ของ Apps Script ตช้องเขขียนใชช้เซอรต์วรส PropertiesService
เทค่านลันี้น )

50 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


4.2. Arrow function - Chrome V8
Arrow Function
https://www.w3schools.com/js/js_arrow_function.asp
Google Apps Script JavaScript 2020 Update - V8 Engine
https://www.youtube.com/watch?v=1S_v-SUfjJg
Apps Script ทคีงื่ใชค้เครงงื่องยนตล Chrome V8 สสำมสำรถเขคียนฟฝังกลชลังื่นในรยปแบบ Arrow function ไดค้ เหมงอน
กลับ Javascript ES6
โครงสรค้สำง

// แบบเดรม
function(arguments) {
// Code
}
// Chrome V8 หรมือ Javascript ES6
(arguments) => {
// Code
}

ตรวอยม่สำงททที่ 1

// แบบเดรม
var fn = function(){
// var fn = function func(){ // แบบนขีนี้กก็ไดช้
return "Val" ;
}
Logger.log(fn()) ; // Val
// Chrome V8 หรมือ Javascript ES6
const fn = () => "Val" // มขีคกาสลัริ่งเดขียวทขีริ่เปป็นของฟฟังกต์ชลัริ่น ไมค่ตช้องครอบดช้วย { } กก็ไดช้
// และจะ return ตลัวนลันี้นเลย จจึงไมค่ตช้องใชช้คกาสลัริ่ง return อขีก
Logger.log(fn()) // Val

บททขีริ่ 4 : ฟฟังกต์ชลัริ่น 51
ตรวอยม่สำง
// แบบเดรม
let arr = [ "A" , "B" , "C" ]
let newArr = arr.map(function(r){ return r + "-0" } )
Logger.log(newArr) // [ 'A-0', 'B-0', 'C-0' ]
// Chrome V8
let arr2 = [ "A" , "B" , "C" ]
let newArr2 = arr.map( (r) => { return r+"-0" } ) // ใชช้ Arror function
Logger.log(newArr2) // [ 'A-0', 'B-0', 'C-0' ] - ใหช้ผลลลัพธต์แบบเดขียวกลัน
// Chrome V8 - ลดรบูป
let arr3 = [ "A" , "B" , "C" ]
let newArr3 = arr.map( r => r+"-0" ) // ใชช้ Arror function ลดรบูป
// Argrument มขีตลัวเดขียว ไมค่ตช้องมขีวงเลก็บกก็ไดช้
// return ไมค่ตช้องมขี หากคมืน 1 คกาสลัริ่ง
Logger.log(newArr3) // [ 'A-0', 'B-0', 'C-0' ] - ใหช้ผลลลัพธต์แบบเดขียวกลัน

4.3. ฟฟังกย์ชลัที่น Generator


ฟฝังกลชลังื่น Generator เปป็นกค้อนขค้อมยลแบบมคีลสสำดลับ เวลสำเรคียกใชค้งสำน กสำรจะเขค้สำไปจลับขค้อมยลแตยู่ละตลัว ตค้องใชค้
เมธอด next จลับทคีตลัวเปป็นลสสำดลับ
เซอรลวพิส Drive มคีคลค้สำยๆแบบนคีซเยอะ แตยู่เปป็น Built-in เชยู่น จรบไฟลพ์ในโฟลเดอรพ์มสำ โดยจะไดค้มสำเปป็น
FileIterator หรงอกค้อนของไฟลล ตค้องใชค้ while และ next วนลยปเขค้สำไปจลับมสำทคีละตลัว

// การเรขียกใชช้ฟฟังกต์ชลัริ่น Generator
function* gen(){ // หลลัง function มขี *
yield 1 ; // ใชช้คกาวค่า yield เทค่านลันี้น
yield 2 ;
yield 3 ;
}

// การเรขียกใชช้ฟฟังกต์ชลัริ่น Generator
function test(){
let n = gen() ; console.log(n) ; // -------------- > ดบูผลทขีริ่ Logs [01]
let a1 = n.next() ; console.log(a1) ; // -------------- > ดบูผลทขีริ่ Logs [02]
let a2 = n.next() ; console.log(a2) ; // -------------- > ดบูผลทขีริ่ Logs [03]
let a3 = n.next() ; console.log(a3) ; // -------------- > ดบูผลทขีริ่ Logs [04]
let a4 = n.next() ; console.log(a4) ; // -------------- > ดบูผลทขีริ่ Logs [05]
}

52 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ผล

Logs
[ 01 ] {}
[ 02 ] { value: 1, done: false }
[ 03 ] { value: 2, done: false }
[ 04 ] { value: 3, done: false }
[ 05 ] { value: undefined, done: true }

4.4. Default parameters – Chrome V8


ฟฝังกลชลังื่นทคีงื่ตค้องกสำรพสำรสำมพิเตอรล เรสำสสำมสำรถกสสำหนดคยู่สำเรพิงื่มตค้น ใหค้กลับพสำรสำมพิเตอรลไดค้ เชยู่น function
mult(x=1 , y=1)
ตลัวอยยู่สำง

function callFunc() {
let total_default = mult() ; // เรขียกใชช้ฟฟังกต์ชลัริ่น โดยไมค่สค่งพารามรเตอรต์ไปใหช้
console.log(total_default) ; // 1 – ใชช้คค่า Default
let total = mult(4,3) ;
console.log(total) ; // 12 – ใชช้คค่า 4x3
}
function mult(x=1 , y=1) {
return x*y
}

4.5. วลัตถถุ Arguments


The arguments object
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments
JavaScript Function Parameters
https://www.w3schools.com/js/js_function_parameters.asp
วลัตถถ arguments เปป็น Built-in object ทคีงื่เกก็บอสำรลกพิวเมค้นตลทคีงื่สยู่งใหค้กลับฟฝังกลชลังื่น ซถึงื่งสสำมสำรถเขค้สำถถึงไดค้เหมงอน
เปป็นอสำเรยลตลัวหนถึงื่ง
ตลัวอยยู่สำง
function func1(a, b, c) {
Logger.log(arguments[0]) ; // 1
Logger.log(arguments[1]) ; // 2
Logger.log(arguments[2]) ; // 3
}
func1(1, 2, 3) ; // ดคุผลทขีริ่ Logs ------------------- > [01], [02], [03]

บททขีริ่ 4 : ฟฟังกต์ชลัริ่น 53
ผล

Logs
[ 01 ] 1
[ 02 ] 2
[ 03 ] 3

ตรวอยม่สำง - หสำผมรวมในกค้อนอสำเรยล
x = sumAll(1, 123, 500, 115, 44, 88) ;
Logger.log(x) ; // 871
function sumAll() {
var i ;
var sum = 0 ;
for (i = 0 ; i < arguments.length ; i++) {
sum += arguments[i] ;
}
return sum ;
}

ตรวอยม่สำง – หสำคยู่สำมสำกสถดในกค้อนอสำเรยล
x = findMax(1, 123, 500, 115, 44, 88) ; // 500
function findMax() {
var i ;
var max = -Infinity ; // คค่าทขีนริ่ ช้อยทขีริ่สดคุ
for (i = 0 ; i < arguments.length ; i++) {
if (arguments[i] > max) {
max = arguments[i] ;
}
}
return max ;
}

หมสำยเหตถุ :
กสำรหสำคยู่สำสยงสถดตสงื่สำสถด มคีวธพิ คีทคีงื่งยู่สำยกวยู่สำนคีซ เขคียนโคค้ดเพคียง 1 บรรทลัด
( ดผเพลิที่มเตลิมในขต้อ 11.4 Spread operator (3 จปด) - Chrome V8 หนต้า 128 )

54 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


บททขีที่ 5
คคาเฉพาะ
5.1. undefined
JavaScript Global Reference
https://www.w3schools.com/jsref/jsref_obj_global.asp
JavaScript undefined Property
https://www.w3schools.com/jsref/jsref_undefined.asp
undefined กก็คงอไมยู่มคี หรงอไมยู่ไดค้จสสำกลัดควสำมหมสำย เชยู่น ตลัวแปรทคีงื่ยลังไมยู่ไดค้ระบถคยู่สำ

var x ;
Logger.log(x) ; // พรมพต์ : undefined
if (typeof x === "undefined") {
txt = "x is undefined" ; // ทกาบรรทลัดนขีนี้
} else {
txt = "x is defined" ;
}

5.2. null
null คลค้สำยกลับ undefined ไมยู่มคีขค้อมยลเหมงอนกลัน แตยู่ตยู่สำงกลันทคีงื่ชนพิด

ตลัวอยยู่สำง

typeof undefined // undefined


typeof null // object

null === undefined // false ( เครมืริ่องหมาย = 3 ตลัว หมายถจึงเปรขียบเทขียบชนรดขช้อมบูลดช้วย)


null == undefined // true

ตลัวอยยู่สำง

var person = {
firstName : "John" ,
lastName : "Doe" ,
age : 50 ,
eyeColor : "blue"
};
person = undefined ; // Now both value and type is undefined
var person = {
firstName : "John" ,
lastName : "Doe" ,
age : 50 ,
eyeColor : "blue"
};
person = null ; // Now value is null, but type is still an object

56 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


5.3. this
The JavaScript this Keyword
https://www.w3schools.com/js/js_this.asp
this เปป็นคคียลเวพิรลดทคีงื่หมสำยถถึง วลัตถถตวลั เอง this มคีหลสำกหลสำยคยู่สำขถึซนอยยยู่กลับวยู่สำ ถยกเรคียกใชค้ทคีงื่ไหน
ตรวอยม่สำง this โดดๆ กก็คงอโปรเจก็ค Google Apps Script
function myFunction() {
var x = this ;
Logger.log(x) ;
}

ตรวอยม่สำง this ในฟฝังกลชลังื่น กก็คงอโปรเจก็ค Google Apps Script เหมงอนกลับขค้สำงบน

function call() {
Logger.log(inFunc()) ;
}
function inFunc() {
return this ;
}

ตรวอยม่สำง this อยยใยู่ น Method ของวลัตถถ


function myFunction() {
var person = {
firstName: "John" ,
lastName : "Doe" ,
id : 5566 ,
fullName : function() {
return this.firstName + " " + this.lastName ;
} // Close - function
} ; // Close - person
Logger.log(person.firstName) ; // พรมพต์ : John
Logger.log(person.lastName) ; // พรมพต์ : Doe
Logger.log(person.id) ; // พรมพต์ : 5566.0
Logger.log(person.fullName()) ; // พรมพต์ : John Doe
}

5.4. infinity
JavaScript Infinity Property
https://www.w3schools.com/jsref/jsref_infinity.asp
Infinity หมสำยถถึงเลขบวกทคีงื่ไมยู่สพิซนสถด แตยู่จรพิงๆในทสำงคอมพพิวเตอรลแลค้ว จสสำกลัดทคีงื่
1.797693134862315E+308
- Infinity หมสำยถถึงคยู่สำเลขลบทคีงื่ไมยู่สพิซนสถด แตยู่จรพิงๆจสสำกลัดทคีงื่ -1.797693134862316E+308

บททขีริ่ 5 : คกาเฉพาะ 57
5.5. continue
JavaScript continue Statement
https://www.w3schools.com/jsref/jsref_continue.asp
JavaScript Break and Continue
https://www.w3schools.com/js/js_break.asp

continue ใชค้กลับลยป โดยหยถด 1 ลยป ถค้สำตรงตสำมเงงงื่อนไข จสำกนลัซนตยู่อเนงงื่องไปยลังลยปถลัดไป


ควสำมแตกตยู่สำงระหวยู่สำง continue และ break กก็คงอ แทนทคีงื่จะโดดออกจสำกลยปไปเลย แตยู่ continue โดด
ขค้สำมไป 1 ลยป จสำกนลัซนกก็ยลังวนลยปตยู่อไป
อยยู่สำงไรกก็ดคี เมงงื่อ continue ทสสำงสำน กก็จะมคีพฤตพิกรรมแตกตยู่สำงกลันสสสำหรลับลยปแตยู่ละชนพิด
ใน while เงงงื่อนไขถยกทดสอบ และถค้สำจรพิง ลยปถยกทสสำตยู่อ
ใน for กค้อน i++ ถยกประเมพินกยู่อน จสำกนลัซนเงงงื่อนไขจะถยกทดสอบ และหสำทสำงออกวยู่สำ ลยปองงื่นๆจะถยกทสสำตยู่อ
continue สสำมสำรถใชค้กลับ label ไดค้ดค้วย

รยปแบบกสำรใชค้งสำน
continue ;

หรงอใชค้กลับ Label
continue labelname ;

ตรวอยม่สำงททที่ 1
var text = ""; var i = 0 ;
while (i < 5) {
i++ ;
if (i === 3) {
continue ; // ขช้าม 3 ไป
} // if
text += "\nThe number is " + i ;
} // while
Logger.log(text) ; // ดบูผลทขีริ่ Logs ------------------------- >

ผล
Logs
[ 01 ] The number is 1
The number is 2
The number is 4
The number is 5

58 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำงททที่ 2
var text = ""; var i = 0 ;
for (i = 1 ; i < 8 ; i++) {
if (i === 2 || i === 3) continue ; // ขช้าม 2 และ 3 ไป
text += "\n" + i
}
Logger.log(text) ; // ดบูผลทขีริ่ Logs ------------------------- >

ผล
Logs
[ 01 ] 1
4
5
6
7

ตรวอยม่สำงททที่ 3
var cars = [ "BMW" , "Volvo" , "Saab" , "Ford" ] ;
var text = "" ;
var i ;
for (i = 0 ; i < cars.length ; i++) {
if (cars[i] === "Saab") { // ขช้าม Saab ไป
continue ;
}
text += cars[i] + "\n" ;
}

ผล
Logs
[ 01 ] BMW
Volvo
Ford

บททขีริ่ 5 : คกาเฉพาะ 59
ตรวอยม่สำงททที่ 4 – ใชค้ continue กลับ label
var i, j ;
var text = "" ;
Loop1: // The first for loop is labeled "Loop1"
for (i = 0 ; i < 3 ; i++) {
text += "\n" + "i = " + i + ", j = " ;
Loop2: // The second for loop is labeled "Loop2"
for (j = 10 ; j < 15 ; j++) {
if (j === 12) { // ขช้าม 12 ไป
continue Loop2 ;
}
text += j + " " ;
}
}
Logger.log(text) ;

ผล
Logs
i = 0, j = 10 11 13 14
i = 1, j = 10 11 13 14
i = 2, j = 10 11 13 14

5.6. break
JavaScript break Statement
https://www.w3schools.com/jsref/jsref_break.asp
break ใชค้โดดออกจสำก switch หรงอลยป (for, for ... in, while, do ... while)
เมงงื่อ break ถยกใชค้ใน switch จะหยถด switch ทลัซงบลก็อค
เมงงื่อ break ถยกใชค้ในลยป จะหยถดลยปและทสสำโคค้ดจสำกลยปตยู่อ(ถค้สำมคี)
break สสำมสำรถใชค้กลับ label ไดค้ดค้วย เพงงื่อโดดไปยลัง label ถค้สำไมยู่มคี label จะใชค้งสำน breake ไดค้เฉพสำะใน
switch หรงอ ลยปเทยู่สำนลัซน

รยปแบบกสำรใชค้งสำน
break ;

หรงอใชค้กลับ Label
break labelname ;

60 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำงททที่ 1 – วน 5 ครลัซงแตยู่หยถดทคีงื่ 3 แลค้วโดดออกจสำกลยปเพรสำะ Break
var text = "" ;
var i = 0 ;
while (i < 5) {
text += "\nThe number is " + i ;
i++ ;
if (i === 3) {
break ;
}
}
Logger.log(text) ; // ดบูผลทขีริ่ Logs ------------------------- >

ผล
Logs
The number is 0
The number is 1
The number is 2

ตรวอยม่สำงททที่ 2
var day ;
switch (new Date().getDay()) { // ไดช้ตลัวเลขออกมาเปป็น 0-6
case 0:
day = "Sunday" ;
break ;
case 1:
day = "Monday" ;
break ;
case 2:
day = "Tuesday" ;
break ;
case 3:
day = "Wednesday" ;
break ;
case 4:
day = "Thursday" ;
break ;
case 5:
day = "Friday" ;
break ;
case 6:
day = "Saturday" ;
break ;
}
Logger.log("Today is " + day) ; // ผลเชค่น Today is Thursday

บททขีริ่ 5 : คกาเฉพาะ 61
ตลัวอยยู่สำงทคีงื่ 3 – ใชค้งสำน break นอก switch หรงอลยป
var cars = [ "BMW" , "Volvo" , "Saab" , "Ford" ] ;
var text = "" ;
list: {
text += cars[0] + "\n" ;
text += cars[1] + "\n" ;
text += cars[2] + "\n" ;
break list ;
text += cars[3] + "\n" ;
}

ผล
Logs
BMW
Volvo
Ford

ตลัวอยยู่สำงทคีงื่ 4
var text = "" ;
var i, j ;
Loop1: // The first for loop is labeled "Loop1"
for (i = 0 ; i < 3 ; i++) {
text += "\n" + "i = " + i + ", j = " ;
Loop2: // The second for loop is labeled "Loop2"
for (j = 10 ; j < 15 ; j++) {
if (j === 12) {
break Loop1 ;
}
text += j + " " ;
}
}
Logger.log(text) ;

ผล

i = 0, j = 0 1

62 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


บททขีที่ 6
ตลัวแปรวลัตถถ
6.1. ตลัวแปร Object (วลัตถถุ)
JavaScript Objects
https://www.w3schools.com/js/js_object_definition.asp
JavaScript Object Accessors
https://www.w3schools.com/js/js_object_accessors.asp

ตตัวแปร Object ประกอบไปดค้วย keys(หรงอ Properties) และ values โดยทลัซง keys และ values เรสำ
เรคียกรวมกลันวยู่สำ items (ดยตลัวอยยู่สำงไดค้จสำกโคค้ดดค้สำนลยู่สำง)
Object สสำมสำรถมคีเมถอดไดค้ดค้วย (Chrome V8) โดยเมถอดของ Object กก็คงอ คถณสมบลัตพิทคีงื่บรรจถดวค้ ย
ฟฝังกลชลังื่น เวลสำเรคียกใชค้งสำนจถึงเรคียกใชค้แบบเมถอด(มคีวงเลก็บตยู่อทค้สำย) เชยู่น Object.Method()
ตลัวอยยู่สำงกสำรสรค้สำงตลัวแปรวลัตถถ และกสำรจลัดกสำรเบงซองตค้น

function objectFunction1() {
// ใชช้วงเลก็บปปีกกา ครอบคค่าของตลัวแปร Object
var newObj = {} ; // สรค้างตตัวแปร Object วยู่างๆ
// Object ประกอบไปดช้วย key : value หลายตลัว
// ลกาดลับของ key : value ไมค่สกาคลัญ
var employee = {
name : 'Joe Bloggs' , // key กก็คมือ name , value กก็คมือ 'Joe Bloggs'
age : 25 , // key กก็คมือ age , value กก็คมือ 25
title : 'Data Analyst' // key กก็คมือ title , value กก็คอมื 'Data Analyst'
name_title : function() { // เมถอด กก็คมือ name_title
return this.name + " " + this.title ;
} // Close - name_title
} // Close - employee
Logger.log(employee) ; // พรมพต์ : {name=Joe Bloggs, title=Data Analyst, age=25.0}
Logger.log(typeof employee) ; // พรมพต์ : object
Logger.log(employee.name) ; // เขช้าถจึงขช้อมบูลใน Object วรธขีทขีริ่ 1 – ผล Joe Bloggs
Logger.log(employee['name']) ; // เขช้าถจึงขช้อมบูลใน Object วรธขีทขีริ่ 2 – ผล Joe Bloggs
Logger.log(employee.name_title()) ; // เรขียกเมถอดใน name_title()
// พพิมพล : Joe Bloggs Data Analyst
delete employee.age // ลบคขียต์ age ในตลัวแปรวลัตถคุ employee
employee.age = 25 // เพรริ่มคขียต์ age ลงในตลัวแปรวลัตถคุ employee
}

64 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


6.2. เพพที่ม, ลบ, แทรก สมสำชพกใหค้ Object
JavaScript Object Properties
https://www.w3schools.com/js/js_object_properties.asp
กสำรเพพิงื่ม ลบ แทรก item ลงในตลัวแปร Object สสำมสำรถทสสำไดค้ดลังนคีซ

function objectFunction2() {
var employee = {
name: 'Joe Bloggs',
age: 25,
title: 'Data Analyst'
}

// 1. เพพิที่ม item ======================================================


employee['department'] = 'Web Analytics' ;
// หรรอใชค้แบบนทนี้กล็ไดค้
employee.department = 'Web Analytics' ;
Logger.log(employee);
// พรมพต์ : {name=Joe Bloggs, title=Data Analyst, department=Web Analytics, age=25.0}

// 2. ลบ item ======================================================
delete employee.age ;
Logger.log(employee) ;
// พรมพต์ : {name=Joe Bloggs, title=Data Analyst, department=Web Analytics}
}

บททขีริ่ 6 : ตลัวแปรวลัตถคุ 65
6.3. get, set และ Object method - Chrome V8

6.3.ก.) get และ function ใน Object


JavaScript Object Accessors
https://www.w3schools.com/js/js_object_accessors.asp
2 โคค้ดตยู่อไปนคีซใหค้ผลเหมงอนกลัน ตลัวหนถึงื่งใชค้ function สรค้สำงเมถอดใหค้กลับ Object อคีกตลัวหนถึงื่งใชค้ get สรค้สำงเม
ถอดใหค้กลับ Object
get เปป็นของใหมยู่ ชยู่วยใหค้โคค้ดซลับซค้อนนค้อยลง ใชค้กสสำ หนด Object Accessors หรงอ คถณสมบลัตพิของวลัตถถทคีงื่
สสำมสำรถเขคียนโคค้ดสรค้สำงไดค้
โคค้ดททที่ 1 – เปป็นแบบดลัซงเดพิม ฟฝังกลชลังื่นทคีงื่สรค้สำงใหค้กลับตลัวแปรวลัตถถ จะกลสำยเปป็นเมถอดของตลัวแปรนลัซน
function objectFunction() {
// สรช้างวลัตถคุ
var person = {
firstName : "John" ,
lastName : "Doe" ,
fullName : function() {
return this.firstName + " " + this.lastName ;
}
}
Logger.log( person.fullName() ) ; // John Doe
}

โคค้ดททที่ 2 – ใชค้ Get ฟฝังกลชลังื่นทคีงื่สรค้สำงใหค้กลับตลัวแปรวลัตถถ จะกลสำยเปป็นคถณสมบลัตพิของตลัวแปรนลัซน สลังเกตถกสำร


เรคียกใชค้
function objectGet() {
// สรช้างวลัตถคุ
var person = {
firstName : "John" ,
lastName : "Doe" ,
get fullName() {
return this.firstName + " " + this.lastName ;
}
}
// วรธขีการเรขียกใชช้ตค่างจากขช้างบน ไมค่มขี () ***
Logger.log(person.fullName) ; // John Doe
}

66 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


6.3.ข.) set
set ใชค้งสำนคลค้สำยกลับ get โดย set ใชค้รลับพสำรสำมพิเตอรล ซถึงื่งจสำกนลัซนจะนสสำไปใชค้อะไรตยู่อกก็วสำยู่ กลันไป

ตรวอยม่สำง - กสสำหนดคยู่สำใหค้ lang จสำกนลัซน set lang ปรลับแตยู่งแลค้วเอสำไปกสสำหนดใหค้ language อคีกทคี


function objectSet() {
var person = {
firstName : "John" ,
lastName : "Doe" ,
language : "" ,
set lang(lang) { this.language = lang.toUpperCase() ; }
};
Logger.log(person.language) ; // (วค่าง) - ใชช้แบบยลังไมค่กกาหนดคค่าใดๆ
Logger.log(person.lang) ; // undefined - ใชช้แบบยลังไมค่กกาหนดคค่าใดๆ
person.lang = "en" ; // กกาหนดคค่าใหช้ lang
Logger.log(person.language) ; // John Doe
}

6.3.ค.) Object.defineProperty()
JavaScript Object Accessors - Object.defineProperty()
https://www.w3schools.com/js/js_object_accessors.asp
เมถอด Object.defineProperty() สสำมสำรถใชค้เพพิงื่ม get และ set ใหค้กลับตลัวแปรวลัตถถไดค้เชยู่นเดคียวกลัน
ตลัวอยยู่สำง
https://www.w3schools.com/js/tryit.asp?filename=tryjs_object_accessors_set4
// Define object
var obj = {counter : 0} ;
// Define setters
Object.defineProperty(obj, "reset", {
get : function() { this.counter = 0 ; }
});
Object.defineProperty(obj, "increment", {
get : function() { this.counter++ ; }
});
Object.defineProperty(obj, "decrement", {
get : function() { this.counter-- ; }
});
Object.defineProperty(obj, "add", {
set : function(value) { this.counter += value ; }
});
Object.defineProperty(obj, "subtract", {
set : function(value) { this.counter -= value ; }
}) ;

บททขีริ่ 6 : ตลัวแปรวลัตถคุ 67
// ตลัวอยค่างการใชช้งาน
obj.reset ;
obj.add = 5 ;
obj.subtract = 1 ;
obj.increment ;
obj.decrement ;
Logger.log(obj.counter) ; // ผล : 4

6.4. Object Constructors - Chrome V8


JavaScript Object Constructors
https://www.w3schools.com/js/js_object_constructors.asp

6.4.ก.) Object Types (Blueprints) (Classes)


Object Constructors ใชค้สรค้สำง Blueprint(ตค้นแบบ) เพงงื่อสรค้สำงวลัตถถหลสำยๆตลัวทคีงื่มคีชนพิดเดคียวกลัน เชยู่น วลัตถถ
พนลักงสำน ทคีงื่มคี คถณสมบลัตพิและเมถอดขค้สำงในเหมงอนกลัน
ขค้สำงตค้นสสำมสำรถทสสำไดค้โดยใชค้ ฟฝังกลชตัที่น Object constructor
ตลัวอยยู่สำง - ฟฝังกลชลังื่น Person (ขจึนี้นตช้นดช้วยอลักษรตลัวใหญค่) เปป็น ฟฟังกพ์ชรที่น Object constructor
https://www.w3schools.com/js/tryit.asp?filename=tryjs_object_constructor

function Person(first, last, age, eye) {


this.firstName = first ;
this.lastName = last ;
this.age = age ;
this.eyeColor = eye ;
}

เรสำสสำมสำรถสรค้สำงวลัตถถตวลั ใหมยู่ชนพิดเดคียวกลับ Person ไดค้โดยใชค้คคียลเวพิรดล new เชยู่น

var myFather = new Person("John", "Doe", 50, "blue") ;


Logger.log("May father is " + myFather.age) ; // ผล : 50

หมสำยเหตถุ :
Apps Script มคี Built-in objects(วลัตถถทคีงื่สรค้สำงไวค้แลค้วพรค้อมใหค้ใชค้งสำน) ดลังตยู่อไปนคีซ

var x1 = new Object() ; // A new Object object


var x2 = new String() ; // A new String object
var x3 = new Number() ; // A new Number object
var x4 = new Boolean() ; // A new Boolean object
var x5 = new Array() ; // A new Array object
var x6 = new RegExp() ; // A new RegExp object
var x7 = new Function() ; // A new Function object
var x8 = new Date() ; // A new Date object

68 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


หมสำยเหตถุ :
ดยเพพิงื่มเตพิมเรงงื่องวลัตถถ this ในขค้อ 5.3 หนค้สำ 57
this เปป็นวลัตถถหมสำยถถึงวลัตถถตลัวเอง หรงอ วลัตถถทคีงื่เปป็นเจค้สำของโคค้ด

ใน Constructor function วลัตถถ this ไมยู่มคีคยู่สำใดๆ มลันเปป็นสพิงื่งทดแทนสสสำหรลับวลัตถถใหมยู่ คยู่สำของวลัตถถ this จะ


กลสำยเปป็นวลัตถถใหมยู่ เมงงื่อวลัตถถใหมยู่ถยกสรค้สำง

6.5. Object Prototypes - Chrome V8


JavaScript Object Prototypes
https://www.w3schools.com/js/js_object_prototypes.asp
The JavaScript this Keyword
https://www.w3schools.com/js/js_this.asp
Prototype(ตค้นแบบ) ใชค้เพพิงื่ม Properties และ Methods ใหค้กลับ Object constructor

// ฟฟังกต์ชลัริ่น Object constructor


function employee(name, jobtitle, born) {
this.name = name ;
this.jobtitle = jobtitle ;
this.born = born ;
}
function myFunction() {
employee.prototype.salary = 2000 ;
employee.country = 'Thailand' ; // ไมค่มขีผล - ไมค่ใชค่ตลัวแปรวลัตถคุธรรมดา
var fred = new employee("Fred Flintstone", "Caveman", 1970) ;
Logger.log(fred) ; // ดบูผลทขีริ่ Logs –----------------------------- > [ 01 ]
var wasan = new employee("Wasan Kds", "Instructor", 1977) ;
Logger.log(wasan) ; // ดบูผลทขีริ่ Logs –----------------------------- > [ 02 ]
}

ผล
Logs
[ 01 ] { jobtitle=Caveman, born=1970.0, name=Fred Flintstone, salary=2000.0 }
[ 02 ] { jobtitle=Instructor, born=1977.0, name=Wasan Kds, salary=2000.0 }

บททขีริ่ 6 : ตลัวแปรวลัตถคุ 69
6.6. Classes - Chrome V8

6.6.ก.) Classes
JavaScript Classes
https://www.w3schools.com/js/js_classes.asp
Classes หรงอ คลาส กก็คอง เปป็นกสำรสรค้สำงโครงสรค้สำงของวลัตถถทคีงื่มคีคถณสมบลัตพิและเมธอด

หมสำยเหตถุ
Javascript class ไมยู่ใชยู่วลัตถถ แตยู่เปป็นแมยู่แบบของวลัตถถ

รยปแบบกสำรใชค้งสำน – สรค้สำงคลสำสชงงื่อ ClassName และเพพิงื่มเมถอดชงงื่อ constructor()

class ClassName{
constructor() { ... }
}

ตรวอยม่สำง – โคค้ดตยู่อไปนคีซสรค้สำงคลสำสรถยนตล ทคีงื่มคี 2 คถณสมบลัตพิ กก็คงอ name และ year


https://www.w3schools.com/js/tryit.asp?filename=tryjs_class_init
class Car{
constructor(name, year) {
this.name = name;
this.year = year;
}
}
// การใชช้งาน
let myCar1 = new Car("Ford", 2014) ;
let myCar2 = new Car("Audi", 2019) ;

6.6.ข.) The Constructor Method


เมถอด constructor เปป็นวพิธพคี พิเศษ
- จะตค้องมคีชงงื่อทคีงื่แนยู่นอน กก็คงอ "constructor"
- จะดสสำเนพินกสำรโดยอลัตโนมลัตพิเมงงื่อสรค้สำงวลัตถถใหมยู่
- ใชค้เพงงื่อเรพิงื่มตค้นคถณสมบลัตพิของวลัตถถ-

หสำกเรสำไมยู่ไดค้กสสำหนดเมถอด constructor JavaScript จะเพพิงื่ม constructor วยู่สำงๆมสำใหค้

70 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


6.6.ค.) Class Methods

คลสำสเมถอด ถยกสรค้สำงขถึซนโดยใชค้ไวยสำกรณลเดคียวกลับ อซ็อบเจซ็กตพ์เมธอด


ใชค้คคียลเวพิรลด class เพงงื่อสรค้สำงคลสำส เพพิงื่มเมถอด constructor() เสมอ จสำกนลัซนเพพิงื่มเมถอดเทยู่สำใดกก็ไดค้
รยปแบบกสำรใชค้งสำน
class ClassName{
constructor() { ... }
method_1() { ... }
method_2() { ... }
method_3() { ... }
}
}

ตรวอยม่สำง – สรค้สำงเมถอดชงงื่อ age() ใหค้กลับคลสำส Car()


https://www.w3schools.com/js/tryit.asp?filename=tryjs_class_method

class Car{
constructor(name, year) {
this.name = name ;
this.year = year ;
}
age() {
let date = new Date() ;
return date.getFullYear() - this.year ;
}
}
let myCar = new Car("Ford", 2014) ;
Logger.log("My car is " + myCar.age() + " years old.") ; // ผล : My car is 7 years old.

ตรวอยม่สำง – สยู่งพสำรสำมพิเตอรลใหค้กลับคลสำส
https://www.w3schools.com/js/tryit.asp?filename=tryjs_class_method2
class Car{
constructor(name, year) {
this.name = name ;
this.year = year ;
}
age(x) {
return x – this.year ;
}
}
let date = new Date() ;
let year = date.getFullYear() ;
let myCar = new Car("Ford", 2014) ;
Logger.log("My car is " + myCar.age(year) + " years old.") ; // ผล : My car is 7 years old.

บททขีริ่ 6 : ตลัวแปรวลัตถคุ 71
6.7. Class Inheritance หรรือ Child classes
JavaScript Class Inheritance
https://www.w3schools.com/js/js_class_inheritance.asp

6.7.ก.) Class Inheritance


ในกสำรสรค้สำงกสำรสงบทอดคลสำสใหค้ใชค้คคียลเวพิรดล extend คลสำสทคีงื่สรค้สำงขถึซนดค้วยกสำรสงบทอดคลสำส จะสงบทอด
วพิธคีกสำรทลัซงหมดจสำกคลสำสองงื่น
ตรวอยม่สำง
https://www.w3schools.com/js/tryit.asp?filename=tryjs_classes_inherit

class Car{
constructor(brand) {
this.carname = brand ;
}
present() {
return 'I have a ' + this.carname ;
}
}

class Model extends Car{


constructor(brand, mod) {
super(brand) ;
this.model = mod ;
}
show() {
return this.present() + ', it is a ' + this.model ;
}
}

let myCar = new Model("Ford", "Mustang") ;


Logger.log(myCar.show()); // I have a Ford, it is a Mustang

เมถอด super() หมสำยถถึงคลสำสหลลัก(Parent class)


โดยกสำรเรคียกใชค้เมถอด super() ในเมถอด constructor เรสำจะเรคียกวยู่สำ Parent's constructor method
และเขค้สำถถึงคถณสมบลัตพิและเมธอดของคลสำสหลลัก(Parent)
กสำรสงบทอดมคีประโยชนลสสสำหรลับกสำรใชค้โคค้ดซสซสำ ใชค้คถณสมบลัตพิและวพิธคีกสำรของคลสำสทคีงื่มคีอยยยู่ซสซสำ เมงงื่อเรสำสรค้สำง
คลสำสใหมยู่

72 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


6.7.ข.) Getters and Setters
ในคลสำสเรสำสสำมรสำถใชค้ get และ set ไดค้ (ดยเพพิงื่มเตพิมขค้อ 6.3 get, set และ Object method - Chrome V8
หนค้สำ 66 )
มลันดยเปป็นเรงงื่องฉลสำดทคีงื่จะใชค้ get และ set สสสำหรลับคถณสมบลัตพิของคลสำส โดยเฉพสำะอยยู่สำงยพิงื่งถค้สำเรสำตค้องกสำร
ทสสำสพิงื่งพพิเศษกลับคยู่สำ กยู่อนทคีงื่จะสยู่งคงน หรงอ กยู่อนทคีงื่คถณจะตลัซงคยู่สำ
แมค้วยู่สำ get จะเปป็นเมถอด เรสำไมยู่ตอค้ งใชค้วงเลก็บปปกกสำ เมงงื่อเรสำตค้องจลับคยู่สำจสำกคถณสมบลัตพิ
ตรวอยม่สำง – สรค้สำง get และ set ใหค้กลับคถณสมบลัตพิ carname
https://www.w3schools.com/js/tryit.asp?filename=tryjs_classes_getters

class Car{
constructor(brand) {
this.carname = brand ;
}
get cnam() {
return this.carname ;
}
set cnam(x) {
this.carname = x ;
}
}
let myCar = new Car("Ford") ;
Logger.log(myCar.cnam) ; // Ford

ชงงื่อของเมถอด get/set ตค้องไมยู่เหมงอนกลับชงงื่อของคถณสมบลัตพิ ดลังกรณคี carname ฉะนลัซน โปรแกรมเมอรล


หลสำยคนใชค้อลักขระขคีดลยู่สำง(_) กยู่อนชงงื่อคถณสมบลัตพิเพงงื่อแยก get/set ออกจสำกคถณสมบลัตพิจรพิง ***
ตรวอยม่สำง
https://www.w3schools.com/js/tryit.asp?filename=tryjs_classes_getters2
class Car
constructor(brand) {
this._carname = brand ; // คคุณสมบลัตรจรรง
}
get carname() {
return this._carname ; // นกาคคุณสมบลัตรจรรงมาใชช้
}
set carname(x) {
this._carname = x ; // นกาคคุณสมบลัตรจรรงมาใชช้
}
}
let myCar = new Car("Ford") ;
Logger.log(myCar.carname ) ; // Ford

บททขีริ่ 6 : ตลัวแปรวลัตถคุ 73
กสำรใชค้ set ใชค้ไวยกสำรณลเดคียวกลันกลับเมงงื่อเรสำตค้องกสำรเซก็ตคยู่สำของคถณบลัตพิ แตยู่ไมยู่ตค้องมคีวงเลก็บ
ตรวอยม่สำง – ใชค้ set เปลคีงื่ยน carname เปป็น Volvo
https://www.w3schools.com/js/tryit.asp?filename=tryjs_classes_setter
class Car
constructor(brand) {
this._carname = brand ; // คคุณสมบลัตรจรรง
}
get carname() {
return this._carname ; // นกาคคุณสมบลัตรจรรงมาใชช้
}
set carname(x) {
this._carname = x ; // นกาคคุณสมบลัตรจรรงมาใชช้
}
}
let myCar = new Car("Ford") ;
myCar.carname = "Volvo" ; // *****
Logger.log(myCar.carname ) ; // Volvo

6.7.ค.) Hoisting
แตกตยู่สำงจสำกฟฝังกลชลัน และกสำรประกสำศ JavaScript องงื่นๆ กสำรประกสำศคลสำสจะไมยู่ถยกยกขถึซน นลังื่น
หมสำยควสำมวยู่สำเรสำตค้องประกสำศคลสำสกยู่อนจถึงจะใชค้งสำนไดค้
ตลัวอยยู่สำง
https://www.w3schools.com/js/tryit.asp?filename=tryjs_classes_hoisting
// ยลังไมค่สามารถใชช้คลาสไดช้ ( ณ ตรงนขีนี้)
// myCar = new Car("Ford")
// ขช้างตช้นจะเกรด Error
class Car{
constructor(brand) {
this.carname = brand ;
}
}
// ณ ตรงนขีนี้ใชช้คลาสไดช้แลช้ว
let myCar = new Car("Ford")

74 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


6.8. เมถอด static
JavaScript Static Methods
https://www.w3schools.com/js/js_class_static.asp
static เมถอดของคลสำส ถยกกสสำหนดไวค้ในคลสำส เรสำไมยู่สสำมสำรถเรคียก static เมถอดบนวลัตถถไดค้ เรคียกไดค้
เฉพสำะบนคลสำสเทยู่สำนลัซน
ตรวอยม่สำง
https://www.w3schools.com/js/tryit.asp?filename=tryjs_class_static
class Car{
constructor(name) {
this.name = name ;
}
static hello() {
return "Hello!!" ;
}
}
let myCar = new Car("Ford") ;
// You can call 'hello()' on the Car Class:
Logger.log(Car.hello()) ; // Hello!!
// But NOT on a Car Object :
Logger.log(myCar.hello()) ; // เกรด Error

หสำกตค้องกสำรใชค้วตลั ถถ myCar ภสำยในเมถอดแบบ static เรสำสสำมสำรถสยู่งเปป็นพสำรสำมพิเตอรลไดค้


ตรวอยม่สำง
https://www.w3schools.com/js/tryit.asp?filename=tryjs_class_static2
class Car{
constructor(name) {
this.name = name ;
}
static hello(x) {
return "Hello " + x.name ;
}
}
let myCar = new Car("Ford") ;
Logger.log(Car.hello(myCar)) ; // this will raise an error.

บททขีริ่ 6 : ตลัวแปรวลัตถคุ 75
ตรวอยม่สำง – โคค้ดตยู่อไปนคีซสรค้สำงคลสำสของบถคคล และสรค้สำงเมถอดตยู่สำงๆ
class Person {
constructor(name,age) {
this.name = name
this.age = age
}
hello() {
return 'Hello'
}
get getAge() {
return this.age
}

static numberFour() {
return 4 ;
}
} // Close - class

กสำรใชค้งสำน
// สรช้างวลัตถคุดช้วยคค่าทขีริ่กกาหนดดช้วยพารามรเตอรต์ทขีริ่สค่งไป
let p1 = new Person("Wasan",43)
console.log(p1) ;
console.log(p1.name) ;
console.log(p1.hello()) ;
console.log(p1.getAge) ;

ผล

[ ] { name: 'Wasan', age: 43 }


[ ] Wasan
[ ] Hello
[ ] 43

76 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


6.9. Object destructuring – Chrome V8 ***
Object destructuring
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

Object destructuring เปป็นกสำรดถึง คยู่สำของอก๊อบเจก็กตลออกไปใชค้ ซถึงื่ง Chrome V8 ซถึงื่งสอดคลค้องกลับ


Javascript ES6 มคีโครงสรค้สำงในกสำรนสสำไปใชค้งสำนทคีงื่สะดวกขถึซน

ตรวอยม่สำงททที่ 1- พงซนฐสำน
const user = {
id: 42 ,
is_verified: true
};
// ถค่าย Value ของออ๊อบเจก็กตต์ user ไปใชช้กบลั ออ๊อบเจก็กตต์ไมค่มขีชมืริ่อ
// มขีแตค่ Keys ทขีริ่สอดคลช้องกลับ Keys ของตลัวตช้นทาง – เอามาบาง Keys กก็ไดช้
//
const {id, is_verified } = user ;
Logger.log(id) ; // 42 – ไมค่ตช้องใชช้แบบ user.id อขีกแลช้ว
Logger.log(is_verified) ; // true – ไมค่ตช้องใชช้แบบ user.is_verified อขีกแลช้ว

ตรวอยม่สำงททที่ 2 - กสสำหนดคยู่สำ โดยแยกจจสำกกสำรประกสำศ


let a, b ; // ประกาศตลัวแปรไวช้กค่อน
( {a, b} = {a: 1, b: 2} ) ;

ตรวอยม่สำงททที่ 3 - เปลคีงื่ยนชงงื่อ
const o = { p: 42, q: true } ;
const { p: foo, q: bar } = o ; // นกาไอเทก็มจาก o ใสค่ใหช้กลับ {} จากนลันี้นจลับใสค่ตลัวแปรใหมค่(ชมือริ่ ใหมค่)
Logger.log(foo) ; // 42
Logger.log(bar) ; // true

ตรวอยม่สำงททที่ 4 (Defalut values ) - สสำมสำรถกสสำหนดคยู่สำ Default ใหค้กลับอก๊อบเจก็กตลไดค้ ปป้องกลัน undefined


กรณคีไมยู่ไดค้กสสำหนด Value ใหค้กลับ Key
// กกาหนดคค่า Default
const {a = 10, b = 5} = {a: 3} ;
Logger.log(a) ; // 3 (คค่าใหมค่)
Logger.log(b) ; // 5 (คค่า Default)
// กกาหนดคค่า Default + จลับใสค่ตลัวแปรใหมค่
const {a: aa = 10, b: bb = 5} = {a: 3} ;
console.log(aa) ; // 3
console.log(bb) ; // 5

บททขีริ่ 6 : ตลัวแปรวลัตถคุ 77
ตรวอยม่สำงททที่ 5 – แตกคคียลของอก๊อบเจก็กตล จสำกนลัซนผยู่สำนเปป็นพสำรสำมพิเตอรลใหค้กลับฟฝังกลชลังื่น
const user = {
id: 42 ,
displayName: 'jdoe' ,
fullName: {
firstName: 'John' ,
lastName: 'Doe'
}
};
function userId({id}) {
return id ;
}
function whois({displayName , fullName: {firstName: name}}) {
return `${displayName} is ${name}` ;
}
Logger.log(userId(user)) ; // 42
Logger.log(whois(user)) ; // "jdoe is John"

ตรวอยม่สำงททที่ 6 – วลัตถถซค้อนวลัตถถ และกสำรแตกอสำเรยล


const metadata = {
title: 'Scratchpad' ,
translations: [
{
locale: 'de' ,
localization_tags: [] ,
last_edit: '2014-04-14T08:43:37' ,
url: '/de/docs/Tools/Scratchpad' ,
title: 'JavaScript-Umgebung'
}
],
url: '/en-US/docs/Tools/Scratchpad'
};
let {
title: englishTitle , // rename
translations: [
{
title: localeTitle , // rename
},
],
} = metadata ; // Assign to { }

Logger.log(englishTitle); // "Scratchpad"
Logger.log(localeTitle); // "JavaScript-Umgebung"

78 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำงททที่ 7 - สสสำหรลับกสำรวนลยปและกสำร Destructuring

const people = [
{
name: 'Mike Smith' ,
family: {
mother: 'Jane Smith' ,
father: 'Harry Smith' ,
sister: 'Samantha Smith'
},
age: 35
},
{
name: 'Tom Jones' ,
family: {
mother: 'Norah Jones' ,
father: 'Richard Jones' ,
brother: 'Howard Jones'
},
age: 25
}
];

// ลบลบูปดจึงขช้อมบูล(บางตลัว) จากออ๊อบเจก็กตต์ออกมา
for (const { name:n , family: {father:f} } of people) {
Logger.log('Name: ' + n + ' , Father: ' + f) ;
}
// "Name: Mike Smith , Father: Harry Smith"
// "Name: Tom Jones , Father: Richard Jones"

ตรวอยม่สำงททที่ 8 - 3 จถดในกสำรแตกวลัตถถ(Object Destructuring)


let { a, b, ...rest } = { a: 10, b: 20, c: 30, d: 40 }
a; // 10
b; // 20
rest ; // { c: 30, d: 40 }

บททขีริ่ 6 : ตลัวแปรวลัตถคุ 79
ตรวอยม่สำงททที่ 9 - กสำรรวมอสำเรยลและกสำรแตกวลัตถถ
อสำเรยลและวลัตถถสสำมสำรถรวมกลันไดค้ สมมตพิวสำยู่ คถณตค้องกสำรอพิเลก็มเมค้นตลทคีงื่สสำม ในอสำเรยลดค้สำนลยู่สำง จสำกนลัซน เรสำ
ตค้องกสำร คคียล name ในวลัตถถ เรสำสสำมสำรถทสสำสพิงื่งตยู่อไปนคีซ

const props = [
{ id: 1 , name: 'Fizz' } ,
{ id: 2 , name: 'Buzz' } ,
{ id: 3 , name: 'FizzBuzz' }
];
// เอา id ตลัวทขีริ่ 3
const [,, { name }] = props ;
Logger.log(name) ; // "FizzBuzz"

80 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


บททขีที่ 7
วลัตถถ Object
7.1. assign()
Object.assign()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

เมถอด assign() ใชค้กก๊อปปปปี้พรก๊อพเพอรลตคีซทลัซงหมดจสำกวลัตถถ Source ( 1 ขถึซนไป) ไปยลังวลัตถถ Target โดยจะ


คงนคยู่สำกลลับมสำเปป็นวลัตถถ Target
รยปแบบกสำรใชค้งสำน

Object.assign(target, ...sources)

ตลัวอยยู่สำง
const source = { b: 4, c: 5 } ;
const target = { a: 1, b: 2 } ;
const returnedTarget = Object.assign(target, source) ;
console.log(target) ;
// { a: 1, b: 4, c: 5 } - เขช้าไปเปลขียริ่ นตลัวปลายทางดช้วย ฉะนลันนี้ ไมค่จกาเปป็นตช้องสรช้างตลัวแปรมารลับอขีก
console.log(returnedTarget);
// { a: 1, b: 4, c: 5 }

7.2. create()
Object.create()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

เมถอด create() ใชค้สรค้สำงวลัตถถใหมยู่ จสำกวลัตถถทคีงื่มคีอยยยู่แลค้ว ในแบบสรค้สำง Prototype


รยปแบบกสำรใชค้งสำน

Object.create(proto, [propertiesObject])

82 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำง
var o ;
// create an object with null as prototype
o = Object.create(null) ;
o = {} ;
// is equivalent to:
o = Object.create(Object.prototype) ;
// Example where we create an object with a couple of
// sample properties. (Note that the second parameter
// maps keys to *property descriptors*.)
o = Object.create(Object.prototype, {
// foo is a regular 'value property'
foo: {
writable: true,
configurable: true,
value: 'hello'
},
// bar is a getter-and-setter (accessor) property
bar: {
configurable: false,
get: function() { return 10; },
set: function(value) {
console.log('Setting `o.bar` to', value);
}
/* with ES2015 Accessors our code can look like this
get() { return 10; },
set(value) {
console.log('Setting `o.bar` to', value);
} */
}
}) ;
function Constructor() {}
o = new Constructor() ;
// is equivalent to:
o = Object.create(Constructor.prototype) ;
// Of course, if there is actual initialization code
// in the Constructor function,
// the Object.create() cannot reflect it
// Create a new object whose prototype is a new, empty
// object and add a single property 'p', with value 42.
o = Object.create({}, { p: { value: 42 } });
// by default properties ARE NOT writable,
// enumerable or configurable:
o.p = 24 ;
o.p ;
// 42
o.q = 12 ;

บททขีริ่ 7 : วลัตถคุ Object 83


for (var prop in o) {
console.log(prop);
}
// 'q'
delete o.p;
// false

// to specify an ES3 property


o2 = Object.create({}, {
p: {
value: 42,
writable: true,
enumerable: true,
configurable: true
}
});
/* is not equivalent to:
This will create an object with prototype : {p: 42 }
o2 = Object.create({p: 42}) */

ตรวอยม่สำง
const person = {
isHuman: false ,
printIntroduction: function() {
console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`) ;
}
};
const me = Object.create(person) ;
me.name = 'Matthew' ; // "name" is a property set on "me", but not on "person"
me.isHuman = true ; // inherited properties can be overwritten
me.printIntroduction() ;
// "My name is Matthew. Am I human? true"

84 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


7.3. defineProperty()
Object.defineProperty()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

เมถอด defineProperty() ใชค้กสสำหนดคถณสมบลัตพิใหค้กลับวลัตถถโดยตรง หรงอ ใชค้ปรลับแตยู่งคถณสมบลัตพิทคีงื่อยยยู่แลค้วใน


วลัตถถ โดยคงนคยู่สำกลลับมสำเปป็ยวลัตถถ
รยปแบบกสำรใชค้งสำน

Object.defineProperty(obj, prop, descriptor)

พสำรสำมพิเตอรล
obj : วลัตถถทคีงื่เรสำจะกสสำหนดคถณสมบลัตพิThe object on which to define the property.
prop : ชงงื่อของคถณสมบลัตพิ หรงอ Symbol ของคถณสมบลัตพิ ทคีงื่เรสำจะสรค้สำงหรงอปรลับแตยู่ง
descriptor : มคี2 สยู่วน กก็คงอ 1. Data descriptor เปป็นคถณสมบลัตพิทคีงื่มคีคสำยู่ ซถึงื่งอสำจจะเขคียนไดค้หรงอไมยู่ไดค้กก็ไดค้
และ 2. Accessor descriptor เปป็นคถณสมบลัตพิทกคีงื่ สสำหนดโดย getter-setter descriptor ตค้องมคีเพคียงตลัวใดตลัวหนถึงื่ง
ทลัซง Data descriptor และ Accessor descriptor เปป็นวลัตถถซถึงื่งแชรลคคียล(optional)ตยู่อไปนคีซดค้วยกลัน กก็คงอ
configurable, enumerable, value, writable Accessor descriptor มคีคคียล(optional) ตยู่อไปนคีซ get, set
ถค้สำ descriptor ไมยู่มคีคคียล value, writable, get และ set จะถยกมองเปป็น Data descriptor แตยู่ถค้สำมคี Error
จะถยกขวค้สำงออกมสำ
ตลัวอยยู่สำง
const object1 = {} ;
Object.defineProperty(object1, 'property1', {
value: 42 ,
writable: false
}) ;
object1.property1 = 77 ; // throws an error in strict mode
console.log(object1) ; // {property1: 42}
console.log(object1.property1) ; // 42

ตลัวอยยู่สำง
var o = {} ;
Object.defineProperty(o, 'a', {
value : 37 ,
writable : true ,
enumerable : true ,
configurable : true
}) ;
console.log(a) ; // {a: 37}
console.log(o.a) ; // 37

บททขีริ่ 7 : วลัตถคุ Object 85


var bValue = 38 ;
Object.defineProperty(o, 'b', {
// แบบเกค่า get: function() { return bValue; }
get() { return bValue ; } ,
// แบบเกค่า set: function(newValue) { bValue = newValue; }
set(newValue) { bValue = newValue; } ,
enumerable: true ,
configurable: true
});
o.b ; // 38
// แบบนขีนี้ไมค่ไดช้ Mix ดช้วยกลันไมค่ไดช้ - Error
Object.defineProperty(o, 'conflict' , {
value: 0x9f91102 ,
get() { return 0xdeadbeef ; }
}) ;

7.4. Descriptors
A property descriptor is a record with some of the following attributes:

value
The value associated with the property (data descriptors only).

writable
true if and only if the value associated with the property may be changed (data descriptors
only).
get
A function which serves as a getter for the property, or undefined if there is no getter
(accessor descriptors only).
set
A function which serves as a setter for the property, or undefined if there is no setter
(accessor descriptors only).
configurable
true if and only if the type of this property descriptor may be changed and if the property
may be deleted from the corresponding object.
enumerable
true if and only if this property shows up during enumeration of the properties on the
corresponding object.

86 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


7.5. defineProperties()
Object.defineProperties()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties

รยปแบบกสำรใชค้งสำน

Object.defineProperties(obj, props)

ตลัวอยยู่สำง
const object1 = {} ;
Object.defineProperties(object1, {
property1: {
value: 42,
writable: true
},
property2: {}
}) ;
console.log(object1.property1) ; // 42

7.6. entries()
Object.entries()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries

เมถอด entries() คงนคยู่สำกลลับมสำเปป็นอสำเรยล(2 มพิต)พิ จสำกวลัตถถทคีงื่เลงอก โดยมคีกสำรแจกแจงอสำเรยลเปป็นคยยู่ของ


Key-Value โดยลสสำดลับเปป็นแบบเดคียวกลับทคีงื่ใชค้ for/in วนเขค้สำไป

กสำรเรคียงลสสำ ดลับอสำเรยลทคีงื่คงนคยู่สำมสำจสำก Object.entries() ไมยู่ไดค้ขถึซนกลับวยู่สำวลัตถถสรค้สำงมสำอยยู่สำงไร ฉะนลัซนถค้สำมคี


ควสำมจสสำเปป็นตค้องเรคียงอสำเรยล สสำมสำรถทสสำไดค้ดลังนคีซ

Object.entries(obj).sort((a, b) => b[0].localeCompare(a[0])) ;

รยปแบบกสำรใชค้งสำน

Object.entries(obj)

ตลัวอยยู่สำง
const obj = { foo: 'bar' , baz: 42 } ;
console.log(Object.entries(obj)) ; // [ ['foo', 'bar'], ['baz', 42] ]

ตลัวอยยู่สำง – ถค้สำระบถพสำรสำมพิเตอรล เปป็นสพิงื่งทคีงื่ไมยู่ใชยู่วลัตถถ ตลัวมคีจะถยกแปลงเปป็นวลัตถถ กรณคีตสำมตลัวอยยู่สำงตยู่อไปนคีซ


ระบถเปป็น string

Logger.log(Object.entries('foo')) ;

บททขีริ่ 7 : วลัตถคุ Object 87


ผล
Logs
[] [ ['0', 'f'], ['1', 'o'], ['2', 'o'] ]

หมสำยเหตถ - ถค้สำระบถพสำรสำมพิเตอรลเปป็น Number จะไดค้อสำเรยลวยู่สำงกลลับมสำ


ตลัวอยยู่สำง - กสำรวนเขค้สำไปในวลัตถถ
const obj = { a: 5 , b: 7 , c: 9 } ;
for (const [key, value] of Object.entries(obj)) {
console.log(`${key}: ${value}`) ; // ดบูผลทขีริ่ Logs
}

ผล
Logs
[] "a 5"
[] "b 7"
[] "c 9"

จสำกตลัวอยยู่สำงกยู่อนหนค้สำ ใชค้เมถอด forEach ของอสำเรยลกก็ไดค้


Object.entries(obj).forEach(([key, value]) => {
console.log(`${key} ${value}`) ; // "a 5", "b 7", "c 9"
}) ;

7.7. fromEntries()
Object.fromEntries()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries

เมถอด fromEntries() ใชค้แปลงรสำยกสำรทคีงื่เปป็นคยยู่ของ Key-Value กลลับไปเปป็นวลัตถถ พสำรสำมพิเตอรล iterable


เปป็นไดค้ทลัซงวลัตถถ Array หรงอ Map หรงอวลัตถถองงื่นๆทคีงื่สสำมสำรถวนเขค้สำไปไดค้ เมถอด fromEntries() คงนคยู่สำกลลับมสำเปป็น
วลัตถถตลัวใหมยู่
รยปแบบกสำรใชค้งสำน

Object.fromEntries(iterable) ;

ตลัวอยยู่สำง – แปลงอสำเรยล เปป็นวลัตถถ


const arr = [
['0' , 'a'] ,
['1' , 'b'] , ['2', 'c']
];

88 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


const obj = Object.fromEntries(arr) ;
console.log(obj) ; // { 0: "a", 1: "b", 2: "c" }

ตลัวอยยู่สำง – แปลง Map เปป็นวลัตถถ


const entries = new Map([
[ 'foo' , 'bar' ] ,
[ 'baz' , 42 ]
]) ;
const obj = Object.fromEntries(entries) ;
console.log(obj) ; // { foo: "bar", baz: 42 }

7.8. freeze()
Object.freeze()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

เมถอด freeze() ใชค้แชยู่แขก็งวลัตถถ ไมยู่สสำมสำรถเปลคีงื่ยนแปลงไดค้อคีกตยู่อไป กสำรฟรคีซวลัตถถ ปป้องกลันกสำรกสำรสรค้สำง


คถณสมบลัตใพิ หมยู่ ปป้องกสำรลบ ปป้องกลันกสำรเปลคีงื่ยนแปลง enumerable, writable, configurable ทคีงื่กสสำหนดไวค้แลค้ว
และปป้องกลันกสำรเปลคีงื่ยนแปลงคยู่สำตยู่สำงของคถณสมบลัตพิตยู่สำงๆ และเมถอด freeze() ปป้องกลันวลัตถถทคีงื่ prototpye ไป
เปลคีงื่ยนแปลงอคีกดค้วย
freeze() คงนคยู่สำกลลับมสำเปป็นวลัตถถตลัวปฝัจจถบลัน

รยปแบบกสำรใชค้งสำน

Object.freeze(obj)

ตลัวอยยู่สำง
const obj = {
prop: 42
};
Object.freeze(obj) ;
obj.prop = 33 ; // Throws an error in strict mode
Logger.log(obj.prop) ; // 42

7.9. isFrozen()
Object.isFrozen()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen
เมถอด isFrozen() ใชค้ตรวจสอบวยู่สำวลัตถถถยกแชยู่แขก็งอยยยู่หรงอไมยู่
รยปแบบกสำรใชค้งสำน

บททขีริ่ 7 : วลัตถคุ Object 89


Object.isFrozen(obj)

ตลัวอยยู่สำง
const object1 = {
property1: 42
};
console.log(Object.isFrozen(object1)) ; // false
Object.freeze(object1) ;
console.log(Object.isFrozen(object1)) ; // true

7.10. seal()
Object.seal()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal
เมถอด seal() ปปิดผนถึกวลัตถถ ปป้องกลันกสำรเพพิงื่มคถณสมบลัตพิใหมยู่ และมสำรลคคถณสมบลัตพิทคีงื่มคีอยยยู่แลค้ว ใหค้เปป็น non-
configurable คยู่สำของคถณสมบลัตพิปฝัจจถบลัน ยลังคงเปลคีงื่ยนไดค้ ตรสำบใดทคีงื่ writable
seal() คงนคยู่สำกลลับมสำเปป็นวลัตถถตวลั เดพิมทคีงื่ถยกปปิดผนถึก

รยปแบบกสำรใชค้งสำน

Object.seal(obj)

ตลัวอยยู่สำง
var obj = {
prop: function() {} ,
foo: 'bar'
};
obj.foo = 'baz' ; // เปลขียริ่ นคค่าของคคุณสมบลัตร prop
obj.lumpy = 'woof' ; // เพรริ่มคคุณสมบลัตร lumpy
delete obj.prop ; // ลบคคุณสมบลัตร prop
Logger.log(obj) // { foo: "baz", lumpy: "woof" }
var o = Object.seal(obj) ; // สรช้างวลัตถคุ o จาก obj ทขีริ่ปดปิ ผนจึก
o === obj ; // true ( o มขีทคุกอยค่างเหมมือนกลับ obj )
Object.isSealed(obj) ; // === true
obj.foo = 'quux' ; // เปลขียริ่ นคค่าของคคุณสมบลัตร >>> ยลังคงทกาไดช้
// ไมค่สามารถแปลงคคุณสมบลัตร ไปเปป็น Accessors ไดช้ - ERROR
Object.defineProperty(obj, 'foo', {
get: function() { return 'g' ; }
}) ;

90 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


// ณ ตอนนขีนี้ กรเปลขียริ่ นแปลงใดๆ นอกเหนมือจากคคุณสมบลัตร จะทกาไมค่ไดช้
obj.quaxxor = 'the friendly duck' ; // silently doesn't add the property
delete obj.foo ; // silently doesn't delete the property
// ...and in strict mode such attempts will throw TypeErrors.
function fail() {
'use strict' ;
delete obj.foo ; // throws a TypeError
obj.sparky = 'arf' ; // throws a TypeError
}
fail() ; // Error

// Attempted additions through Object.defineProperty will also throw.


Object.defineProperty(obj, 'ohai', {
value: 17
}) ; // throws a TypeError
Object.defineProperty(obj, 'foo', {
value: 'eit'
}) ; // changes existing property value

7.11. isSealed()
Object.isSealed()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed
เมถอด isSealed() ใชค้ตรวจสอบวยู่สำวลัตถถถยกปปิดผนถึกหรงอไมยู่
รยปแบบกสำรใชค้งสำน

Object.isSealed(obj)

ตลัวอยยู่สำง
const object1 = {
property1: 42
};
console.log(Object.isSealed(object1)); // false
Object.seal(object1);
console.log(Object.isSealed(object1)) ; // true

7.12. is()
Object.is()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
เมถอด is() ใชค้ตรวจสอบวยู่สำ 2 คยู่สำเปป็นคยู่สำเดคียวกลันหรงอไมยู่

บททขีริ่ 7 : วลัตถคุ Object 91


รยปแบบกสำรใชค้งสำน

Object.is(value1, value2) ;

ตลัวอยยู่สำง
Object.is('foo', 'foo') ; // true
Object.is(window, window) ; // true
Object.is('foo', 'bar') ; // false
Object.is([], []) ; // false
var foo = { a: 1 } ;
var bar = { a: 1 } ;
Object.is(foo, foo) ; // true
Object.is(foo, bar) ; // false - ใชช้เปรขียบเทขียบเนมือนี้ หาในวลัตถคุไมค่ไดช้
Object.is(null, null) ; // true
// Special Cases
Object.is(0, -0) ; // false
Object.is(-0, -0) ; // true
Object.is(NaN, 0/0) ; // true

7.13. isExtensible()
Object.isExtensible()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible

เมถอด isExtensible() ใชค้ตรวจสอบวยู่สำวลัตถถขยสำยไดค้หรงอไมยู่ (Extensible) กก็คงอ สสำมสำรถเพพิงื่มคถณสมบลัตพิลง


ไปไดค้หรงอไมยู่ ?
รยปแบบกสำรใชค้งสำน

Object.isExtensible(obj)

ตลัวอยยู่สำง
const object1 = {} ;
console.log(Object.isExtensible(object1)) ; // true
Object.preventExtensions(object1) ;
console.log(Object.isExtensible(object1)) ; // false

ตลัวอยยู่สำง
// New objects are extensible.
var empty = {} ;
Object.isExtensible(empty) ; // === true

92 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


// ...but that can be changed.
Object.preventExtensions(empty) ;
Object.isExtensible(empty) ; // === false
// วลัตถคุทขีริ่ถบูก Seal เปป็น Non-extensible.
var sealed = Object.seal({}) ;
Object.isExtensible(sealed) ; // === false
// วลัตถคุทขีริ่ถบูก Freeze เปป็น Non-extensible.
var frozen = Object.freeze({}) ;
Object.isExtensible(frozen) ; // === false

7.14. preventExtensions()
Object.preventExtensions()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/preventExtensions

เมถอด preventExtensions() ปป้องกลันกสำรเพพิงื่มคถณสมบลัตพิใหมยู่ ลงไปในวลัตถถ


รยปแบบกสำรใชค้งสำน

Object.preventExtensions(obj)

ตรวอยม่สำง
// Object.preventExtensions คมืนคค่าเปป็นวลัตถคุตลัวเดรมแตค่ non-extensible
var obj = {} ;
var obj2 = Object.preventExtensions(obj) ;
obj === obj2 ; // true
// Objects สามารถ Extensible ไดช้อยบูค่แลช้ว โดยปรรยาย
var empty = {} ;
Object.isExtensible(empty) ; // === true
// … แตค่สามารถเปลขียริ่ นไดช้
Object.preventExtensions(empty) ;
Object.isExtensible(empty) ; // === false
// Object.defineProperty ขวช้าง Error ออกมา หากเราพยายามไปเพรมริ่ คคุณสมบลัตรใหช้ Non-extensible
var nonExtensible = { removable: true } ;
Object.preventExtensions(nonExtensible) ;
Object.defineProperty(nonExtensible, 'new', {
value: 8675309
}) ; // throws a TypeError
// ในโหมด strict ความพยายามทขีริ่จะเพรมริ่ คคุณสมบลัตรใหช้กบลั Non-extensible จะขวช้าง Error ออกมา
function fail() {
'use strict' ;
nonExtensible.newProperty = 'FAIL' ;
}
fail() ; // throws a TypeError

บททขีริ่ 7 : วลัตถคุ Object 93


7.15. keys() ***
JavaScript ES5 Object Methods
https://www.w3schools.com/js/js_object_es5.asp
ECMAScript 6 - ECMAScript 2015
https://www.w3schools.com/js/js_es6.asp
Object – เมถอดตค่างๆในคลาส Object
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object
Object.keys(obj)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
เมถอด keys() ใชค้จลับ Keys ของตลัวแปรวลัตถถใสยู่ในอสำเรยล พสำรสำมพิเตอรล obj กก็คงอ วลัตถถ โดยจะคงนคยู่สำกลลับมสำ
เปป็น string[] - กค้อนสตรพิงของ Keys ของ obj
รยปแบบกสำรใชค้งสำน

Object.keys(obj)

ตลัวอยยู่สำง
var instrutor = {
fname : "Wasan" ,
lname : "Khunnsdiloksawet" ,
email : "wasankds@gmail.com" ,
zip : 67140
};
var arr = Object.keys(instrutor) ;
Logger.log(arr) ; // ดบูผลทขีริ่ Logs ------------------ > [ 01 ]
// ใสค่พารามรเตอรต์เปป็นอาเรยต์
var arr2 = Object.keys(arr) ; // ดบูผลทขีริ่ Logs ------------------ > [ 02 ]
Logger.log(arr2) ;

ผล

Logs
[ 01 ] [fname, lname, email, zip]
[ 02 ] [0, 1, 2, 3]

94 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


7.16. values() ***
Object.values()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values
เมถอด values() ใชค้จลับ Values ของตลัวแปรวลัตถถใสยู่ในอสำเรยล พสำรสำมพิเตอรล obj กก็คงอ วลัตถถ โดยจะคงนคยู่สำ
กลลับมสำเปป็น string[] - กค้อนสตรพิงของ Keys ของ obj
รยปแบบกสำรใชค้งสำน

Object.values(obj)

ตลัวอยยู่สำง
const object1 = {
a: 'somestring' ,
b: 42 ,
c: false
};
console.log(Object.values(object1)) ; // ["somestring", 42, false]

ตลัวอยยู่สำง – ถค้สำพสำรสำมพิเตอรลทคีงื่ระบถลงไป ไมยู่ใชยู่วตลั ถถ ตลัวมลันจะถยกแปลงเปป็นวลัตถถ

console.log(Object.values('foo')) ; // ['f', 'o', 'o']

ตลัวอยยู่สำง
const my_obj = Object.create({}, { getFoo:
{ value: function() { return this.foo ; } }
}) ;
my_obj.foo = 'bar' ;
console.log(Object.values(my_obj)) ; // ['bar']

7.17. getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptor()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor

เมถอด getOwnPropertyDescriptor() คงนคยู่สำเปป็น คถณสมบลัตพิของ Discriptor ของคถณสมบลัตพิของวลัตถถใดๆ


กก็คงอ ตลัวทคีงื่แสดงบนวลัตถถใดๆ ไมยู่ใชยู่ของวลัตถถสงบถอด
รยปแบบกสำรใชค้งสำน

Object.getOwnPropertyDescriptor(obj, prop)

obj : วลัตถถทคีงื่จะมองหสำคถณสมบลัตพิ
prop : ชงงื่อหรงอ Symbol ของคถณสมบลัตพิ ซถึงื่งจะรลับคสสำจสสำกลัดควสำมมสำ

บททขีริ่ 7 : วลัตถคุ Object 95


ตรวอยม่สำง
const object1 = {
property1: 42
};
const descriptor1 = Object.getOwnPropertyDescriptor(object1, 'property1') ;
console.log(descriptor1.configurable) ; // true
console.log(descriptor1.value) ; // 42

ตลัวอยยู่สำง
var o , d ;
o = { get foo() { return 17 ; } } ;
d = Object.getOwnPropertyDescriptor(o , 'foo') ;
// d is {
// configurable: true ,
// enumerable: true ,
// get: /*the getter function*/ ,
// set: undefined
// }
o = { bar: 42 } ;
d = Object.getOwnPropertyDescriptor(o , 'bar') ;
// d is {
// configurable: true ,
// enumerable: true ,
// value: 42 ,
// writable: true
// }
o = { [Symbol.for('baz')]: 73 }
d = Object.getOwnPropertyDescriptor(o , Symbol.for('baz')) ;
// d is {
// configurable: true ,
// enumerable: true ,
// value: 73 ,
// writable: true
// }
o = {} ;
Object.defineProperty(o , 'qux' , {
value: 8675309 ,
writable: false ,
enumerable: false
}) ;
d = Object.getOwnPropertyDescriptor(o , 'qux') ;
// d is {
// value: 8675309 ,
// writable: false ,
// enumerable: false ,
// configurable: false
// }

96 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


7.18. getOwnPropertyDescriptors()
Object.getOwnPropertyDescriptors()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors

เมถอด getOwnPropertyDescriptors() คงนคยู่สำเปป็น วลัตถถทคีงื่ประกอบไปดค้วย Property descriptors ของตลัว


เอง สสสำหรลับวลัตถถใดๆ
รยปแบบกสำรใชค้งสำน

Object.getOwnPropertyDescriptors(obj)

ตลัวอยยู่สำง
const object1 = {
property1: 42
};
const descriptors1 = Object.getOwnPropertyDescriptors(object1) ;
console.log(descriptors1.property1.writable) ; // true
console.log(descriptors1.property1.value) ; // 42

7.19. getOwnPropertyNames()
Object.getOwnPropertyNames()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames

เมถอด getOwnPropertyNames() คงนคยู่สำเปป็นอสำเรยลของทถกคถณสมบลัตพิ ทคีพงื่ บโดยตรงของวลัตถถทรคีงื่ ะบถ (รวม


ไปถถึงคถณสมบลัตพิ Non-enumerable ยกเวค้น ทคีใงื่ ชค้ Symbol )
รยปแบบกสำรใชค้งสำน

Object.getOwnPropertyNames(obj)

ตลัวอยยู่สำง
const object1 = {
a: 1 ,
b: 2 ,
c: 3
};
console.log(Object.getOwnPropertyNames(object1)) ; // ["a", "b", "c"]

ตลัวอยยู่สำง – ถค้สำระบถพสำรสำมพิเตอรล ทคีงื่ไมยู่ใชยู่วลัตถถ จะถยกแปลงเปป็นวลัตถถ


Object.getOwnPropertyNames('foo') ; // ["0", "1", "2", "length"]

บททขีริ่ 7 : วลัตถคุ Object 97


ตรวอยม่สำง
var arr = ['a', 'b', 'c'] ; // พารามรเตอรต์เปป็น อาเรยต์
console.log(Object.getOwnPropertyNames(arr).sort()) ; // ["0", "1", "2", "length"]
// วลัตถคุทคขีริ่ ลช้ายอาเรยต์ (Array-like object)
var obj = { 0: 'a', 1: 'b', 2: 'c' } ;
console.log(Object.getOwnPropertyNames(obj).sort()) ; // ["0", "1", "2"]
// Logging property names and values using Array.forEach
Object.getOwnPropertyNames(obj).forEach(function (val, idx, array) {
console.log(val + ' -> ' + obj[val]) ;
}) ;
// 0 -> a
// 1 -> b
// 2 -> c
// non-enumerable property
var my_obj = Object.create({}, {
getFoo: {
value: function() { return this.foo ; },
enumerable: false
}
}) ;
my_obj.foo = 1 ;
console.log(Object.getOwnPropertyNames(my_obj).sort()) ; // ["foo", "getFoo"]

7.20. getOwnPropertySymbols()
Object.getOwnPropertySymbols()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertySymbols

เมถอด getOwnPropertySymbols() คงนคยู่สำเปป็นอสำเรยลของ ทถก Symbol properties ทคีงื่พบโดยตรงขถึซนอยยยู่


กลับวลัตถถทคีงื่ระบถ
รยปแบบกสำรใชค้งสำน

Object.getOwnPropertySymbols(obj)

98 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตลัวอยยู่สำง
const object1 = {} ;
const a = Symbol('a') ;
const b = Symbol.for('b') ;
object1[a] = 'localSymbol' ;
object1[b] = 'globalSymbol' ;
console.log(obj) ; // {Symbol(a): "localSymbol", Symbol(b): "globalSymbol"}
const objectSymbols = Object.getOwnPropertySymbols(object1) ;
console.log(objectSymbols.length) ; // 2
console.log(objectSymbols) ; // [Symbol(a), Symbol(b)]
console.log(objectSymbols[0]) ; // Symbol(a)

7.21. getPrototypeOf()
Object.getPrototypeOf()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf

เมถอด getPrototypeOf() คงนคยู่สำเปป็น Prototype เชยู่น คยู่สำของคถณสมบลัตพิภสำยในของวลัตถถทคีงื่ระบถ


รยปแบบกสำรใชค้งสำน

Object.getPrototypeOf(obj)

ตลัวอยยู่สำง
const prototype1 = {} ;
const object1 = Object.create(prototype1) ;
console.log(Object.getPrototypeOf(object1) === prototype1) ; // true

ดยเพพิที่มเตพิม : setPrototypeOf()
Object.setPrototypeOf()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf

บททขีริ่ 7 : วลัตถคุ Object 99


100 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)
บททขีที่ 8
วลัตถถนน่าสนใจ
8.1. วลัตถถุ Set
Set
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
Set() constructor
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/Set
วลัตถถ Set ใชค้เกก็บคยู่สำทคีงื่ไมยู่ซสซสำกลัน วลัตถถ Set เปป็นกค้อนของคยู่สำ เรสำจถึงสสำมสำรถวนลยปเขค้สำไปขค้สำงในไดค้
ตรวอยม่สำง – กสำรใชค้ Set ทคีงื่เกคีงื่ยวขค้องกลับอสำเรยล
let myArray = ['value1', 'value2', 'value3']
// ใชช้ Set constructor สรช้างวลัตถคุ Set จากอาเรยต์
let mySet = new Set(myArray)
mySet.has('value1') // returns true
// ใชช้ Spread operator แปลงจากวลัตถคุ Set เปป็นอาเรยต์
Logger.log([...mySet])

ตรวอยม่สำง – ใชค้ Set เกก็บเฉพสำะตลัวทคีงื่ Unique


const numbers = [2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5]
Logger.log([...new Set(numbers)]) // [2, 3, 4, 5, 6, 7, 32] - แปลงเปป็นอาเรยต์ในขลันี้นตอนเดขียว

8.2. วลัตถถุ WeakSet


WeakSet
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet
WeakSet เปป็นวลัตถถทคีงื่เกก็บวลัตถอคีกทคี หรงอเปป็นกค้อนของวลัตถถ เชยู่นเดคียวกลัน Set แตยู่ละวลัตถถอยยยู่ใน WeakSet
อสำจมคีเพคียงตลัวเดคียว ทถกวลัตถถในกค้อน WeakSet กก็ Unique เชยู่นเดคียวกลัน
ควสำมแตกตยู่สำงระหวยู่สำง Set และ WeakSet
WeakSet เปป็นกค้อนของวลัตถถเทยู่สำนลัซน (มคีสมสำชพิกเปป็นวลัตถถเทยู่สำนลัซน) ไมยู่เหมงอนกลับ Set ทคีงื่มคีคยู่สำเปป็นชนพิดอะไร
กก็ไดค้
WeakSet นลัซน Weak ตสำมชงงื่อ กสำรอค้สำงอพิงทคีงื่วลัตถถใน WeakSet นลัซนถงอไวค้ไดค้อยู่อนแรง ถค้สำไมยู่มคีกสำรอค้สำงอพิงใดๆ
ถถึงวลัตถถทคีงื่อยยยู่ใน WeakSet วลัตถถเหลยู่สำนลัซนจะเปป็นเหมงอนขยะ
หมสำยเหตถุ
เมถอดของ WeakSet กก็คงอ add, has และ delete ทสสำงสำนแปลกๆ หรงอไมยู่ทสสำงสำนเลยใน Apps Script
ไมยู่เหมงอนกลับใน Javascript

102 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตลัวอยยู่สำง

const ws = new WeakSet() ;


const foo = {} ;
const bar = {} ;
ws.foo = foo ; // ws.add(foo) ; - ใชช้แบบนขีนี้ไมค่ไดช้ ใชช้ไดช้แตค่ใน Javascript
ws.bar = bar ; // ws.add(bar) ; - ใชช้แบบนขีนี้ไมค่ไดช้ ใชช้ไดช้แตค่ใน Javascript
Logger.log(ws) ; // {bar={c=3.0}, foo={b=2.0, a=1.0}}
ws.has(foo) ; // true
ws.has(bar) ; // true
ws.delete(foo) ; // removes foo from the set
ws.has(foo) ; // false, foo has been removed
ws.has(bar) ; // true, bar is retained

ขค้สำงตค้น ใหค้โนค้ตไวค้วยู่สำ foo !== bar แมค้ทลัซง 2 จะเปป็นวลัตถถวยู่สำงเหมงอนกลัน แตยู่ไมยู่ใชยู่วลัตถถทคีงื่เหมงอนกลัน ฉะนลัซน


ทลัซง 2 จถึงถยกเพพิงื่มลงใน WeakSet ไดค้

8.3. วลัตถถุ Map


Map
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
Map() constructor
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/Map

วลัตถถ Map เกก็บคยยู่ของ key-value ไวค้ และจสสำลสสำดลับดลัซงเดพิมของคคียลไวค้ดค้วย


เรสำสสำมสำรถวนลยปเขสำไปในวลัตถถ Map ไดค้โดย for/of และคงนคยู่สำกลลับมสำเปป็นอสำเรยลของ [key, value] ใน
แตยู่ละลยป
Object เหมงอนกลับ Map ทลัซง 2 ใหค้เรสำสสำมสำรถกสสำหนด Keys, รลับ Values จสำกคคียล, ลบ Keys และตรวจ
สอบวยู่สำ Key เกก็บอะไรไวค้หรงอเปลยู่สำ ดค้วยเหตถผลดลังกลยู่สำว Objects ถยกใชค้เหมงอนกลับ Map
ตรวอยม่สำง (ใชค้งสำนไมยู่ไดค้ใน Apps Script)
// ใชช้งานเหมมือน Object เหมมือนจะไดช้ แตค่ไมค่ไดช้ ...
let wrongMap = new Map()
wrongMap['bla'] = 'blaa' ;
wrongMap['bla2'] = 'blaaa2' ;
console.log(wrongMap) // { bla: 'blaa', bla2: 'blaaa2' }
// แตค่…. ทกางานไมค่เหมมือนกลับทขีริ่คาดไวช้
wrongMap.has('bla') // false - ทกางานผรดปกตร
wrongMap.delete('bla') // false - ทกางานผรดปกตร
console.log(wrongMap) // { bla: 'blaa', bla2: 'blaaa2' }

บททขีริ่ 8 : วลัตถคุนค่าสนใจ 103


let myMap = new Map()
myMap.set('bla','blaa')
myMap.set('bla2','blaa2')
Logger.log(myMap) // Map { 'bla' => 'blaa', 'bla2' => 'blaa2' }

myMap.has('bla') // true
myMap.delete('bla') // true
Logger.log(myMap) // Map { 'bla2' => 'blaa2' }

ตรวอยม่สำง (ใชค้งสำนไดค้ใน Apps Script)


let myMap = new Map()
myMap.set(0, 'zero') // myMap.set(key, value)
myMap.set(1, 'one')
for (let [key, value] of myMap) {
Logger.log(key + ' = ' + value)
}
// 0 = zero
// 1 = one

for (let key of myMap.keys() ) {


Logger.log(key)
}
// 0
// 1
for (let value of myMap.values()) {
Logger.log(value)
}
// zero
// one

for (let [key, value] of myMap.entries()) {


Logger.log(key + ' = ' + value)
}
// 0 = zero
// 1 = one

104 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


8.4. วลัตถถุ WeakMap
WeakMap
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
วลัตถถ WeakMap เปป็นกค้อนของคยยู่ Key-Value ซถึงื่ง Keys ถยกอค้สำงอพิงไดค้แบบอยู่อนแอ
const wm1 = new WeakMap() ,
wm2 = new WeakMap() ,
wm3 = new WeakMap() ;
const o1 = {} ,
o2 = function() {} ,
o3 = window ;
wm1.set(o1, 37) ;
wm1.set(o2, 'azerty') ;
wm2.set(o1, o2) ; // a value can be anything, including an object or a function
wm2.set(o3, undefined) ;
wm2.set(wm1, wm2) ; // keys and values can be any objects. Even WeakMaps!
wm1.get(o2) ; // "azerty"
wm2.get(o2) ; // undefined, because there is no key for o2 on wm2
wm2.get(o3) ; // undefined, because that is the set value
wm1.has(o2) ; // true
wm2.has(o2) ; // false
wm2.has(o3) ; // true (even if the value itself is 'undefined')
wm3.set(o1, 37) ;
wm3.get(o1) ; // 37
wm1.has(o1) ; // true
wm1.delete(o1) ;
wm1.has(o1) ; // false

8.5. วลัตถถุ Symbol


Symbol
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol

Primitive
https://developer.mozilla.org/en-US/docs/Glossary/Primitive
วลัตถถชนพิด Symbol เปป็นชนพิดขค้อมยลแบบ Primitive ซถึงื่ง Primitive มคี 6 ตลัวกก็คงอ
string, number, bigint, boolean, undefined และ Symbol

ฟฝังกลชลังื่น Symbol() คงนคยู่สำกลลับมสำเปป็นคยู่สำทคีงื่มคีชนพิดเปป็น Symbol()

บททขีริ่ 8 : วลัตถคุนค่าสนใจ 105


คยู่สำทคีงื่คงนกลลับจสำก ฟฝังกลชลังื่น Symbol() ยยนคีคเสมอ(ไมยู่เหมงอนกลัน) คยู่สำของ Symbol อสำจถยกใชค้เปป็นตลัวบยู่งชคีซ
สสสำหรลับคถณสมบลัตพิของวลัตถถ นคีงื่เปป็นวลัตถถประสงคลหลลักของขค้อมยลชนพิดนคีซ แมค้วยู่สำมลันจะมคีหลสำกหลสำยวพิธคีทคีงื่จะสรค้สำงตลัวทคีงื่ยย
นคีค ขถึซนมสำ
ตลัวอยยู่สำง
let sym1 = Symbol() ;
let sym2 = Symbol('foo') ;
let sym3 = Symbol('foo') ;
Symbol('foo') === Symbol('foo') // false ***
// ไมค่รองรลับการประกาศปบบนขีนี้
let sym = new Symbol() // TypeError
let sym = Symbol('foo')
typeof sym // "symbol"
let symObj = Object(sym)
typeof symObj // "object"

106 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


บททขีที่ 9
เทคนนิคตลัวแปรวลัตถถ
9.1. จลับ Key จสำก Value แบบทคีที่ 1
How to get a key in a JavaScript object by its value?
https://stackoverflow.com/questions/9907419/how-to-get-a-key-in-a-javascript-object-by-its-value

โคค้ด
const obj = {'A' : 1 ,
'B' : 2 ,
'C' : 3 ,
'D' : 4 ,
'AAA' : 1 ,
'BBB' : 2 ,
'CCC' : 3 , }
// จลับ Key เดขียว – ถช้า 1 Value มขีหลาย Key จะคมืน Key เดขียว
let key = Object.keys(obj).find( k => obj[k] === 4 ) ;
Logger.log(key) ; // ผล : D
// จลับทคุก Keys – ถช้า 1 Value มขีหลาย Key จะคมืน Keys ทลันี้งหมดเกก็บไวช้ในอาเรยต์
let keys = Object.keys(obj).filter( k => obj[k]=== 1 );
Logger.log(keys) ; // ผล : [A, AAA]

108 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


9.2. จลับ Key จสำก Value แบบทคีที่ 2 สรค้สำงเปป็นเมถอด
How to get a key in a JavaScript object by its value?
https://stackoverflow.com/questions/9907419/how-to-get-a-key-in-a-javascript-object-by-its-value

โคค้ด
Object.prototype.getKey = function(value){
for(var key in this){
if(this[key] == value){
return key ;
}
}
return null ;
};

กสำรใชค้งสำน
// ISO 639: 2-letter codes
var languageCodes = {
DA: 'Danish' ,
DE: 'German' ,
DZ: 'Bhutani' ,
EL: 'Greek' ,
EN: 'English' ,
EO: 'Esperanto' ,
ES: 'Spanish'
};

var key = languageCodes.getKey('Greek');


console.log(key) ; // EL

บททขีริ่ 9 : เทคนรคตลัวแปรวลัตถคุ 109


9.3. กรองตลัวแปรวลัตถถุทคีที่ซสซสำ
“remove duplicate objects from array javascript” Code Answer
https://www.codegrepper.com/code-examples/javascript/remove+duplicate+objects+from+array+javascript

โคค้ด
const objsInArr = [
{dbFileId:'A', dbFileNm:'DB', dbFileShtNm:'Sheet1'} , // Dup
{dbFileId:'B', dbFileNm:'DB2', dbFileShtNm:'SheetDB2' } ,
{dbFileId:'A', dbFileNm:'DB', dbFileShtNm:'Sheet1' } , // Dup
{dbFileId:'A', dbFileNm:'DB', dbFileShtNm:'Sheet2' } ,
{dbFileId:'A', dbFileNm:'DB', dbFileShtNm:'Sheet1' } // Dup
]
const data = Array.from(new Set(objsInArr.map(JSON.stringify))).map(JSON.parse) ;
Logger.log(data) ; // ดบูผลทขีริ่ Logs -------------------------------- >
}

ผล

Logs
[
{dbFileId:'A', dbFileNm:'DB', dbFileShtNm:'Sheet1'} ,
{dbFileId:'B', dbFileNm:'DB2', dbFileShtNm:'SheetDB2' } ,
{dbFileId:'A', dbFileNm:'DB', dbFileShtNm:'Sheet2' }
]

จรพิงแคยู่เพคียงสลัซนๆแคยู่นคีซกก็ใชค้ไดค้แลค้ว กก็คงอ เปป็นกสำรสรค้สำงอสำเรยลใหมยู่ จสำกกค้อนอะไรกก็รตสำมแตยู่ จสำกนลัซน new


Set จะกลองตลัวซสซสำในอสำเรยลออก โคค้ดกค้อนหนค้สำใชค้ JSON.stringify และ JSON.parse เพงงื่อแปลงกลลับไปมสำระ
หวยู่สำง JSON กลับ Javascript object เพงงื่อปป้องกลัน Error

const data = Array.from(new Set(objsInArr))

110 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


9.4. กรองตลัวแปรวลัตถถุทคีที่ซสซสำ โดยใชค้ 1 คคียย์
โคค้ด
function callFunction(){
var arrayWithDuplicates = [
{ "type":"LICENSE", "licenseNum": "12345", state:"NV" } ,
{ "type":"LICENSE", "licenseNum": "A7846", state:"CA" } ,
{ "type":"LICENSE", "licenseNum": "12345", state:"OR" } ,
{ "type":"LICENSE", "licenseNum": "10849", state:"CA" } ,
{ "type":"LICENSE", "licenseNum": "B7037", state:"WA" } ,
{ "type":"LICENSE", "licenseNum": "12345", state:"NM" }
];
var uniqueArray = removeDuplicates(arrayWithDuplicates, "licenseNum") ;
Logger.log("uniqueArray is: " + JSON.stringify(uniqueArray)) ;
}
function removeDuplicates(originalArray, prop) {
var lookupObject = {} ;
for(var i in originalArray) {
lookupObject[originalArray[i][prop]] = originalArray[i] ;
}
var newArray = [] ;
for(i in lookupObject) {
newArray.push(lookupObject[i]) ;
}
return newArray ;
}

ผล
Logs
[ 01 ] uniqueArray is:
[ {"type":"LICENSE","licenseNum":"10849","state":"CA"} ,
{"type":"LICENSE","licenseNum":"12345","state":"NM"} ,
{"type":"LICENSE","licenseNum":"A7846","state":"CA"} ,
{"type":"LICENSE","licenseNum":"B7037","state":"WA"} ]

บททขีริ่ 9 : เทคนรคตลัวแปรวลัตถคุ 111


9.5. กรองตลัวแปรวลัตถถุทคีที่ซสซสำ โดยใชค้ 1 คคียย์ - Map
โคค้ด
function callFunction(){
let person = [ { name : "john" } ,
{ name : "jane" } ,
{ name : "imelda" } ,
{ name : "john" } ] ;
Logger.log(removeDuplicates(person, item => item.name)) ;
// ผล : [{name=john}, {name=jane}, {name=imelda}]
}
function removeDuplicates(data, key) {
return [ ...new Map(data.map(item => [key(item), item])).values() ]
}

9.6. กรองวลัตถถุตสำมคคียย์ทคีที่ระบถุ
https://codereview.stackexchange.com/questions/79384/quickly-filter-an-object-by-keys
กรองคยู่สำในคคียลทคีงื่ระบถ
function testObj() {
const obj = {
"sl_0_v_1":["SLIDES_API1884450033_0", "พระเจช้าทรงเปป็นทขีริ่ลขีนี้ภลัย"] ,
"sl_1_v_2":["SLIDES_API1884450033_5", "พระเจช้าทรงเปป็นทขีริ่ลขีนี้ภลัย"] ,
"sl_2_v_3":["SLIDES_API1884450033_10", "พระเจช้าทรงเปป็นทขีริ่ลขีนี้ภลัย"] ,
"sl_3_v_1":["SLIDES_API1884450033_15", "จรตวรญญาณขช้ากระหาย"] ,
"sl_4_v_2":["SLIDES_API1884450033_20", "จรตวรญญาณขช้ากระหาย"] ,
}
// เอาเฉพาะคขียต์ทขีริ่มขี _v_1
const fil = Object.keys(obj).filter( (kfil) => /_v_1/s.test(kfil)) ;
// Logger.log(fil) ; // [sl_0_v_1, sl_3_v_1]
var valfil = filterObjByKeys(obj,fil) ;
Logger.log(valfil) ;
// ผล : { sl_0_v_1=[SLIDES_API1884450033_0, พระเจช้าทรงเปป็นทขีริ่ลขีนี้ภลัย] ,
sl_3_v_1=[SLIDES_API1884450033_15, จรตวรญญาณขช้ากระหาย] }
function filterObjByKeys(objdata,arr1dim) {
// accepted = ['sl_0_v_1', 'sl_3_v_1']
var result = {} ;
for (var key in objdata){
if (arr1dim.indexOf(key) > -1)
result[key] = objdata[key] ;
}
return result ;
}

112 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


บททขีที่ 10
เงงที่อนไขและลลูป
10.1. if – else if - else
JavaScript if else and else if
https://www.w3schools.com/js/js_if_else.asp
if, else if, else ใชค้สรค้สำงทสำงเลงอกในกสำรทสสำโคค้ดตสำมเงงงื่อนไข เชยู่น ถค้สำคยู่สำเปป็น + ทสสำโคค้ดในบลก็อคนคีซ แตยู่ถค้สำ
เปป็น – ทสสำอคีกบลก็อคหนถึงื่ง เปป็นตค้น
10.1.ก.) รยปแบบของ if

if (condition) { // condition เปป็น บบูลลขีนคมืนคค่า true/false


// โคช้ด – ทกาโคช้ดในบลก็อคนขีนี้ หากเงมืริ่อนไขเปป็น true ;
}

ตรวอยม่สำง
function myFunction() {
var num = 51 ;
if(num > 50) { // ถช้ามากกวค่า 50
Logger.log("คะแนนของคจุณครอ " + num + " : ผยู่าน") ; // ทกาบรรทลัดนขีนี้
} // End if
}

10.1.ข.) รยปแบบของ if – else

if (condition) {
// โคช้ด หากเงมืริ่อนไข condition เปป็น true ;
} else {
// โคช้ด หากเงมืริ่อนไข condition เปป็นอยค่างอมืริ่นๆ(false) ;
}

ตรวอยม่สำง
function myFunction() {
var num = 49.5 ;
if(num > 50 ) {
Logger.log("คะแนนของคจุณครอ " + num + " : ผยู่าน") ;
} else {
Logger.log("คะแนนของคจุณครอ " + num + " : ตก") ; // ทกาบรรทลัดนขีนี้
} // End if
}

114 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


10.1.ค.) รยปแบบของ if – else if - else

if (condition1) {
// โคค้ด หากเงรอที่ นไข condition1 เปป็น true ;
} else if (condition2) {
// โคค้ด หากเงรอที่ นไข condition1 เปป็น false แตยู่ condition2 เปป็น true ;
} else {
// โคค้ด หากเงรอที่ นไข condition1 เปป็น false แตยู่ condition2 เปป็น false ;
}

ตรวอยม่สำง - else if ใชค้ซค้อนกลันไดค้หลสำยตลัว

function myFunction() {
var num = 62;
if(num > 80 ) {
Logger.log("คะแนนของคจุณครอ " + num + " : A") ;
} else if (num > 70 ){
Logger.log("คะแนนของคจุณครอ " + num + " : B") ;
} else if (num > 60 ){
Logger.log("คะแนนของคจุณครอ " + num + " : C") ; // ทกาบรรทลัดนขีนี้
} else {
Logger.log("คะแนนของคจุณครอ " + num + " : F") ;
}
}

10.2. switch
JavaScript Switch Statement
https://www.w3schools.com/js/js_switch.asp
switch ใชค้งสำนคลค้สำย if – else if – else ใชค้ทสสำบลก็อคของโคค้ดตสำมเงงงื่อนไข
โครงสรค้สำงของ switch
expression เปป็นตลัวทคีงื่ใชค้ประเมพินวยู่สำจะไปลง case ไหน เชยู่นถค้สำ expression คงนคยู่สำกลลับมสำเปป็น 2 จะไป
ทสสำ case 2 : (โคค้ด) เปป็นตค้น หสำกไมยู่มคคี ยู่สำทคีงื่แมทเลย บรรทลัด default จะทสสำงสำน
หลลังจบ case จะปปิด case ดค้วย คสสำสลังื่ง break ;
switch(expression) {
case x :
// code block
break ;
case y :
// code block
break ;
default :
// ถช้าไมค่มขีทขีริ่ตรงกลับ Case รลันโคช้ดทขีริ่บลก็อคนขีนี้
}

บททขีริ่ 10 : เงมืริ่อนไขและลบูป 115


ตรวอยม่สำง
function swtichTest() {
var myVar ;
switch (2) {
case 0 : myVar= "ศยนยล" ; break ;
case 1 : myVar= "หนนที่ง" ; break ;
case 2 : myVar= "สอง" ; break ;
default : myVar= "ไมยู่รยค้" ;
}
Logger.log(myVar) ;
}

ตรวอยม่สำง
function swtichTest() {
var day ;
switch (new Date().getDay()) { // คมืนคค่ากลลับมาเปป็น 0-6
case 0 : day= "Sunday" ; break ;
case 1 : day= "Monday" ; break ;
case 2 : day= "Tuesday" ; break ;
case 3 : day= "Wednesday" ; break ;
case 4 : day= "Thursday" ; break ;
case 5 : day= "Friday" ; break ;
case 6 : day= "Saturday" ;
}
Logger.log(day) ;
}

10.3. for
JavaScript For Loop
https://www.w3schools.com/js/js_loop_for.asp
for เปป็นคสสำสลังื่งลยป ใชค้วนรอบเพงงื่อทสสำโคค้ดๆซสซสำ

โครงสรค้สำง
for (statement 1 ; statement 2 ; statement 3) {
// โคช้ด
}

Statement 1 : ทสสำครลัซงเดคียว กยู่อนเขค้สำไปทสสำโคค้ดในบลก็อค for


Statement 2 : เงงงื่อนไขทคีงื่จะเขค้สำไปทสสำโคค้ดในบลก็อค for – ถค้สำยลังจรพิงทสสำตยู่อไปเรงงื่อยๆ
Statement 3 : ทสสำหลลังจสำกโคค้ดในบลก็อค for ทสสำแลค้ว จะมสำทสสำ statement3 ตยู่อ แลค้วไปตรวจสอบ
เงงงื่อนไขใน statment2 วยู่สำยลังจรพิงอยยยู่หรงอไมยู่

116 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำงททที่ 1
ทสสำโคค้ดครลัซงแรก กก็คงอ i = 0, ครลัซงทคีงื่ 2 i = 1 , ครลัซงทคีงื่ 3 i = 2 และเมงงื่อ i = 3 อยยยู่นอกเงงงื่อนไขใน
statement2 จถึงออกจสำกลยป for ไปโดยไมยู่ทสสำโคค้ดเมงงื่อ i = 3

function forTest1() {
var text = "" ;
for (i = 0 ; i < 3 ; i++) {
text += "The number is " + i + "<br>" ;
// หรมือ text = text + "The number is " + i + "<br>" ;
} // End for
Logger.log(text) ;
// พรมพต์ : The number is 0<br>The number is 1<br>The number is 2<br>
// i=0 i=1 i=2
}

หมสำยเหตถุ 1 : เครงงื่องหมสำย += กก็คงอ เอสำขค้อควสำมดค้สำนขวสำมสำใสยู่ในตลัวแปร Text ดค้สำนซค้สำย ลยป for จะ


ทสสำใหค้ขค้อควสำมสะสมกลันไปเรงงื่อยๆ
หมสำยเหตถุ 2 : i++ กก็คงอ i=i+1 เปป็นกสำรเพพิงื่มคยู่สำใหค้ i ทคีละ 1
วพิธคีกสำรใชค้ลยป for พลพิกแพลงไดค้มสำก เชยู่น ใสยู่หลสำยคสสำสลังื่งลงใน statement เดคียว หรงอ เวค้นบสำง statement
กก็ไดค้ เปป็นตค้น
ตรวอยม่สำงททที่ 2
statement1 มคีกสำรกสสำหนดคยู่สำของตลัวแปรหลสำยตลัว ขลัซนดค้วย " , " (คอมมค่า) สลังเกตถวสำยู่ จบ statement1 ดค้วย
เครงงื่องหมสำย " ; " (เซมรคอลค่อน)

function forTest2() {
var cars = [ "BMW", "Volvo", "Saab", "Ford" ] ;
var i, len, text ;
for (i = 0, len = cars.length, text = "" ; i < len ; i++) {
// statement1
text += cars[i] + "<br>" ;
} // End for
Logger.log(text) ; // พรมพต์ : BMW<br>Volvo<br>Saab<br>Ford<br>
}

บททขีริ่ 10 : เงมืริ่อนไขและลบูป 117


ตรวอยม่สำงททที่ 3
ไมยู่ระบถ statement 1 และ 3 แตยู่ใชค้วธพิ คีกสสำหนดไวค้นอก for หรงอ โคค้ดดค้สำนใน for
function forLoop() {
var cars = ["BMW" , "Volvo" , "Saab" , "Ford" ] ;
var i = 0 , text = "" ;
var len = cars.length ;
for ( ; i < len ; ) {
text += cars[i] + "<br>" ;
i++ ;
} // End for
Logger.log(text) ;
// พรมพต์ : BMW<br>Volvo<br>Saab<br>Ford<br>
}

10.4. for in
JavaScript For Loop
https://www.w3schools.com/js/js_loop_for.asp
for in ใชค้กลับตลัวแปรอก๊อบเจก็กตล เพงงื่อวนลยป สยู่ง key ทคีละตลัว เขค้สำไปเปป็นวลัตถถดพิบใหค้กลับโคค้ดใน for

ตรวอยม่สำงททที่ 1

function forIn_1() {
var oPerson = {
fname : "John",
lname : "Doe",
age : 25
};
var tText = "" ;
var x ;
for (x in oPerson) {
tText += oPerson[x] + " " ;
} // End - for/In
Logger.log(tText) ; // พรมพต์ : John Doe 25
}

118 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำงททที่ 2
เอสำตลัวอยยู่สำงทคีงื่ 1 มสำปรลับแกค้ อธพิบสำยใหค้กระจยู่สำงยพิงื่งขถึซนวยู่สำ x คงอคยู่สำอะไร - x กก็คงอ key ทคีงื่ถยกสยู่งเขค้สำไป

function forIn_2() {
var oPerson = {
fname : "John" ,
lname : "Doe" ,
age : 25
};
var tText = "" ;
var x ;
for (x in oPerson) {
tText += oPerson[x]+" ";
Logger.log(x) ; // x คมือ Key ของ Object
Logger.log(tText) ; // tText เกก็บ Value ของ Key
} // End For In
}

ผล

Logs
[01] fname // Key 1
[02] John // Value 1
[03] lname // Key 2
[04] Doe // Value 2
[05] age // Key 3
[06] 25 // Value 3

ตรวอยม่สำงททที่ 3 – ใชค้ var [ key , val ] ใสยู่ลงใน for/in ไดค้ เพงงื่อวนลยปจลับ keys หรงอ values

function forIn_3() {
var oPerson = {
fname : "John",
lname : "Doe",
age : 25
};
for (var [ key , val ] in oPerson) {
Logger.log(key) ;
Logger.log(val) ;
} // End For In
}

บททขีริ่ 10 : เงมืริ่อนไขและลบูป 119


10.5. for of
JavaScript for/of Statement - https://www.w3schools.com/jsref/jsref_forof.asp
ใชค้วนลยปเขค้สำไปในคยู่สำของวลัตถถ ทคีงื่สสำมสำรถวนลยปเขค้สำไปไดค้ ไมยู่วยู่สำจะเปป็นอสำเรยล ขค้อควสำม หรงอ อก๊อบเจก็กตล
เปป็นตค้น
รยปแบบกสำรใชค้งสำน
for (variable of iterable) {
// code
}

ตรวอยม่สำงททที่ 1
var cars = [ 'BMW', 'Volvo', 'Mini'] ;
var x ;
for (x of cars) {
Logger.log(x) ;
}

ผล
Logs
[ ] BMW
[ ] Volvo
[ ] Mini

ตรวอยม่สำงททที่ 2
var txt = 'AppsScript' ;
var x ;
for (x of txt) {
Logger.log(x) ;
}

ผล
Logs
[]A
[]p
[]p
[]s
[]S
[]c
[]r
[]i
[]p
[]t

120 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


10.6. while
JavaScript While Loop
https://www.w3schools.com/js/js_loop_while.asp
while เปป็นคสสำสลังื่งลยปเชยู่นเดคียวกลับ for โดยจะทสสำโคค้ดทคีงื่อยยยู่ใน while ไปเรงงื่อยๆ ตรสำบทคีงื่เงงงื่อนไขของ while
เปป็นจรพิง รยปแบบกสำรใชค้งสำนดลังตยู่อไปนคีซ

while (condition) {
// โคช้ดทขีริ่จะถบูกดกาเนรนการ
}

ตรวอยม่สำงททที่ 1
function while_1() {
var text = "" ;
var i = 0 ;
while ( i < 10 ) {
text += "The number is " + i + " ." ;
i++ ;
} // End while
Logger.log(text) ;
}

ผล

Logs
[01] The number is 0 .The number is 1 .The number is 2 .The number is 3 .The
number is 4 .The number is 5 .The number is 6 .The number is 7 .The number
is 8 .The number is 9 .

10.7. do while
JavaScript do/while Statement
https://www.w3schools.com/jsref/jsref_dowhile.asp
do while จะทสสำโคค้ดทคีงื่อยยใยู่ นบลก็อค 1 ครลัซงกยู่อน จสำกนลัซนจถึงเชก็คเงงงื่อนไขทคีงื่ while และจะทสสำโคค้ดทคีงื่อยยยู่ในบลก็อค
ไปเรงงื่อยๆ ตรสำบทคีงื่เงงงื่อนไขเปป็นจรพิง
รยปแบบกสำรใชค้งสำน do while ดลังตยู่อไปนคีซ
do {
// โคช้ดทขีริ่จะถบูกดกาเนรนการ
} while (condition)

บททขีริ่ 10 : เงมืริ่อนไขและลบูป 121


ตรวอยม่สำง
function DoWhile_1() {
var text = "" ;
var i = 11 ;
do {
text += "The number is " + i + ". " ;
i-- ;
} while(i >= 0) ;
Logger.log(text) ;
}

ผล
Logs
[01] The number is 11. The number is 10. The number is 9. The number is 8. The
number is 7. The number is 6. The number is 5. The number is 4. The number is 3.
The number is 2. The number is 1. The number is 0.

10.8. try catch throw finally

10.8.ก.) try และ catch

JavaScript Errors - Throw and Try to Catch


https://www.w3schools.com/js/js_errors.asp
try ใชค้ทดสอบโคค้ดขณะประมวลผล
catch ใชค้จดลั กสำรกลับ Error กรณคีบลก็อค try เกพิด Error

try {
// Block of code to try
}
catch(err) {
// Block of code to handle errors
}

ตรวอยม่สำง

function myFunction() {
adddlert("Welcome guest!") ; // ไมค่มขีฟฟังกต์ชนลัริ่ ชมืริ่อ adddlert
// เกรด Error ระบบไมค่ไปตค่อ
}

122 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


แกค้เปป็นแบบนคีซ เพงงื่อปป้องกลันกสำรเกพิด Error แลค้วโปรแกรมคค้สำง
function myFunction() {
try {
adddlert("Welcome guest!") ;
}
catch(err) { // Error ถบูกสค่งมาใหช้ catch
Logger.log(err.toString()) ; // จลับ Error มา Logs ดบู
// ---> ออกจาก Catch แลช้วทกาโคช้ดตค่อไป
}
Logger.log('Keep going') ; // ทกาตค่อ ****
}

ผล

Logs
[ ] ReferenceError: "adddlert" is not defined. (ไมค่มขีฟฟังกต์ชนลัริ่ adddlert )
[ ] Keep going

10.8.ข.) throw

throw ใชค้ในบลก็อค try (ทคีงื่องงื่นกก็ใชค้ไดค้) ใชค้สรค้สำง Error เอง และขค้สำงเปป็น Error ออกมสำ เหมสำะมสำกกลับ
กสำรนสสำไปทสสำ Validation

// รลับคค่า x 5-10 เทค่านลันี้น ถช้าใสค่เปป็นอยค่างอมืริ่นจะ catch error ออกมา


function myFunction() {
var x = 'dddd' ;
try {
if(x == "") throw "empty" ; // ถช้า x เปป็นคค่าวค่าง
if(isNaN(x)) throw "not a number" ; // ถช้า x ไมค่ใชค่ตลัวเลข
x = Number(x) ; // แปลง x เปป็นตลัวเลข
if(x < 5) throw "too low" ; // ถช้า x นช้อยกวค่า 5
if(x > 10) throw "too high" ; // ถช้า x มากกวค่า 10
}
catch(err) {
Logger.log("Input is " + err) ; // Input is not a number
}
}

ผล

Logs
[ ] Input is not a number

บททขีริ่ 10 : เงมืริ่อนไขและลบูป 123


10.8.ค.) finally
finally ใชค้ทสสำโคค้ดตยู่อจสำก try และ catch

// รลับคค่า x 5-10 เทค่านลันี้น ถช้าใสค่เปป็นอยค่างอมืริ่นจะ catch error ออกมา


function myFunction() {
var x = 'dddd' ;
try {
if( x == "") throw "empty" ;
if( isNaN(x) ) throw "not a number" ;
x = Number(x) ;
if( x < 5) throw "too low" ;
if( x > 10) throw "too high" ;
}
catch(err) {
Logger.log("Input is " + err) ; // Input is not a number
}
finally {
x=5;
Logger.log(x) ;
}
}

ผล

Logs
[ ] Input is not a number
[ ] 5.0

124 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


บททขีที่ 11
อาเรยร์
11.1. อสำเรยย์ครืออะไร
อาเรยล(Array) เปป็นขค้อมยลแบบกค้อน มคีสมสำชพิกในกค้อนขค้อมยลไดค้หลสำยตลัว เกก็บขค้อมยลแบบมคีมพิตพิ เปป็น
เสค้น(1 มพิต)พิ เปป็นตสำรสำง(2 มพิต)พิ เปป็นตค้น
อสำเรยพ์ใชค้บม่อยมสำกในกสำรเขทยนโคค้ด โดยเฉพสำะกสำรทสสำงสำนกรบ Google Sheets ผมูค้เขทยนจนงแยกออกมสำ
เปป็นบทใหญม่

11.2. พรืซนฐสำนขค้อมมูลชนพดอสำเรยย์
สมสำชพิกในอสำเรยลเกก็บไวค้ในวงเลก็บ [ ] เชยู่น

var fruit = [ 'Apple' , 'Banana' , 'Pear' , 'Strawberry' ] ;

ขค้สำงตค้นเปป็น อสำเรยพ์ 1 มพิตพิ หรงอ อสำเรยพ์แบบเสค้น 1 แถว


เรสำสสำมสำรถอค้สำงอพิงตสสำแหนยู่งกสำรเกก็บขค้อมยลโดยระบถตลัวเลขลงไปใน [ ] หรงอ เรทยกวม่สำดรรชนทตสสำแหนม่ง เพงงื่อ
ดถึงสมสำชพิกในอสำเรยลออกมสำใชค้ เชยู่น fruitsArray[0] กก็คงอ Apple
ตรวอยม่สำง

function arrayFunction() {
// สรช้างตลัวแปรอาเรยต์วค่างๆ
var newArray = [] ;
// ใสค่ขช้อมบูลลงในอาเรยต์ 0 1 2 3
var fruitsArray = [ 'Apple' , 'Banana' , 'Pear' , 'Strawberry' ] ;
Logger.log(fruitsArray) ; // พรมพต์ : [Apple, Banana, Pear, Strawberry]
// ลกาดลับขช้อมบูลในอาเรยต์เรรริ่มจาก 0
// เขช้าถจึงขช้อมบูลในอาเรยต์ไดช้โดยใชช้สลัญลลักษณต์ดลังนขีนี้
Logger.log(fruitsArray[0]) ; // พรมพต์ : Apple
Logger.log(fruitsArray[1]) ; // พรมพต์ : Banana
Logger.log(fruitsArray[2]) ; // พรมพต์ : Pear
Logger.log(fruitsArray[3]) ; // พรมพต์ : Strawberry
Logger.log(fruitsArray[4]) ; // พพิมพล : undefined (ไมค่มขีดรรชนขีลกาดลับทขีริ่ 4)
}

11.3. อสำเรยย์ 2 มพตพ


อสำเรยพ์ 2 มพิตพิ ในระบบของ Google Apps Script เรสำจะเขคียนในลลักษณะ อสำเรยพ์แบบเสค้นในอสำเรยพ์แบบ
เสค้น ซถึงื่งสสำมสำรถเขคียนไดค้ดลังนคีซ [ [ , ] , [ , ] , [ , ] ]

126 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


11.3.ก.) การเขทยนอาเรยล 2 มพิตพิ
ยกตลัวอยยู่สำง
var Arr2dim = [ ["Linda",27] , ["Lisa",35] , ["John",42] ] ;

หรงอเขคียนแบบนคีซ เพงงื่อใหค้เขค้สำใจวยู่สำมคีกคีงื่แถว กคีงื่คอลลัมนล


var Arr2dim = [ // คอลลัมนต์ทขีริ่ 1 // คอลลัมนต์ทขีริ่ 2
[ "Linda" , 27 ] , // แถวทขีริ่ 1
[ "Lisa" , 35 ] , // แถวทขีริ่ 2
[ "John" , 42 ] // แถวทขีริ่ 3
];

อสำเรยลขค้สำงตค้นมคี 3 แถว 2 คอลลัมนล


11.3.ข.) การเขค้าถนงสมาชพิกในอาเรยล 2 มพิตพิ
Arr2dim[0] = อสำเรยลเสค้นแรก กซ็ครือ ["Linda",27]
Arr2dim[0][0] = อสำเรยลเสค้นแรก สมสำชพิกตลัวแรก กซ็ครือ Linda
function arrayFunction() {
var Arr2dim = [
["Linda", 27] , // Arr2dim[0] กก็คมือ อาเรยต์เสช้นนขีนี้
["Lisa", 35] , // Arr2dim[1] กก็คอมื อาเรยต์เสช้นนขีนี้
["John", 42] // Arr2dim[2] กก็คมือ อาเรยต์เสช้นนขีนี้
];
Logger.log(Arr2dim); // พรมพต์ : [ ["Linda",27] , ["Lisa",35] , ["John",42] ]
Logger.log(Arr2dim[0]); // พรมพต์ : ["Linda",27]
Logger.log(Arr2dim[0][0]); // พรมพต์ : Linda
}

11.3.ค.) การนตับจสานวนสมาชพิกในอาเรยล
กสำรนลับจสสำนวนสมสำชพิกในอสำเรยลใชค้ ทสสำไดค้โดยใชค้คถณสมบลัตพิ length ของอสำเรยล
ตรวอยม่สำง - กรณคี 1 มพิตพิ
var fruitsArray = [ 'Apple' , 'Banana' , 'Pear' , 'Strawberry' ] ;
Logger.log(fruitsArray.length) ; // พรมพต์ : 4

ตรวอยม่สำง - กรณคี 2 มพิตพิ


function arrayFunction() {
var Arr2dim = [ ["Linda", 27] ,
["Lisa", 35] ,
["John", 42] ] ;
Logger.log(Arr2dim.length) ; // พรมพต์ : 3 – เสช้นนอกมขีสมาชรก 3
Logger.log(Arr2dim[0].length) ; // พรมพต์ : 2 – เสช้นใน(ตลัวแรก - 0) มขีสมาชรก 2 ตลัว
Logger.log(Arr2dim.length * Arr2dim[0].length) ; // พรมพต์ : 6 – สมาชรกทลันี้งหมด
}

บททขีริ่ 11 : อาเรยต์ 127


11.4. Spread operator (3 จถุด) - Chrome V8
JavaScript | Spread Operator
https://www.geeksforgeeks.org/javascript-spread-operator/
Spread operator ใชค้วนลยป ณ ทคีงื่เรคียกใชค้ เพงงื่อดถึงเฉพสำะสมสำชพิกในอสำเรยล(หรงออก๊อบเจก็กตล) มสำประมวลผล

รยปแบบกสำรใชค้งสำน

var variablename1 = [...array] ;

ตรวอยม่สำงททที่ 1 – ใชค้รวมอสำเรยล
// ใชช้ concat()
let arr = [ 1 ,2 ,3 ] ;
let arr2 = [ 4 ,5 ] ;
arr = arr.concat(arr2) ;
Logger.log(arr) ; // [ 1 , 2 , 3 , 4 , 5 ]
// ใชช้ … เอาเฉพาะสมาชรกของอาเรยต์มา
let arr3 = [ 6 ,7 ,8 ] ;
let arr4 = [ 9 ,10 ] ;
arr3 = [...arr3 , ...arr4] ;
Logger.log(arr3) ; // [ 6 , 7 , 8 , 9 , 10 ]

ตรวอยม่สำงททที่ 2 – ใชค้กก๊อปปปปี้ หรงอ ถยู่สำยโอนคยู่สำของอสำเรยล


// ใชช้ =
let arr = [ 'a' , 'b' , 'c' ] ;
let arr2 = arr ;
arr2.push('d') ; // เพรริ่มสมาชรกลงในอาเรยต์ arr2
Logger.log(arr2) ; // [a,b,c,d]
Logger.log(arr) ; // [a,b,c,d] - มขีผลกลับอาเรยต์ตลันี้งตช้นดช้วย (arr)
// ใชช้ ...
let arr3 = [ 'a' , 'b' , 'c' ] ;
let arr4 = [...arr3] ;
arr4.push('d') ; // เพรริ่มสมาชรกลงในอาเรยต์ arr2
Logger.log(arr4) ; // [a,b,c,d]
Logger.log(arr3) ; // [a,b,c] - ไมค่มผขี ลกลับอาเรยต์ตลันี้งตช้นดช้วย (arr3)

128 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำงททที่ 3 – ใชค้ขยสำยสมสำชพิก อสำรเยลปกตพิสสำมสำรถใชค้ push, splice หรงอ unshift ไดค้อยยยู่แลค้ว แตยู่หสำกใชค้
Spread operators จะมคีประเดก็นเรงงื่องมพิตพิของอสำเรยล ทคีงื่นยู่สำสนใจ

// ใชช้การปป้อนสมาชรกเปป็ฯอาเรยต์ลงไปตรง
let arr = ['a','b'] ;
let arr2 = [arr,'c','d'] ;
Logger.log(arr2) ; // [ [ 'a', 'b' ], 'c', 'd' ]
// ใชช้ ...
let arr3 = ['a','b'] ;
let arr4 = [...arr,'c','d'] ;
Logger.log(arr4) ; // [ 'a', 'b', 'c', 'd' ]

ตรวอยม่สำงททที่ 4 – ใชค้ถยู่สำยโอนสมสำชพิกในอสำเรยล แบบสมสำชพิกตลัวสถดทค้สำย เกก็บสมสำชพิกทคีงื่เหลงอทลัซงหมด


let arr = [ "A" , "B" , "C" , "D" , 25 ]
let [ x , y , ...z ] = arr // รบูปแบบการใชช้ Array deconstructing
Logger.log(x) // [ 'A' ]
Logger.log(y) // [ 'B' ]
Logger.log(z) // [ 'C', 'D', 25 ]

ตรวอยม่สำงททที่ 5 – ใชค้คสสำนวณในกค้อนอสำเรยล
// ใชช้ Math กลับกช้อนอาเรยต์ตรงๆไมค่ไดช้
let arr = [ 1 , 2 , 3 , -1 ] ;
Logger.log(Math.min(arr)) ; // NaN - ตช้องวนลบูปเขช้าไปดจึงสมาชรกออกมาคกานวณ
// ใชช้ ...
let arr2 = [ 1 , 2 , 3 , -1 ] ;
console.log(Math.min(...arr2)) ; // -1

11.5. Rest parameter – Chrome V8


JavaScript | Rest parameter
https://www.geeksforgeeks.org/javascript-rest-operator/?ref=lbp
Rest parameter เปป็นวพิธคีทสำงออกสสสำหรลับกสำรสยู่งพสำรสำมพิเตอรลไปประมวลผลในฟฝังกลชลังื่น อนถญสำตใหค้เรสำไมยู่
ตค้องกสสำหนดจสสำนวนของพสำรสำมพิเตอรล เรสำสสำมสำรถสยู่งจสสำนวนพสำรมพิเตอรลกคีงื่ตลัวไปประมวลผลกก็ไดค้
รยปแบบกสำรใชค้งสำน
//... is the rest parameter
function functionname[...parameters]{
// statement ;
}

บททขีริ่ 11 : อาเรยต์ 129


ตรวอยม่สำงททที่ 1
// ไมค่ไดช้ใชช้ Rest parameter
function fun(a, b){
return a + b ;
}
Logger.log(fun(1, 2)) ; // 3
Logger.log(fun(1, 2, 3, 4, 5)) ; // 3 – สค่งพารามรเตอรต์ไป 5 แตค่ใชช้แคค่ 2 ตลัว
// ใชช้ …
function fun2(...input){ // คลช้ายกลับสค่งพารามรเตอรต์เปป็นกช้อนอาเรยต์ แลช้วใชช้ลบูปวนเขช้าไป
let sum = 0 ; // เพขียงแตค่ไมค่ตช้องกกาหนดมรตขร องอาเรยต์
for(let i of input){
sum += i ;
}
return sum ;
}
Logger.log(fun2(1, 2)) ; // 3
Logger.log(fun2(1, 2, 3)) ; // 6
Logger.log(fun2(1 ,2, 3, 4, 5)) ; // 15

ตรวอยม่สำงททที่ 2
function fun(a,b,...c){
Logger.log(`${a} ${b}`) ; // Mukul Latiyan
Logger.log(c) ; // [ 'Lionel', 'Messi', 'Barcelona' ]
Logger.log(c[0]) ; // Lionel
Logger.log(c.length) ; // 3
Logger.log(c.indexOf('Lionel')) ; // 0
}
// a b c d e
fun('Mukul','Latiyan','Lionel','Messi','Barcelona') ;

11.6. Array destructuring – Chrome V8


Array destructuring
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

Array destructuring กก็คงอ กสำรดถึงสมสำชพิกของอสำเรยลไปใชค้

ตรวอยม่สำงททที่ 1 - พงซนฐสำน

const foo = ['one', 'two', 'three'] ;


const [red, yellow, green] = foo ;
Logger.log(red) ; // "one"
Logger.log(yellow) ; // "two"
Logger.log(green) ; // "three"

130 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำงททที่ 2 – มคีกสำรกสสำหนดคยู่สำ Default ไวค้ จสำกนลัซนกสสำหนดคยู่สำใหมยู่เปป็นบสำงตลัว

let a, b ;
// Default ของ a กก็คอมื 5 จากนลันี้นกกาหนดคค่าใหมค่กก็คมือ 1
[a=5, b=7] = [1] ;
Logger.log(a) ; // 1
Logger.log(b) ; // 7

บททขีริ่ 11 : อาเรยต์ 131


132 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)
บททขีที่ 12
อาเรยร์เมถอด
12.1. push()
JavaScript Array push() Method
https://www.w3schools.com/jsref/jsref_push.asp
push() ใชค้ใสยู่ขค้อมยลลงในอสำเรยล ณ จถดสถดทค้สำย โดยเขค้สำไปเปลคีงื่ยนแปลงอสำเรยลตลัซงตค้น และคงนคยู่สำกลลับมสำเปป็น
จสสำนวนสมสำชพิกของอสำเรยล
รยปแบบกสำรใชค้งสำน
array.push(item1, item2, ..., itemX)

พสำรสำมพิเตอรล
Parameter Description
item1, ..., itemX (จกาเปป็น) สมาชรกใหมค่ทขีริ่จะเพรมริ่ ลงในอาเรยต์
ตรวอยม่สำง
var fruits1 = [ "Banana" , "Orange" , "Apple" , "Mango"] ;
// push สมาชรกเขช้าไป
fruits1.push("Kiwi" , "Lemon" , "Pineapple") ;
// Logs ดบูอกขี ครลันี้ง จะพบวค่าสมาชรกเปลขียริ่ นไป
Logger.log(fruits1) ; // [Banana, Orange, Apple, Mango, Kiwi, Lemon, Pineapple]

var fruits2 = [ "Banana" , "Orange" , "Apple" , "Mango"] ;


// push สมาชรกเชช้าไป - แตค่ฝากไวช้ในตลัวแปรใหมค่ดช้วย
var newfruits2 = fruits2.push("Kiwi" , "Lemon" , "Pineapple") ;
// ตลัวแปรใหมค่เกก็บ จกานวนสมาชรก ไมค่ใชช้อาเรยต์ทขีริ่เปลขียริ่ นไป ****
Logger.log(newfruits2) ; // 7.0

12.2. unshift()
JavaScript Array unshift() Method
https://www.w3schools.com/jsref/jsref_unshift.asp
unshift() ใชค้ใสยู่ขค้อมยลลงในอสำเรยล ณ จถดแรก โดยเขค้สำไปเปลคีงื่ยนแปลงอสำเรยลตลัซงตค้น และคงนคยู่สำกลลับมสำเปป็น
จสสำนวนสมสำชพิกของอสำเรยล
รยปแบบกสำรใชค้งสำน
array.unshift(item1, item2, ..., itemX)

พสำรสำมพิเตอรล
Parameter Description
item1, ..., itemX (จกาเปป็น) สมาชรกใหมค่ทขีริ่จะเพรมริ่ ลงในอาเรยต์

134 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำง
var fruits = [ "Banana" , "Orange" , "Apple" , "Mango" ] ;
fruits.unshift("Lemon" , "Pineapple") ;
Logger.log(fruits) ; // [ Lemon, Pineapple, Banana, Orange, Apple, Mango ]

var fruits2 = [ "Banana" , "Orange" , "Apple" , "Mango" ] ;


var newfruits2 = fruits2.unshift("Lemon" , "Pineapple") ;
Logger.log(newfruits2) ; // 6.0

12.3. pop()
JavaScript Array pop() Method
https://www.w3schools.com/jsref/jsref_pop.asp
pop() ใชค้ลบขค้อมยลในอสำเรยล ตลัวทค้สำยสถด และคงนคยู่สำกลลับมสำเปป็นขค้อมยลตลัวนลัซน
รยปแบบกสำรใชค้งสำน
array.pop()

ตลัวอยยู่สำง
var fruits1 = [ "Banana" , "Orange" , "Apple" , "Mango" ] ;
fruits1.pop() ; // เขช้าไปเปลขียริ่ นแปลงอาเรยต์ตลันี้งตช้นดช้วย
Logger.log(fruits1) ; // [ Banana , Orange , Apple ]

var fruits2 = [ "Banana" , "Orange" , "Apple" , "Mango" ] ;


var newfruits2 = fruits2.pop() ;
Logger.log(newfruits2) ; // Mango

12.4. shift()
JavaScript Array shift() Method
https://www.w3schools.com/jsref/jsref_shift.asp
shift() ใชค้ลบขค้อมยลในอสำเรยล ตลัวแรก และคงนคยู่สำกลลับมสำเปป็นขค้อมยลตลัวทคีงื่ถยกลบออก

รยปแบบกสำรใชค้งสำน
array.shift()

บททขีริ่ 12 : อาเรยต์เมถอด 135


ตลัวอยยู่สำง
var fruits1 = [ "Banana" , "Orange" , "Apple" , "Mango" ] ;
fruits1.shift() ; // เขช้าไปเปลขีริ่ยนแปลงอาเรยต์ตลันี้งตช้นดช้วย
Logger.log(fruits1) ; // [ Orange, Apple, Mango ]

var fruits2 = [ "Banana" , "Orange" , "Apple" , "Mango" ] ;


var newfruits2 = fruits2.shift() ;
Logger.log(fruits) ; // Banana

12.5. splice()
JavaScript Array splice() Method
https://www.w3schools.com/jsref/jsref_splice.asp
splice() ใชค้เพพิงื่มหรงอลบ สมสำชพิกในอสำเรยล แบบกสสำหนดตสสำแหนยู่งไดค้ โดยเขค้สำไปเปลคีงื่ยนแปลงอสำเรยลตลัซงตค้น
และ คงนคยู่สำกลลับมสำเปป็นสมสำชพิกทคีงื่ถยกลบ
รยปแบบกสำรใชค้งสำน
array.splice(index, howmany, item1, ....., itemX)

พสำรสำมพิเตอรล
Parameter Description
(ตช้องการ) เลข Integer ระบคุตกาแหนค่งทขีริ่จะลบหรมือแทรกสมาชรก
index
ใชช้เลขลบ เพมืริ่อระบคุตกาแหนค่งจากทช้าย
howmany (ไมค่บลังคลับ) จกานวนสมาชรกทขีริ่จะลบออก (0 = ไมค่ลบ)
item1, ..., itemX (ไมค่บลังคลับ) สมาชรกใหมค่ทขีริ่จะเพรริ่มลงในอาเรยต์ (ไมค่ระบคุ = ไมค่เพรมริ่ )

ตรวอยม่สำงททที่ 1 – หสำกไมยู่ระบถ item จะเปป็นกสำรลบออก ตสำมตสสำแหนยู่งและจสสำนวนทคีรงื่ ะบถ


// ลบ ลบ
var fruits1 = [ "Banana" , "Orange" , "Apple" , "Mango" , "Kiwi" ] ;
fruits1.splice(2, 2) ; // เขช้าไปเปลขียริ่ นแปลงอาเรยต์ตลันี้งตช้นดช้วย
Logger.log(fruits1) ; // [ Banana, Orange, Kiwi ]

var fruits2 = [ "Banana" , "Orange" , "Apple" , "Mango" , "Kiwi" ] ;


var newfruits2 = fruits2.splice(2, 2) ;
Logger.log(newfruits2) ; // ["Apple" , "Mango" ]

136 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำงททที่ 2 – ระบถพสำรสำมพิเตอรล item ดค้วย กก็คงอ สมสำชพิกทคีงื่จะเพพิงื่มลงไป
// 0 1 2 3
var fruits1 = [ "Banana" , "Orange" , "Apple" , "Mango" ] ;
// เรรริ่มดรรนขีตกาแหนค่งทขีริ่ 2 ลบออก 1 ตลัว >> เพรริ่มลงไป 2 ตลัวกก็คมือ "Lemon", "Kiwi"
fruits1.splice(2, 1, "Lemon", "Kiwi") ;
Logger.log(fruits1) ; // [ Banana, Orange, Lemon, Kiwi, Mango ]

var fruits2 = [ "Banana" , "Orange" , "Apple" , "Mango" ] ;


// คมืนคค่าเปป็น แลช้วจลับใสค่ตลัวแปรตลัวใหมค่
var newfruits2 = fruits2.splice(2, 1, "Lemon", "Kiwi") ;
Logger.log(newfruits2) ; // [Apple] – ตลัวทขีริ่ถบูกลบ

12.6. slice()
JavaScript Array Methods - Slicing an Array
https://www.w3schools.com/js/js_array_methods.asp

slice() ใชค้ตลัดสมสำชพิกบสำงสยู่วนของอสำเรยล ไปสรค้สำงอสำเรยลใหมยู่ slice() ไมยู่เขค้สำไปเปลคีงื่ยนแปลงอสำเรยลตลัซงตค้น


ฉะนลัซนใหค้สรค้สำงตลัวแปรมสำรลับผลลลัพธลดค้วย
รยปแบบกสำรใชค้งสำน
array.slice(start, end)

พสำรสำมพิเตอรล
Parameter Description
(ไมค่บลังคลับ) เลข integer ทขีริ่ใชช้ระบคุตกาแหนค่งเรรริ่มการเลมือก
- ตกาแหนค่งแรก เรรริ่มจาก 0
start
- ใชช้เลขลบ เพมืริ่อเลมือกจากดช้านหลลัง
- หากปลค่อยวค่างจะหมายถจึง 0
(ไมค่บลังคลับ) เลข integer ทขีริ่ใชช้ระบคุตกาแหนค่งจบการเลมือก แตค่ไมค่รวมตลัวนขีนี้
end - หากปลค่อยวค่างไวช้ จะเรรริ่มจาก start ไปจนถจึงตลัวสคุดทช้าย
- ใชช้เลขลบ เพมืริ่อเลมือกจากดช้านหลลัง
ตรวอยม่สำง
// 0 1 2 3 4
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"] ;
fruits.slice(3) // ไมค่เขช้าไปเปลขียริ่ นแปลงอาเรยต์ตลันี้งตช้น
// เรรริ่มจากดรรชนขีตกาแหนค่งทขีริ่ 3 ไปจนจบ
var citrus = fruits.slice(3) ; // [ Apple, Mango ]

บททขีริ่ 12 : อาเรยต์เมถอด 137


ตรวอยม่สำงททที่ 2
// 0 1 2 3 4
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"] ;
// เรรริ่มจากดรรชนขีตกาแหนค่งทขีริ่ 1 ไปจนถจึงกค่อนตลัวทขีริ่ 3
var citrus = fruits.slice(1, 3) ; // ["Orange", "Lemon"]

12.7. ตลัวอยม่สำงกสำรใชค้งสำนอสำเรยย์เมถอดกลับอสำเรยย์ 2 มพตพ

อสำเรยล 2 มพิตพิยลังใชค้ push, shift ไดค้ตสำมปกตพิ


ตลัวอยยู่สำง
var Arr2dim = [ ["Linda", 27] ,
["Lisa", 35] ,
["John", 42] ] ;
Arr2dim.push(["Wasan",42]) ;
Logger.log(Arr2dim) ; // พรมพต์ : [ [Linda,27.0], [Lisa,35.0], [John,42.0], [Wasan, 42.0] ]
Arr2dim.pop() ;
Logger.log(Arr2dim) ; // พรมพต์ : [ [Linda,27.0], [Lisa,35.0], [John,42.0] ]
Arr2dim[0].push("179") ;
Logger.log(Arr2dim) ; // พรมพต์ : [ [Linda, 27.0, 179], [Lisa, 35.0], [John, 42.0] ]
// เปลขียริ่ นคค่า
Arr2dim[0][1] = 53 ;
Logger.log(Arr2dim) ; // พรมพต์ : [ [Linda, 53.0, 179], [Lisa, 35.0], [John, 42.0] ]

12.8. join()
JavaScript Array join() Method
https://www.w3schools.com/jsref/jsref_join.asp
ใชค้รวมขค้อมยลในอสำเรยล ใหค้กลสำยเปป็นขค้อมยล String (ขค้อควสำม) กค้อนเดคียวทคีงื่ขลัซนดค้วยเครงงื่องหมสำย , (คอมมยู่า)
หรงอ กสสำหนดตลัวขลัซนไดค้เอง
รยปแบบกสำรใชค้งสำน
array.join(separator)

พสำรสำมพิเตอรล
Parameter Description
separator (เวช้นวค่างไดช้) ตลัวขลันี้น ถช้าปลค่อยวค่างไวช้ จะใชช้ตลัวขลันี้นเปป็นคอมมค่า

138 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตลัวอยยู่สำง

function arrayFunction() {
var arr = [ 'Apple' , 'Banana' , 'Pear' , 'Strawberry' ] ;
var joinArr = arr.join() ;
Logger.log(joinArr) ; // Apple,Banana,Pear,Strawberry
var joinArr2 = arr.join(" - ") ;
Logger.log(joinArr2) ; // Apple - Banana - Pear - Strawberry
}

12.9. concat()
JavaScript Array concat() Method
https://www.w3schools.com/jsref/jsref_concat_array.asp
concat() ใชค้รวมอสำเรยลเขค้สำดค้วยกลัน เมถอดนคีซไมยู่เปลคีงื่ยนแปลงอสำเรยลเดพิม แตยู่จะสรค้สำงอสำเรยลใหมยู่ ฉะนลัซน ใหค้
สรค้สำงตลัวแปรมสำรองรลับผลกสำรรวมอสำเรยลดค้วย
รยปแบบกสำรใชค้งสำน

array1.concat(array2, array3, ..., arrayX)

พสำรสำมพิเตอรล
Parameter Description
array2, array3, ..., arrayX (ตช้องการ) อาเรยต์ทขีริ่จะถบูกรวม

ตรวอยม่สำงททที่ 1 - อสำเรยพ์ 1 มพิตพิ

function testConcat(){
var arr1dim = [37, 39, 42, 46, 11, 33] ;
var moreCcol = ['A', 'B'] ;
arr1dim = arr1dim.concat(moreCcol) ;
Logger.log(arr1dim) ; // [37.0, 39.0, 42.0, 46.0, 11.0, 33.0, A, B]
}

บททขีริ่ 12 : อาเรยต์เมถอด 139


ตรวอยม่สำงททที่ 2 - อสำเรยพ์ 2 มพิตพิ ***
ตลัวอยยู่สำงนคีซใชค้บยู่อยมสำก เมงงื่อเรสำจลับขค้อมยลจสำก Google Sheets มสำไดค้ จะไดค้อสำเรยล 2 มพิตพิมสำ ซถึงื่งจสำกนลัซน เรสำ
อสำจจะลดหรงอเพพิงื่มคอลลัมนลเขค้สำไป
function testArrayB(){
var arr2dim = [ ['A', 39, 12000 ] ,
['B', 46, 42321 ] ,
['C', 65, 22520 ] ] ;
// เพรริ่มสมาชรกตค่อทช้ายทขีละแถว
arr2dim = arr2dim.map(function(row){
// ใชช้ push, unshift กก็ไดช้
return row.concat( ['More column'] ) ;
});
Logger.log(arr2dim) ;
/* [ [A, 39.0, 12000.0, More column] ,
[B, 46.0, 42321.0, More column] ,
[C, 65.0, 22520.0, More column] ] */
}

12.10. indexOf() ***


JavaScript Array indexOf() Method
https://www.w3schools.com/jsref/jsref_indexof_array.asp

ใชค้คค้นหสำในอสำเรยล โดยสยู่งคยู่สำทคีงื่จะคค้นหสำเขค้สำไป โดยจะคงนคยู่สำกลลับมสำเปป็นดรรนคีตสสำแหนยู่งในอสำเรยล เปป็นเลข


0,1,2,3 … แตยู่ถค้สำคยู่สำทคีงื่ใชค้คค้นหสำไมยู่มคีในอสำเรยล จะคงนคยู่สำ -1 กลลับมสำ

รยปแบบกสำรใชค้งสำน

array.indexOf(item, start)

พสำรสำมพิเตอรล
Parameter Description
item (ตช้องการ) ขช้อมบูลทขีใริ่ ชช้คช้นหา
start (ไมค่จกาเปป็น) จคุดเรรริ่มตช้นคช้นหา โดยคค่าลบ จะเรรริ่มนลับตกาแหนค่งและคช้นหาจากดช้านหลลัง

หมสำยเหตถุ : ใชค้บยู่อยมสำกในกสำรคค้นหสำสพิงื่งทคีตงื่ ค้องกสำร ถค้สำคงนคยู่สำมสำเปป็น -1 คงอไมยู่เจอนลังื่นเอง

140 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำงททที่ 1
function arrayFunction() {
var fruits = ["Banana", "Orange", "Apple", "Mango", "Banana", "Orange", "Apple"] ;
// 0 1 2 3 4 5 6
var a = fruits.indexOf("Apple") ;
Logger.log(a) ; // 2
var b = fruits.indexOf("Apple", 4) ; // เรรริ่มคช้นหาทขีริ่ดรรชขีตกาแหนค่งทขีริ่ 4 (Banana)
Logger.log(b) ; // 6
var c = fruits.indexOf("broccoli") ;
Logger.log(c) ; // -1
}

ตรวอยม่สำงททที่ 2 - ขค้อมยลเปป็นเวลสำ ใหค้ใชค้ valueOf แปลงเปป็นมพิลลพิวพินสำทคีกยู่อน เพรสำะรยปแบบกสำรเขคียนวลันทคีใงื่ น


ภสำษสำทคีงื่คนอยู่สำนไดค้ มคีหลสำกหลสำยมสำก

function testIndexOf2() {
var day = new Date("Wed Feb 5 2020 00:00:00 GMT+0700 (Indochina Time)").valueOf()
Logger.log(day.toString()) ; // 1580835600000
var disableDays = [
new Date("Tue Feb 11 2020 00:00:00 GMT+0700 (Indochina Time)").valueOf(),
new Date("Wed Feb 12 2020 00:00:00 GMT+0700 (Indochina Time)").valueOf(),
new Date("Wed Feb 5 2020 00:00:00 GMT+0700 (Indochina Time)").valueOf()
];
// มขี day ใน disableDays สลักตลัวหรมือไมค่
var aaa = disableDays.indexOf(day.valueOf()) > -1 ;
Logger.log(aaa) ; // true
}

12.11. lastIndexOf()
JavaScript Array 6.11. lastIndexOf() Method
https://www.w3schools.com/jsref/jsref_lastindexof_array.asp
คลค้สำยกลับ indexOf() แตยู่กรณคีทคีงื่เจอคยู่สำทคีงื่คค้นหสำหลสำยคยู่สำ จะคงนคยู่สำตลัวสถดทค้สำยในละดลับทคีงื่พบกลลับมสำ
รยปแบบกสำรใชค้งสำน

array.indexOf(item, start)

พสำรสำมพิเตอรล
Parameter Description
item (ตช้องการ) ขช้อมบูลทขีริ่ใชช้คช้นหา
start (ไมค่จกาเปป็น) จคุดเรรริ่มตช้นคช้นหา โดยคค่าลบ จะเรรริ่มนลับตกาแหนค่งและคช้นหาจากดช้านหลลัง

บททขีริ่ 12 : อาเรยต์เมถอด 141


ตรวอยม่สำง
function arrayFunction() {
var fruits = [ "Banana", "Orange", "Apple", "Mango", "Banana", "Orange", "Apple" ] ;
// 0 1 2 3 4 5 6
var a = fruits.lastIndexOf("Apple") ;
Logger.log(a) ; // 6
var b = fruits.lastIndexOf("Apple", 4) ; // เรรริ่มคช้นหาทขีริ่ดรรชขีตกาแหนค่งทขีริ่ 4 (Banana)
Logger.log(b) ; // 2 ( 6-4 )
var c = fruits.lastIndexOf("broccoli") ;
Logger.log(c) ; // -1
}

12.12. reverse()
JavaScript Array reverse() Method
https://www.w3schools.com/jsref/jsref_reverse.asp
ใชค้กลลับตสสำแหนยู่งสมสำชพิกเอสำเรยลจสำกหนค้สำไปหลลัง หลลังไปหนค้สำ
รยปแบบกสำรใชค้งสำน
array.reverse()

ตลัวอยยู่สำง

var fruits = [ "Banana" , "Orange" , "Apple" , "Mango" ] ;


var n = fruits.reverse() ;
Logger.log(n) ; // [Mango, Apple, Orange, Banana]

12.13. includes() - Chrome V8


JavaScript Array includes() Method
https://www.w3schools.com/jsref/jsref_includes_array.asp
ใชค้ตรวจสอบวยู่สำอสำเรยล มคีสมสำชพิกตยู่อไปนคีซหรงอไมยู่ โดยทสสำงสำนแบบ Case-sensitive และจะคงนคยู่สำกลลับมสำ
เปป็น บยลลทน
รยปแบบกสำรใชค้งสำน
array.includes(element, start)

พสำรสำมพิเตอรล
Parameter Description
element (จกาเปป็น) ขช้อมบูลทขีริ่ใชช้คช้นหา
start (ไมค่บลังคลับ) ตกาแหนค่งทขีริ่จะเรรริ่มคช้นหา คค่าปรรยายคมือ 0

142 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำง

function example() {
var fruits = [ "Banana", "Orange", "Apple", "Mango" ] ;
var m = fruits.includes("Banana") ; // true
var n = fruits.includes("Banana", 3) ; // false
}

12.14. toString()
JavaScript Array toString() Method
https://www.w3schools.com/jsref/jsref_tostring_array.asp
คงนคยู่สำสมสำชพิกทลัซงหมดในอสำเรยลกลลับมสำเปป็น String ทคีงื่ขลัซนดค้วย , (คอมมยู่สำ) เมถอดนคีซไมยู่เปลคีงื่ยนแปลงอสำเรยลตลัซง
ตค้น ฉะนลัซนจถึงตค้องสรค้สำงตลัวแปรมสำรลับคยู่สำ
ตรวอยม่สำง
var fruits = ["Banana", "Orange", "Apple", "Mango"] ;
var x = fruits.toString() ; // Banana,Orange,Apple,Mango

12.15. keys()
JavaScript Array keys() Method
https://www.w3schools.com/jsref/jsref_keys.asp
คงนคยู่สำกลลับมสำเปป็ฯอสำรเยลทคีงื่เกก็บดรรชนคีลสสำดลับของอสำเรยลทคีงื่ระบถ
ตลัวอยยู่สำง
var fruits = ["Banana", "Orange", "Apple", "Mango"] ;
var fk = fruits.keys() ; // [0,1,2,3]
for (x of fk) {
Logger.log(x) ; // ดบูผลทขีริ่ Logs –----------------------------- >
}

ผล
Logs
[ ] 0.0
[ ] 1.0
[ ] 2.0
[ ] 3.0

บททขีริ่ 12 : อาเรยต์เมถอด 143


12.16. fill
JavaScript Array fill() Method
https://www.w3schools.com/jsref/jsref_fill.asp
ใชค้กรอกคยู่สำทคีกงื่ สสำหนดลงในอสำเรยล
รยปแบบกสำรใชค้งสำน

array.fill(value, start, end)

พสำรสำมพิเตอรล

Parameter Description
value (จกาเปป็น) คค่าทขีริ่จะเตรมลงในอาเรยต์
start (ไมค่จกาเปป็น) ดรรชนขีลกาดลับในอาเรยต์เรรริ่มตช้น ทขีริ่จะเตรมคค่า
end (ไมค่จกาเปป็น) ดรรชนขีลกาดลับในอาเรยต์สคุดทช้ายเรรริ่มตช้น ทขีริ่จะเตรมคค่า (คค่าปรรยายเปป็น array.length)
ตรวอยม่สำง

var fruits = ["Banana", "Orange", "Apple", "Mango"] ;


fruits.fill("Kiwi") ;
// ผล ["Kiwi", "Kiwi", "Kiwi", "Kiwi"] ;

12.17. Array.from()
JavaScript Array from() Method
https://www.w3schools.com/jsref/jsref_from.asp
Array.from()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
เมถอด Array.from() คงนคยู่สำกลลับมสำเปป็นวลัตถถอสำเรยล จสำกวลัตถถชนพิดองงื่นๆ ตสำมคถณสมบลัตพิ length หรงอ วลัตถถทคีงื่
สสำมสำรถวนลยปเขค้สำไปไดค้ (Iterable object)
รยปแบบกสำรใชค้งสำน
Array.from(object, mapFunction, thisValue)

พสำรสำมพิเตอรล
Parameter Description
object (Required) วลัตถคุทขีริ่จะแปลงไปเปป็นอาเรยต์
mapFunction (Optional) ฟฟังกต์ชนลัริ่ ทขีริ่เรขียกใชช้(เมถอด map) เพมืริ่อทกางานกลับแตค่ละอรเลก็มเมช้นตต์ของอาเรยต์
thisValue (Optional) คค่าทขีใริ่ ชช้ในฐานะวลัตถคุ this เมมืริ่อประมวล mapFunction

144 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำงททที่ 1 : อสำเรยลจสำก String
var myArr = Array.from("ABCDEFG") ;
Logger.log(myArr) ; // [A, B, C, D, E, F, G]

ตรวอยม่สำงททที่ 2 : อสำเรยลจสำก String + ใชค้ฟฝังกลชลังื่นกลับแตยู่ละอพิเลก็มเมค้นตล

var newArr = Array.from([1, 2, 3], x => x + x ) ;


Logger.log(newArr) ; // [2.0, 4.0, 6.0]

ตรวอยม่สำงททที่ 3 : สรค้สำงอสำเรยลจสำกวลัตถถ Set – กรองตลัวซสซสำในอสำเรยล เหลงอแตยู่ตวลั ทคีงื่ Unique ***

const set = new Set(['foo', 'bar', 'baz', 'foo', 'foo']) ;


const newArr = Array.from(set) ;
Logger.log(newArr) ; // [ "foo", "bar", "baz" ]

ตรวอยม่สำงททที่ 4 : อสำเรยลจสำกวลัตถถ Map


const map = new Map([ [ 1, 2 ] ,
[ 2, 4 ] ,
[ 4, 8 ] ]) ;
var ArrFromMap = Array.from(map) ;
Logger.log(ArrFromMap) ; // ผล [[1, 2], [2, 4], [4, 8]]
const mapper = new Map([ [ '1' , 'a' ] ,
[ '2' , 'b' ] ]) ;
var vals = Array.from(mapper.values()) ;
Logger.log(vals) ; // ผล ['a', 'b']
var keys = Array.from(mapper.keys()) ;
Logger.log(keys) ; // ผล ['1', '2']

ตรวอยม่สำงททที่ 5 : อสำเรยลจสำกวลัตถถ arguments ***


( ดยเพพิงื่มเตพิมขค้อ 4.5 วลัตถถ Arguments หนค้สำ 53 )

function f() {
return Array.from(arguments) ;
}
f(1, 2, 3) ; // [1.0, 2.0, 3.0]

บททขีริ่ 12 : อาเรยต์เมถอด 145


146 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)
บททขีที่ 13
อาเรยร์เมถอด
ตระกลูลวนลลูป
13.1. map()
JavaScript Arrays & Map Method Tutorial - Google Apps Script Part 4
https://youtu.be/WA8QotNEVc4?list=PLv9Pf9aNgemvD9NFa86_udt-NWh37efmD

รยปแบบกสำรใชค้งสำน
array.map(function(currentValue, index, arr), thisValue)

พสำรสำมพิเตอรล
Parameter Description
(Required) A function to be run for each element in the array.
Function arguments:
function(currentVal Argument Description
ue, index, arr) currentValue Required. The value of the current element
index Optional. The array index of the current element
arr Optional. The array object the current element belongs to
(Optional) A value to be passed to the function to be used as its "this" value.
thisValue If this parameter is empty, the value "undefined" will be passed as its "this"
value

map() ใชค้สยู่งสมสำชพิกทถกตลัวในอสำเรยล ไปทสสำอะไรสลักอยยู่สำงในฟฝังกลชลังื่น เชยู่น คสสำนวณ , แปะหนค้สำแปะหลลังดค้วย


ขค้อควสำม
กรณทอสำเรยพ์ 1 มพิตพิ สมสำชพิกจะเปป็นคยู่สำโดดๆ แตม่หสำกเปป็นอสำเรยพ์ 2 มพิตพิ สมสำชพิกในอสำเรยลกก็คงอ เสค้นอสำเรยลดค้สำน
ใน
13.1.ก.) map() และ อาเรยล 1 มพิตพิ
โคค้ดดค้สำนลยู่สำง สยู่งสมสำชพิกในอสำเรยลไปทคีละตลัว เพงงื่อใสยู่วงเลก็บครอบ
function mapMethod() {
var arr1dim = [ "Sara" , 24 , "Chaingmai" ] ;
// วนลบูปสค่งสมาชรกในอาเรยต์ไปทกาบางอยค่างในฟฟังกต์ชลัริ่นทขีริ่ระบคุ
var new_arr1dim = arr1dim.map(addBrackets) ;
Logger.log(new_arr1dim) ; // พพิมพล : [ (Sara), (24), (Chaingmai) ]
}
function addBrackets(item) { // item คมือ สมาชรกในอาเรยต์ โดยจะวนลบูปสค่งมาทขีละตลัว
return "(" + item + ")" ; // ใสค่วงเลก็บครอบ
}

148 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


สสำมสำรถ เขคียนโคค้ดโดยเอสำฟฝังกลชลังื่นยลัดลงไปใน map เลยกก็ไดค้ เหมสำะกลับโคค้ดในฟฝังกลชลังื่นทคีงื่ไมยู่ยสำวเกพินไป
function mapMethod() {
var arr1dim = [ "Sara" , 24 , "Chaingmai" ] ;
var new_arr1dim = arr1dim.map(function addXs(item){
return "X" + item + "X" ; // ใสค่ X หนช้าและหลลัง
}) ; // จบ – map
Logger.log(new_arr1dim); // พรมพต์ : [ XSaraX, X24X, XChaingmaiX ]
}

13.1.ข.) map() และ อาเรยล 2 มพิตพิ


กรณคีเปป็นอสำเรยล 2 มพิตพิ สมสำชพิกในอสำเรยลกก็คงอ เสค้นอสำเรยพ์ดค้สำนใน ฉะนลัซนกสำรนสสำไปประมวลผลหรงอกสำรคงน
คยู่สำกลลับมสำ ตค้องทสสำแบบอสำเรยล
ตรวอยม่สำงททที่ 1 นสสำสมสำชพิกทคีงื่เปป็นเสค้นอสำรยล ไปทสสำบสำงอยยู่สำงในฟฝังกลชลังื่น
function mapMethod() {
var arr2dim = [
[ "Linda", 27, "Bangkok" ] , // สมาชรกตลัวทขีริ่ 1
[ "Lisa", 35, "Nontaburi" ] , // สมาชรกตลัวทขีริ่ 2
[ "John", 42, "Petchaboon" ] // สมาชรกตลัวทขีริ่ 3
];
var new_arr2dim = arr2dim.map(doSomething);
Logger.log(new_arr2dim) ; // ดบูผลทขีริ่ Logs –-- >
}
function doSomething(row) {
return [ row[0] , row[1]+1 ,row[2] ] ;
}

ผล – อสำเรยลใหมยู่ มคีตวลั เลขเปลคีงื่ยนไปจสำกอสำเรยลตลัซงตค้น โดยสมสำชพิกทคีงื่เปป็นตลัวเลข ถยกเพพิงื่มคยู่สำไป 1

Logs
[01] [ [Linda, 28.0, Bangkok],
[Lisa, 36.0, Nontaburi],
[John, 43.0, Petchaboon] ]

บททขีริ่ 13 : อาเรยต์เมถอด ตระกบูลวนลบูป 149


ตรวอยม่สำงททที่ 2 เปลคีงื่ยนมพิตพิกสำรคงนคยู่สำ
function mapMethod() {
var arr2dim = [
[ "Linda", 27, "Bangkok" ] , // สมาชรกตลัวทขีริ่ 1
[ "Lisa", 35, "Nontaburi" ] , // สมาชรกตลัวทขีริ่ 2
[ "John", 42, "Petchaboon" ] // สมาชรกตลัวทขีริ่ 3
];
var new_arr2dim = arr2dim.map(doSomething);
Logger.log(new_arr2dim) ;
}
function doSomething(row) {
var textOutput = row[0] + " is from " + row[2] ;
var newAge = row[1] + 1 ;
return [ textOutput , newAge ] ;
}

ผล – ไดค้อสำเรยลขนสำด 3 แถว x2 คอลตัมนล


Logs
[ 01 ] [ [Linda is from Bangkok, 28.0] ,
[Lisa is from Nontaburi, 36.0] ,
[John is from Petchaboon, 43.0] ]

โคค้ดขค้สำงตค้น จลับฟฝังกลชลังื่นยลัดลงใน map กก็ไดค้ ไดค้ผลแบบเดคียวกลัน

function mapMethod() {
var arr2dim = [
["Linda", 27, "Bangkok" ] , // สมาชรกตลัวทขีริ่ 1
["Lisa", 35, "Nontaburi" ] , // สมาชรกตลัวทขีริ่ 2
["John", 42, "Petchaboon" ] // สมาชรกตลัวทขีริ่ 3
];
var new_arr2dim = arr2dim.map(function doSomthing(row) {
var textOutput = row[0] + " is from " + row[2] ;
var newAge = row[1] + 1 ;
return [textOutput , newAge] ;
});
Logger.log(new_arr2dim) ;
}

150 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


13.2. filter()
JavaScript Filter Method Tutorial - Google Sheets Apps Scripts - Array Methods Part 7
https://youtu.be/PT_TDhMhWsE?list=PLv9Pf9aNgemvD9NFa86_udt-NWh37efmD
filter() กสำรใชค้งสำนตสำมชงงื่อ ใชค้กรองขค้อมยลในอสำเรยล โดยทคีงื่เรสำสสำมสำรถเขคียนเงงงื่อนไขกสำรกรองเปป็นฟฝังกลชลังื่นไดค้
เอง
13.2.ก.) ตตัวอยยู่างททที่ 1
ตลัวแปร filterLogic เกก็บฟฝังกลชลังื่น ทคีงื่เปป็นตลัวประมวลกสำรกรอง พรค้อมกลับรลับคยู่สำกลลับมสำดค้วย
function filterArr() {
var arr = [ "txt1" , 4 , 8 , 33 , 2 , "txt2" , 9 ] ;
var new_arr = arr.filter(filterLogic) ;
Logger.log(arr); // พรมพต์ : ["txt1", 4, 8, 33, 2, "txt2", 9]
Logger.log(new_arr); // พรมพต์ : [8.0, 33.0, 9.0] – เฉพาะคค่ามากกวค่า 6 – ขช้อความถบูกตลัดทรนี้ง
} // End function

var filterLogic = function(item) { // ฟฟังกต์ชลัริ่นทขีใริ่ ชช้กรอง


return item > 6 ; // คมืนเฉพาะตลัวทขีริ่มขีคค่ามากกวค่า 6
} // End function

13.2.ข.) ตตัวอยยู่างททที่ 2 – ใสยู่ฟฝังกลชนตัที่ เปป็น Argrument

เพงงื่อใหค้โคค้ดสลัซน และหสำกฟฝังกลชลังื่นกสำรกรองไมยู่ยสำวมสำก เอสำฟฝังกลชลังื่นทคีงื่เปป็นตลัวกรอง ยลัดลงไปใน filter() กก็ไดค้

function filterArr() {
var arr1 = [ 1 , 2 , 3 , 4 , 5 , 7 ] ;
var fData = arr1.filter(function(item){
return !(item >= 4) ; // ตลัวทขีริ่ไมค่ >= 4
}) ;
Logger.log(fData); // พพิมพล : [1.0, 2.0, 3.0]
} // End function

บททขีริ่ 13 : อาเรยต์เมถอด ตระกบูลวนลบูป 151


13.2.ค.) ตตัวอยยู่างททที่ 3 - กรองตตัวเลข

function filterArr() {
var arr = [ "txt1" , 4 , 8 , 33 , 2 , "txt2" , 9 ] ;
var new_arr = arr.filter(filterLogic) ;
Logger.log(arr); // พรมพต์ : [ "txt1" , 4 , 8 , 33 , 2 , "txt2" , 9 ]
Logger.log(new_arr); // พรมพต์ : [ 8.0 , 33.0 , 9.0]
// เฉพาะคค่ามากกวค่า 6 – ตลัวทขีริ่เปป็นขช้อความถบูกตลัดทรนี้ง
} // End function
var filterLogic = function(item) {
if(item>6)
{
return true ; // คมืนคค่า true - เมมืริ่อคค่ามากกวค่า 6
}
else
{
return false ;
} ; // End if
} // End function

13.2.ง.) ตตัวอยยู่างททที่ 4 - กรองขค้อความ

ขค้อมยลในอสำเรยลมทคี ลัซงตลัวเลข และ ขค้อควสำมปะปนกลันอยยยู่ ตลัวอยยู่สำงนคีซทดสอบกรองขค้อควสำม

function filterArr() {
var arr = [ "txt1" , 4 , 8 , 33 , 2 , "txt2" , 9 ] ;
var new_arr = arr.filter(filterLogic) ;
Logger.log(arr); // พรมพต์ : [ "txt1" , 4 , 8 , 33 , 2 , "txt2" , 9 ]
Logger.log(new_arr); // พรมพต์ : [ 4.0 , 8.0 , 33.0 , 2.0 , txt2 , 9.0 ]
// อะไรทขีริ่ไมค่ใชค่ txt1 มาหมด
} // End function
var filterLogic = function(item) {
if(item == "txt1" )
{
return false ;
}
else
{
return true ; // คมืนคค่า true – อะไรทขีริ่ไมค่ใชค่ "txt1" มาหมด
} ; // End if
} // End function

152 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


13.2.จ.) ตตัวอยยู่างททที่ 5 – คค้นหาในอาเรยล

Array.prototype.filter()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

ตลัวอยยู่สำงตยู่อไปนคีซ ใชค้เมถอด filter() กรองอสำเรยล โดยใชค้เงงงื่อนไขกสำรกรอง


let fruits = [ 'apple', 'banana', 'grapes', 'mango', 'orange' ]

// arr = อาเรยต์
// query = String ทขีริ่จะคช้นหา
function filterItems(arr, query) {
return arr.filter(function(el) {
return el.toLowerCase().indexOf(query.toLowerCase()) !== -1
// เชค่น "apple".toLowerCase().indexOf("ap".toLowerCase()) !== -1
})
}

Logger.log(filterItems(fruits, 'ap')) // ['apple', 'grapes']


Logger.log(filterItems(fruits, 'an')) // ['banana', 'mango', 'orange']

บททขีริ่ 13 : อาเรยต์เมถอด ตระกบูลวนลบูป 153


13.3. sort()
JavaScript Arrays Sort Method Tutorial - Google Sheets Apps Scripts - Array Methods Part 9
https://youtu.be/hPCIOohF0Fg?list=PLv9Pf9aNgemvD9NFa86_udt-NWh37efmD

sort() เปป็น Method ของอสำเรยลทใคีงื่ ชค้เรคียงสมสำชพิกในอสำเรยล

13.3.ก.) ขค้อมยลเปป็นตตัวเลขทตันี้งหมด

ตรวอยม่สำงททที่ 1 - เรคียงโดยไมยู่ใสยู่ Argrument ใดๆ ลงไปใน sort()

function sortArr() {
var arr1 = [4,2,5,6,5,2];
var arr2 = [4,2,5,6,5,2,44,9,56];
Logger.log(arr1.sort()) ; // พรมพต์ : [2.0, 2.0, 4.0, 5.0, 5.0, 6.0]
Logger.log(arr2.sort()) ; // พรมพต์ : [2.0, 2.0, 4.0, 44.0, 5.0, 5.0, 56.0, 6.0, 9.0]
} // End function

ตรวอยม่สำงททที่ 2 - เรคียงตสำมคยู่สำของตลัวเลข ตค้องใสยู่ Argrument เปป็นฟฝังกลชลังื่นกสำรกรองลงไปใน sort()


function sortArr() {
var arr2 = [4,2,5,6,5,2,44,9,56];
var dataSort = arr2.sort(function(a,b){
// จลับมาทขีละคบูแค่ ลช้วเปรขียบเทขียบไปจบเรขียงจบ a=4
// b=2
if(a > b) { return 1 ; } // -1 หากตช้องการเรขียงมากไปนช้อย
else if (a < b) { return -1 ; } // 1 หากตช้องการเรขียงมากไปนช้อย
return 0 ;
}); // End sort
Logger.log(dataSort); // พรมพต์ : [2.0, 2.0, 4.0, 5.0, 5.0, 6.0, 9.0, 44.0, 56.0]
} // End function

หสำกตค้องกสำรเรคียงจสำกมสำกไปนค้อย กก็ใหค้สลลับตลัว Return จสำก 1 เปป็น -1 อยยู่สำงไรกก็ดคี ไมยู่จสสำเปป็นตค้องเปป็น 1


หรงอ -1 เปป็น 11 กลับ -15 กก็ไดค้

154 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำงททที่ 3 - ทสสำใหค้สลัซนกวยู่สำตลัวอยยู่สำงทคีงื่ 2 โดยไมยู่ตค้องใชค้ if
function sortArr() {
var arr2 = [4,2,5,6,5,2,44,9,56];
var dataSort = arr2.sort(function(a,b){
return a - b ; // เชค่น 4-2 = 2 เปป็น + ฉะนลันี้น a(4) ควรอยบูค่หลลัง b(2)
}); // เชค่น 2-5 = -3 เปป็น - ฉะนลันี้น b(5) ควรอยบูหค่ ลลัง a(2) …. ทกาไปเรมืริ่อยๆ
Logger.log(dataSort); // พรมพต์ : [2.0, 2.0, 4.0, 5.0, 5.0, 6.0, 9.0, 44.0, 56.0]
} // End function

13.3.ข.) ขค้อมยลเปป็นขค้อความทตันี้งหมด

ตรวอยม่สำงททที่ 1 - เรคียงโดยไมยู่ใสยู่พสำรสำมพิเตอรลใดๆ ลงไปใน sort()


function sortArr() {
var arr3 = ["t","n","a","b","a","r","b","apple"];
// ขช้อมบูล “5” ชนรดเปป็นขช้อความ
var arr4 = ["t","n","5","A","b","a","r","B","Apple","apple","APple"] ;
Logger.log(arr3.sort()); // พรมพต์ : [a, a, apple, b, b, n, r, t]
Logger.log(arr4.sort()); // พรมพต์ : [5, A, APple, Apple, B, a, apple, b, n, r, t]
} // End function

ตรวอยม่สำงททที่ 2 - เรคียงตสำมตลัวอลักษร ใชค้วพิธคีเดคียวกลับขค้อมยลตลัวเลข


function sortArr() {
var arr4 = ["t","n","5","A","b","a","r","B","Apple","apple","APple"]; // 5 ชนรดเปป็นขช้อความ
var dataSort = arr4.sort(function(a,b){
if(a > b) { return 1 ; } // -1 หากตช้องการเรขียงมากไปนช้อย
else if (a < b) { return -1 ; } // 1 หากตช้องการเรขียงมากไปนช้อย
return 0 ;
}); // End sort
Logger.log(dataSort); // พรมพต์ : [5, A, APple, Apple, B, a, apple, b, n, r, t]
} // End function

บททขีริ่ 13 : อาเรยต์เมถอด ตระกบูลวนลบูป 155


ตรวอยม่สำงททที่ 3 - เรคียงตสำมตลัวอลักษร –โดยไมยู่สนใจ Case
ตลัวอยยู่สำงทคีงื่ 2 เรคียงโดยเอสำ Case ของตลัวอลักษรมสำใชค้ในกสำรเรคียงดค้วย หสำกตค้องกสำรเรคียงโดยไมยู่สนใจ Case
ใหค้ ใชค้ฟฝังกลชลังื่น toLowerCase() แปลงขค้อควสำมใหค้เปป็นพพิมพลเลก็กทลัซงหมดกยู่อนเรคียง
function sortArr() {
var arr4 = ["t","n","5","A","b","a","r","B","Apple","apple","APple"]; // 5 ชนรดเปป็นขช้อความ
var dataSort = arr4.sort(function(a,b){
a = a.toLowerCase();
b = b.toLowerCase();
if(a > b) { return 1 ; } // -1 หากตช้องการเรขียงมากไปนช้อย
else if (a < b) { return -1 ; } // 1 หากตช้องการเรขียงมากไปนช้อย
return 0 ;
}); // End sort
Logger.log(dataSort); // พรมพต์ : [5, A, a, Apple, apple, APple, b, B, n, r, t]
} // End function

ตรวอยม่สำงททที่ 4 - กรณคีขค้อมยลมคีตลัวเลขผสมอยยยู่ในขค้อควสำม
กรณคีขค้อมยลมคีตลัวเลขผสมอยยยู่ในขค้อควสำม ใหค้แปลงเปป็นชนพิดขค้อควสำมกยู่อน โดยใชค้ฟฝังกลชลังื่น toString() ไมยู่เชยู่น
นลัซนจะ Error แมค้เปป็นตลัวเลขกก็จะถยกเรคียงแบบขค้อควสำม

function sortArr() {
var arr6 = ["t","n","5","A",4,"b",44,"a","r","B","Apple","apple","APple"]; // 5 ชนรดเปป็นขช้อความ
var dataSort = arr6.sort(function(a,b){
a = a.toString().toLowerCase();
b = b.toString().toLowerCase();
if(a > b) { return 1 ; } // -1 หากตช้องการเรขียงมากไปนช้อย
else if (a < b) { return -1 ; } // 1 หากตช้องการเรขียงมากไปนช้อย
return 0 ;
}); // End sort
Logger.log(dataSort); // พรมพต์ : [4.0, 44.0, 5, A, a, Apple, apple, APple, b, B, n, r, t]
} // End function

156 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


13.3.ค.) ขค้อมยลผสม
ตรวอยม่สำงททที่ 1 - เรคียงโดยไมยู่ใสยู่พสำรสำมพิเตอรลใดๆ ลงไปใน sort() - สลังเกตถวสำยู่ ขค้อมยลในอสำเรยลกก็จะสะเปะสะ
ปะหนยู่อย

function sortArr() {
var arr5 = var arr5 = ["t","","n","5","A",undefined,"",null
, "a",undefined,"r",1,66,9,"B","Apple","apple","APple"] ;
Logger.log(arr5.sort());
// พรมพต์ : [, , 1.0, 5, 66.0, 9.0, A, APple, Apple, B, a, apple, n, null, r, t, null, null]
} // End function

ตรวอยม่สำงททที่ 2 - แยกขค้อมยลเปป็น 2 กค้อน กค้อนขค้อควสำม และ ตลัวเลข ดค้วยอสำเรยลวยู่สำงๆ 2 ตลัว จสำกนลัซน จถึงเรคียง
แลค้วเอสำมสำรวมกลันดค้วย concat
function sortArr() {
var arr7 = ["t","","n","5","A",undefined,"",null,
"a",undefined,"r",1,66,9,"B","Apple","apple","APple"] ;
var numberArr =[];
var textArr =[];
var otherArr =[];
arr7.map(function(item){
if(typeof item === "number"){
numberArr.push(item) ;
} else if (typeof item === "string"){
textArr.push(item.toString());
} else {
otherArr.push(item);
}; // End if
}); // End map
Logger.log(numberArr);
// พพิมพล : [7.0, 66.0, 19.0]
Logger.log(textArr);
// พพิมพล : [t, , n, 5, A, , a, r, B, Apple, apple, APple]
Logger.log(otherArr);
// พพิมพล : [null, null, null]
// รวมอาเรยต์ทขีริ่เรขียงแลช้วเขช้าดช้วยกลัน
var comArr = numberArr.sort(sortNumber).concat(textArr.sort(sortAlpha));
Logger.log(comArr);
// พพิมพล : [7.0, 19.0, 66.0, , , 5, A, APple, Apple, B, a, apple, n, r, t]
} // End function

บททขีริ่ 13 : อาเรยต์เมถอด ตระกบูลวนลบูป 157


function sortAlpha(a,b){
if(a > b) { return 1 ; }
else if (a < b) { return -1 ; }
return 0 ;
} // End function
function sortNumber(a,b) {
return a-b ;
} // End function

13.3.ง.) เรทยงขค้อมยลในอาเรยล 2 มพิตพิ


https://stackoverflow.com/questions/16096872/how-to-sort-2-dimensional-array-by-column-value

ตลัวอยยู่สำงอยยู่สำงนคีซ เปป็นกสำรเรคียงอสำเรยลแบบ 2 มพิตพิ ซถึงื่งมพิตพิของอสำเรยลมคีลลักษณะเดคียวกลันกลับกสำรจลับขค้อมยลมสำ


จสำกเรค้นจลใน Google Sheets
function sortArr2Dim(){
var arr2dim = [
[ 12 , 'AAA' ] ,
[ 58 , 'BBB' ] ,
[ 28 , 'CCC' ] ,
[ 18 , 'DDD' ]
];
Logger.log(sortBy1stColumn(arr2dim)) ;
/* [
[12.0, AAA ] ,
[18.0, DDD ] ,
[28.0, CCC ] ,
[58.0, BBB ]
] */
}
function sortBy1stColumn(arr2dim){
arr2dim.sort(function(a, b) {
if (a[0] === b[0])
{
return 0 ;
}
else
{
return (a[0] < b[0]) ? -1 : 1 ;
}) ;
return arr2dim ;
}

158 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


13.3.จ.) เรทยงโดยใชค้ 2 คทยล (หรรอมากกวยู่า) – ใชค้อาเรยลอยยู่างเดทยว
ปรลับแตค่งจาก
https://gomakethings.com/sorting-an-array-by-multiple-criteria-with-vanilla-javascript/
ตลัวอยยู่สำง
function sortBy2Keys(){
// อาเรยต์ 1 มรตร แตค่สมาชรกแตค่ละตลัวเปป็น Objects
var votes = [
[ 'Apple' , 1 , 100 ] ,
[ 'B' , 2 , 109 ] ,
[ 'Carrot' , 3 , 102 ] ,
[ 'Banana', 2 , 103 ] ,
[ 'B' , 2 , 99 ] ,
[ 'A' , 2 , 105 ] ,
[ 'B' , 2 , 777 ]
];
votes.sort(function (vote1, vote2) {
// คขียต์ทขีริ่ 1 เรขียงตาม คอลลัมนต์ทขีริ่ 2 - กค่อนไปหลลัง
if (vote1[1] > vote2[1]) return -1 ;
if (vote1[1] < vote2[1]) return 1 ;
// คขียต์ทขีริ่ 2 เรขียงตาม คอลลัมนต์ทขีริ่ 1 - มากไปนช้อย
if (vote1[0].toString() > vote2[0].toString()) return 1 ;
if (vote1[0].toString() < vote2[0].toString()) return -1 ;
// คขียต์ทขีริ่ 3 เรขียงตาม คอลลัมนต์ทขีริ่ 3 - นช้อยไปมาก
if (vote1[2] > vote2[2]) return 1 ;
if (vote1[2] < vote2[2]) return -1 ;
}) ; // Close - sort
Logger.log(votes) ;
/* [ [ Carrot, 3.0, 102.0 ] ,
[ A, 2.0, 105.0 ] ,
[ B, 2.0, 99.0 ] ,
[ B, 2.0, 109.0 ] ,
[ B, 2.0, 777.0 ] ,
[ Banana, 2.0, 103.0 ] ,
[ Apple , 1.0, 100.0 ] ] */
}

บททขีริ่ 13 : อาเรยต์เมถอด ตระกบูลวนลบูป 159


13.3.ฉ.) เรทยงโดยใชค้ 2 คทยล (หรรอมากกวยู่า) – ใชค้ Object ชยู่วย
ปรลับแตค่งจาก
https://gomakethings.com/sorting-an-array-by-multiple-criteria-with-vanilla-javascript/
ตลัวอยยู่สำงตยู่อไปนคีซ เรคียงตสำมตลัวเลขกยู่อน (Vote) จสำกนลัซนจถึงเรคียงตสำมชงงื่อ(Title) และ ตสำมคพิว(que) สลังเกตถวยู่สำ
ขค้อมยลเปป็นอสำเรยล 1 มพิตพิ แตยู่สมสำชพิกขค้สำงในเปป็น Objects ทคีงื่มคีไดค้หลสำย Properties
function sortBy2Keys(){
// อาเรยต์ 1 มรตร แตค่สมาชรกแตค่ละตลัวเปป็น Objects
var votes = [
{ title: 'Apple' , vote: 1 , que : 100 } ,
{ title: 'B' , vote: 2 , que : 109 } ,
{ title: 'Carrot' , vote: 3 , que : 102 } ,
{ title: 'Banana', vote: 2 , que : 103 } ,
{ title: 'B' , vote: 2 , que : 99 } ,
{ title: 'A' , vote: 2 , que : 105 } ,
{ title: 'B' , vote: 2 , que : 777 }
];
votes.sort(function (vote1, vote2) {
// เรทยงตาม Votes
// ถช้าคค่าของตลัวแรก มากกวค่า ยช้ายไปดช้านลค่าง
// ถช้าคค่าของตลัวแรก นช้อยกวค่า ยช้ายไปดช้านบน
if (vote1.vote > vote2.vote) return -1 ;
if (vote1.vote < vote2.vote) return 1 ;
// ถช้าคค่าของ Votes ซกนี้ากลัน เรทยงตามตตัวอตักษระของ Title ตยู่อ
// ถช้าลกาดลับของตลัวแรก มากค่อน ยช้ายไปดช้านบน - อยค่างอมืริ่น ยช้ายไปดช้านลค่าง
if (vote1.title.toString() > vote2.title.toString()) return 1 ;
if (vote1.title.toString() < vote2.title.toString()) return -1 ;
// เรขียงโดยใชช้คขียต์ทขีริ่ 3 - จากนช้อยไปมาก
if (vote1.que > vote2.que) return 1 ;
if (vote1.que < vote2.que) return -1 ;
}) ; // Close - sort
Logger.log(votes) ; // ทดสอบ Log หลลังจากเรขียงแลช้ว
// กรอกขช้อมบูลลง Google Sheets
var sheet3 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet3') ;
// จลับใสค่อาเรยต์ 2 มรตร - เตรขียมสกาหรลับกรอกลง Googel Sheets
var arr2dim = [] ;
votes.forEach(function(obj){
arr2dim.push([ obj.title , obj.vote , obj.que] ) ;
}) ; // Logger.log(d) ;
sheet3.getRange(1,1,arr2dim.length,arr2dim[0].length).setValues(arr2dim) ;
}

160 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ผล

13.4. every() และ some()


JavaScript Array every() Method
https://www.w3schools.com/jsref/jsref_every.asp
JavaScript Every & Some Array Methods Tutorial - Google Sheets Apps Scripts - Array Methods Part 8
https://youtu.be/gaC290XzPX4?list=PLv9Pf9aNgemvD9NFa86_udt-NWh37efmD

every() ใชค้ตรวจสอบสมสำชพิกทถกตลัวในอสำเรยลวยู่สำ เปป็นไปตสำมเงงงื่อนไขหรงอเปลยู่สำ เชยู่น มสำกกวยู่สำ 0 ทถกตลัวหรงอ


ไมยู่ สยู่วน some() กก็คลค้สำยกลัน ถค้สำมคีเพคียงบสำงตลัวจรพิงตสำมเงงงื่อนไข กก็จะคงนคยู่สำ true กลลับมสำ
รยปแบบกสำรใชค้งสำน

array.every(function(currentValue, index, arr), thisValue)

พสำรสำมพิเตอรล
Parameter Description
(จกาเปป็น) ฟฟังกก็ชลัริ่นทขีริ่จะรลัน สกาหรลับแตค่ละอรเลก็มเมช้นตต์ในอาเรยต์
อารต์กรวเมช้นตต์ของฟฟังกต์ชลัริ่น
function(currentValue, Argument Description
index, arr) currentValue (จกาเปป็น) คค่าของอรเลก็มเมช้นตต์ปฟัจจคุบลัน
index (ไมค่จกาเปป็น) ดรรชนขีอาเรยต์ของอรเลก็มเมช้นตต์ปฟัจจคุบลัน
arr (ไมค่จกาเปป็น) วลัตถคุอาเรยต์ของทขีริ่อรเลก็มเมช้นตต์ปฟัจจคุบลัน
(ไมค่จกาเปป็น) คค่าทขีริ่จะถบูกสค่งใหช้กลับฟฟังกต์ชลัริ่น เพมืริ่อถบูกใชช้เปป็นคค่า "this"
thisValue
ถช้าเวช้นไวช้ คค่า undefined จะถบูกสค่งผค่าน

กสำรคงนคยู่สำ – Boolean สยู่งคงนคยู่สำ true หสำกอพิเลก็มเมค้นตลทลัซงหมดในอสำรลเรยล ผยู่สำนเงงงื่อนไข อยยู่สำงองงื่คงนคยู่สำ false

บททขีริ่ 13 : อาเรยต์เมถอด ตระกบูลวนลบูป 161


13.4.ก.) ตตัวอยยู่างททที่ 1 : อาเรยล 1 มพิตพิ

function every_some() {

var arr1 = [1,2,3,4,5,7] ;


var resultsEvery = arr1.every(function(num){
return num > 3 ; // [ 1 , 2 , 3 , 4 , 5 , 7]
// T T F F F F =>

// มท false 1 ตตัวครนคยู่า false


});
Logger.log(resultsEvery); // พรมพต์ : false
var resultsSome = arr1.some(function(num){
return num > 3 ; // [ 1 , 2 , 3 , 4 , 5 , 7]
// T T F F F F => มท true 1 ตตัวครนคยู่า true
});
Logger.log(resultsSome); // พรมพต์ : true
} // End function

13.4.ข.) ตตัวอยยู่างททที่ 2 : อาเรยล 2 มพิตพิ

function every_some() {
var arr2 = [ ["a" , 6] ,
["b" , 9] ,
["c" , 6] ] ;
var resultsEvery = arr2.every(function(row){
return row[0] === "b" ; // [ a , b , c ]
// F T F => มท false 1 ตตัวครนคยู่า false
});
Logger.log(resultsEvery); // พรมพต์ : false
var resultsSome = arr2.some(function(num){
return num[1] > 7 ; // [ 6 , 9 , 6]
// T F T - มท true 1 ตตัวครนคยู่า true
});
Logger.log(resultsSome) ; // พรมพต์ : true
} // End function

162 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


13.4.ค.) ตตัวอยยู่างททที่ 3 : ตตัวแปรวตัตถจุ
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_every3
ตรวจสอบวยู่สำคสสำตอบเหมงอนกลันทลัซงหมดหรงอไมยู่ Yes หรงอ No ทลัซงหมด ตลัวใดตลัวหนถึงื่ง จะคงนคยู่สำ true

function test(){
var survey = [
{ name: "Steve", answer: "Yes" } ,
{ name: "Jessica", answer: "Yes" } ,
{ name: "Peter", answer: "Yes" } ,
{ name: "Elaine", answer: "No" }
];
Logger.log(survey.every(isSameAnswer));
}
function isSameAnswer(el, index, arr) {
// arr กก็คมือ อาเรยต์ทลันี้งยวง
if (index === 0){
return true ;
} else {
return (el.answer === arr[index - 1].answer);
}
}

กสำรทสสำงสำน เปรคียบเทคียบคสสำตอบใน Index ปฝัจจถบลัน กลับ Index กยู่อนหนค้สำ


el.answer === arr[index-1].answer
index 0 - - ==> true - ตลันี้งแตค่เรรริ่มตช้น
index 1 – Yes === Yes ==> true
index 2 – Yes === Yes ==> true
index 3 – No === Yes ==> false

บททขีริ่ 13 : อาเรยต์เมถอด ตระกบูลวนลบูป 163


13.5. forEach()
JavaScript Array forEach() Method
https://www.w3schools.com/jsref/jsref_foreach.asp
forEach ใชค้วนลยปสยู่งสมสำชพิกในอสำเรยลทคีละตลัว ไปประมวลผลในฟฝังกลชลังื่น
13.5.ก.) รยปแบบการใชค้งาน
รยปแบบกสำรใชค้งสำน
array.forEach(function(currentValue, index, arr), thisValue )

พสำรสำมพิเตอรล ( ไมก่มทเวลาแปลจต้า …. ขออภลัยดต้วย ดผตวลั อยก่างจะเขต้าใจไดต้ไมก่อยาก)


Parameter Description
(ตช้องการ) A function to be run for each element in the array.
Function arguments : (ฟฟังกต์ชลัริ่นทขีริ่จะใชช้รลันสมาชรกแตค่ละตลัวในอาเรยต์)
Argument Description
function(currentValue, index, currentValue (ตช้องการ) คค่าของอรเลก็มเมช้นตต์ตลัวปฟัจจคุบลัน
arr)
index (ไมค่จกาเปป็น) ดรรชนขีอาเรยต์ของอรเลก็มเมช้นตต์ปฟัจจคุบลัน
(ไมค่จกาเปป็น) กช้อนอาเรยต์ทขีริ่สมาชรกตลัวปฟัจจคุบนลั อยบูค่
arr
(อาเรยต์ตลัวทขีริ่กกาลลังวนลบูปอยบูค่นขีนี้แหละ)
(เวช้นไวช้ไดช้) A value to be passed to the function to be used as its
thisValue "this" value. If this parameter is empty, the value "undefined" will
be passed as its "this" value

13.5.ข.) ตตัวอยยู่างททที่ 1 : การใชค้งานแบบ 1 Argrument


เอสำตลัวเลขในอสำเรยลมสำบวกกลัน
function forEach_1() {
var sum = 0;
var numbers = [65, 44, 12, 4]; // ตลัวแปรอาเรยต์ทขีริ่ระบคุสมาชรก
numbers.forEach(myFunction); // จบ forEach
function myFunction(item) { // 1 Argrument
sum += item; // เอาคค่าของสมาชรกมาบวกกลันไปเรมืริ่อยๆ แลช้วเกก็บไวช้ใน sum
}
Logger.log(sum); // พพิมพล : 125.0
}

164 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


13.5.ค.) ตตัวอยยู่างททที่ 2 : การใชค้งานแบบ 2 Argruments

เอสำขค้อควสำมในอสำเรยลมสำตยู่อกลัน
function forEach_2() {
var fruits = ["apple", "orange", "cherry"]; // item
// 0 1 2 // index
var text = "" ;
fruits.forEach(function(item, index) { // 2 Argruments
text += index + ":" + item + "<br>" ;
}) ; // จบ forEach
Logger.log(text) ; // พพิมพล 0:apple<br>1:orange<br>2:cherry<br>
}

13.5.ง.) ตตัวอยยู่างททที่ 3 : : การใชค้งานแบบ 3 Argruments


เอสำตลัวเลขในอสำเรยลทลัซงหมดมสำคถณดค้วยสพิบ

function forEach_3() {
var numbers = [65, 44, 12, 4];
numbers.forEach(function(item, index, arr) { // 3 Argruments
// เอาสมาชรกในอาเรยต์ numbers มาประมวลผล
// แลช้วเกก็บไวช้ในอาเรยต์ arr (ตลัวเดรม) เปป็นการ Assign คค่าใหมค่ลงไป
arr[index] = item * 10;
} // จบ forEach
Logger.log(numbers);
// พพิมพล : [650.0, 440.0, 120.0, 40.0]
// เอาทคุกคค่าอาเรยต์ numbers มาคบูณกลับ 10
}

บททขีริ่ 13 : อาเรยต์เมถอด ตระกบูลวนลบูป 165


13.5.จ.) ตตัวอยยู่างททที่ 4 : ตตัวอยยู่างอรที่นๆ
ตลัวอยยู่สำงนคีซ แปลงสมสำชพิกในอสำเรยลทคีงื่ อถณหภยมพิเปป็นองศสำ C ไปเปป็นเปป็น F แลค้วเกก็บไวค้ในอสำเรยลวยู่สำงๆทคีงื่เตรคียม
ไวค้

function forEachLoopTemp() {
var celciusArray = [ 0 , 13 , 19 , 11 , 24 , 29 , 34 , 17 , 4 ] ;
var farenheitArray = [] ; // เตรขียมอาเรยต์วค่างๆไวช้เกก็บผลลลัพธต์
celciusArray.forEach(function(celciusTemp) {
// เรขียกใชช้ฟฟังกต์ชลัริ่น convertCtoF(t)
// โดยสค่งสมาชรกไปประมวลผลทขีละตลัว
var farenheitTemp = convertCtoF(celciusTemp) ;
// เกก็บผลลลัพยต์ไวช้ในอาเรยต์วค่างๆทขีเริ่ ตรขียมไวช้
farenheitArray.push(farenheitTemp) ;
});
Logger.log('Celcius Array:') ; // ดบูผลทขีริ่ Logs –------------- > [ 01 ]
Logger.log(celciusArray) ; // ดบูผลทขีริ่ Logs –------------- > [ 02 ]
Logger.log('Farenheit Array') ; // ดบูผลทขีริ่ Logs –------------- > [ 03 ]
Logger.log(farenheitArray) ; // ดบูผลทขีริ่ Logs –------------- > [ 04 ]
}
function convertCtoF(t) {
return (t * 9/5) + 32 ;
}

ผล
Logs
[01] Celcius Array:
[02] [0.0, 13.0, 19.0, 11.0, 24.0, 29.0, 34.0, 17.0, 4.0]
[03] Farenheit Array
[04] [32.0, 55.4, 66.2, 51.8, 75.2, 84.2, 93.2, 62.6, 39.2]

13.6. reduce()
JavaScript Array reduce() Method
https://www.w3schools.com/jsref/jsref_reduce.asp
Javascript reduce example
https://appdividend.com/2018/10/16/javascript-reduce-example-tutorial/
reduce เปป็นเมถอด ทคีงื่ใชค้วนลยปเพงงื่อนสสำสมสำชพิกในอสำเรยลมสำประมวลผลดค้วยฟฝังกลชลังื่น เพงงื่อลดสมสำชพิกในอสำ
เรยล โดยจะคงนผลลลัพธลสถดทค้สำยมสำตลัวเดคียว

166 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


13.6.ก.) รยปแบบการใชค้งาน
รยปแบบกสำรใชค้งสำน

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

พสำรสำมพิเตอรล
Parameter Description
(จกาเปป็น) ฟฟังกต์ชลัริ่นทขีใริ่ ชช้รลันสมาชรกในอาเรยต์แตค่ละตลัว
Argument Description
(จกาเปป็น) คค่า initialValue(หากมขีการกกาหนด) หรมือ
function(total,currentValue, total เปป็นคค่าทขีริ่คมืนกลลับมากค่อนหนช้า โดยฟฟังกต์ชนลัริ่
index,arr)
currentValue (จกาเปป็น) คค่าของสมาชรกอาเรยต์ตลัวปฟัจจคุบนลั
currentIndex (ไมค่บลังคลับ) ดรรนขีลกาดลับของสมาชรกอาเรยต์ตลัวปฟัจจคุบลัน
arr (ไมค่บลังคลับ l) อาเรยต์ทขีริ่ใชลัเกก็บผลลลัพธต์
initialValue (ไมค่บลังคลับ) คค่าทขีริ่สค่งใหช้กบลั ฟฟังกต์ชลัริ่น ทขีใริ่ ชช้เปป็นคค่าเรรริ่มตช้น

13.6.ข.) ตตัวอยยู่างททที่ 1 : รวมคยู่าของสมาชพิกในอาเรยล


ตลัวอยยู่สำงนคีซ นสสำคยู่สำของสมสำชพิกในอสำเรยลมสำรวมกลัน
function test_sum_array(){
var data = [5, 10, 15, 20, 25] ; // Sum = 75
var res = data.reduce(function(total,currentValue) {
return total + currentValue ;
}) ;
Logger.log(res) ; // พรมพต์ : 75
}

ดยกสำรวนลยปของโคค้ดขค้สำงตค้น
ลยปครตันี้งททที่ total currentValue return
1 0 5 5
2 5 10 15
3 15 15 30
4 30 20 50
5 50 25 75

บททขีริ่ 13 : อาเรยต์เมถอด ตระกบูลวนลบูป 167


13.6.ค.) ตตัวอยยู่างททที่ 2 : ลดมพิตพิของอาเรยล
ตลัวอยยู่สำงนคีซ ลดมพิตพิของอสำเรยลจสำก 2 เหลงอ 1 สลังเกตถวสำยู่ มคีกสำรใชค้พสำรสำมพิเตอรล initialValue ดค้วยกก็คงอ []
function test_concat_array(){
var data = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] ;
var flatValues = data.reduce(function(total, value) {
return total.concat(value) ;
}, []) ; // ใสค่ initialValue
Logger.log(flatValues) ; // พรมพต์ [1, 2, 3, 4, 5, 6, 7, 8, 9]
}

ดยกสำรวนลยปของโคค้ดขค้สำงตค้น
ลยปครตันี้งททที่ total value return total.concat(value)
1 [] - initialValue [1, 2, 3] [1, 2, 3]
2 [1, 2, 3] [4, 5, 6] [1, 2, 3, 4, 5, 6]
3 [1, 2, 3, 4, 5, 6] [7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9]

13.6.ง.) ตตัวอยยู่างททที่ 3 : หาคยู่าเฉลทที่ยของสมาชพิกในอาเรยล


ตลัวอยยู่สำงนคีซ หสำคยู่สำเฉลคีงื่ยของสมสำชพิกในอสำเรยล ขค้อสลังเกตถของโคค้ดทคีงื่สสสำคลัญ กก็คงอ พสำรสำมพิเตอรล array
(พสำรสำมพิเตอรลตวลั ทคีงื่ 4) เปป็นอสำเรยลทคีงื่ใชค้เกก็บผลลลัพธลจสำกกสำรประมวลผลของฟฝังกลชลังื่น มคีมพิตพิของอสำเรยลเทยู่สำกลับ อสำเรยลทคีงื่
นสสำมสำประมวลผล
function test_avg_array(){
var pounds = [ 11, 21, 16 ] ;
var avg = pounds.reduce(function(total, amount, index, array){
total += amount ;
if (index === array.length - 1) {
return total / array.length ;
} else {
return total ;
}
});
Logger.log(avg) ; // 16
}

ดยกสำรวนลยปของโคค้ดขค้สำงตค้น
ลยป total+= amount amount index array.length-1 return
1 0+11 11 0 3-1 11
2 11+21 21 1 3-1 33
3 33+16 16 2 3-1 16 (48/3)

168 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


13.6.จ.) ตตัวอยยู่างททที่ 4 : หาตตัวซสนี้า และจสานวนการซสนี้า
ตลัวอยยู่สำงนคีซ หสำคยู่สำเฉลคีงื่ยของสมสำชพิกในอสำเรยล ขค้อสลังเกตถของโคค้ดทคีงื่สสสำคลัญ กก็คงอ พสำรสำมพิเตอรล array
(พสำรสำมพิเตอรลตลัวทคีงื่ 4) เปป็นอสำเรยลทคีงื่ใชค้เกก็บผลลลัพธลจสำกกสำรประมวลผลของฟฝังกลชลังื่น มคีมตพิ พิของอสำเรยลเทยู่สำกลับ อสำเรยลทคีงื่
นสสำมสำประมวลผล
function test_findDup_array(){
var pounds = [11, 21, 16, 19, 46, 29, 46, 19, 21] ;
var count = pounds.reduce(function(data, pound){
data[pound] = (data[pound] || 0) + 1 ;
return data ;
} , {} ) ;
Logger.log(count) ; // {11=1.0, 46=2.0, 16=1.0, 29=1.0, 19=2.0, 21=2.0}
}

ดยกสำรวนลยปของโคค้ดขค้สำงตค้น
ลยป 1 data = {}
pound = 11
return = data[11]=(data[11] || 0) +1 → data = {11:1}
ลยป 2 data = {11:1}
pound = 21
return = data[21]=(data[21] || 0) +1 → data = {11:1, 21:1}
ลยป 3 data = {11:1, 21:1}
pound = 16
return = data[16]=(data[16] || 0) +1 → data = {11:1, 21:1, 16:1}
ลยป 4 data = {11:1, 21:1, 16:1}
pound = 19
return = data[19]=(data[19] || 0) +1 → data = {11:1, 21:1, 16:1, 19:1}
ลยป 5 data = {11:1, 21:1, 16:1, 19:1}
pound = 46
return = data[46]=(data[46] || 0) +1 → data = {11:1, 21:1, 16:1, 19:1, 46:1}
ลยป 6 data = {11:1, 21:1, 16:1, 19:1, 46:1}
pound = 29
return = data[29]=(data[29] || 0) +1 → data = {11:1, 21:1, 16:1, 19:1, 46:1, 29:1}
ลยป 7 data = {11:1, 21:1, 16:1, 19:1, 46:1, 29:1}
pound = 46
return = data[46]=(data[46] || 0) +1 → data = {11:1, 21:1, 16:1, 19:1, 46:2, 29:1}
ลยป 8 data = {11:1, 21:1, 16:1, 19:1, 46:2, 29:1}
pound = 19
return = data[46]=(data[46] || 0) +1 → data = {11:1, 21:1, 16:1, 19:2, 46:2, 29:1}
ลยป 9 data = {11:1, 21:1, 16:1, 19:2, 46:2, 29:1}
pound = 21
return = data[21]=(data[21] || 0) +1 → data = {11:1, 21:2, 16:1, 19:2, 46:2, 29:1}
return สถดทค้สำยคงอ {11:1, 21:2, 16:1, 19:2, 46:2, 29:1}

บททขีริ่ 13 : อาเรยต์เมถอด ตระกบูลวนลบูป 169


หมสำยเหตถุ 1 :
ปกตพิเรสำจะเหก็น Properties ของตลัวแปร Object เปป็น Text(ขค้อควสำม) แตยู่โคค้ดตยู่อไปนคีซ Properties เปป็น
Number(ตลัวเลข) ซถึงื่งสอดคลค้องกลับโคค้ดในตลัวอยยู่สำงกยู่อนหนค้สำ

function add_member_to_object(){
var count = { 111:1 , 222:2 } ; // Properties : Value เปป็นตลัวเลขทลันี้งคบูค่
count[333] = 3 ; // เพรริ่ม Property และ Value ตลัวใหมค่ ใหช้กลับตลัวแปร Object
Logger.log(count) ; // { 111:1 , 222:2 , 333:3}
}

หมสำยเหตถุ 2 :
ถค้ สำ คยู่สำ ของตลัว แปรยลัง ไมยู่ มคี (undefined) หรง อ ยลั ง ไมยู่ ถยก ระบถ หสำกนสสำ ไปคสสำ นวณจะเกพิ ด Error กก็คง อ NaN
สสำมสำรถปป้องกลันไดค้โดยใชค้ ||(หรรอ) เพงงื่อสรค้สำงเงงงื่อนไขกสำรคสสำนวณ เชยู่น a || 5 ถค้สำ a เปป็น undefind จะนสสำ 5 มสำใชค้
คสสำนวณแทน ตลัวอยยู่สำงตสำมโคค้ดตยู่อไปนคีซ
function pipe_in_(){
var A = 1, B = 2;
var M = -1, N = 0 ;
var X = null, Y = undefined ;
var Z ;
Logger.log((A || 0) + 1) ; // 1+1 =2
Logger.log((B || 0) + 1) ; // 2+1 =3
Logger.log((M || 0) + 1) ; // 3+1 =0
Logger.log((N || 0) + 1) ; // 0+1 =1
Logger.log((X || 0) + 1) ; // 0(null)+1 =1
Logger.log((Y || 0) + 1) ; // 0(undefined)+1 =1
Logger.log(null + 1) ; // 1
Logger.log(undefined + 1) ; // NaN
Logger.log(Z + 1) ; // NaN
}

170 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


13.6.ฉ.) ตตัวอยยู่างททที่ 5 : หาจสานวนตตัวซสนี้า และจสานวนการซสนี้า (2)
group array and get count
https://stackoverflow.com/questions/52711740/group-array-and-get-count/52711840
ตลัวอยยู่สำงนคีซทสสำคลค้สำยๆ SUMIF ทคีงื่ใชค้นลับจสสำนวนเปป็นกลถยู่มๆไดค้
โคค้ด
const input = [ "foo", "bar", "foo", "bar", "bar", "bar", "zoom" ] ;
const result = input.reduce((total, value) => {
total[value] = (total[value] || 0) + 1 ;
return total ;
}, {}) ;
Logger.log(result) ; // {foo=2.0, zoom=1.0, bar=4.0}

13.6.ช.) ตตัวอยยู่างททที่ 6 : หาผลรวมเปป็นกลจุยู่มๆ


how to group by and sum array of object? [duplicate]
https://stackoverflow.com/questions/29364262/how-to-group-by-and-sum-array-of-object
var array = [
{ Id: "001", qty: 1 },
{ Id: "002", qty: 2 },
{ Id: "001", qty: 2 },
{ Id: "003", qty: 4 }
];
var result = [] ;
array.reduce(function(res, value) {
if (!res[value.Id]) {
res[value.Id] = { Id: value.Id, qty: 0 } ;
result.push(res[value.Id])
}
res[value.Id].qty += value.qty ;
return res ;
}, {}) ;
Logger.log(result) // ------------------ > ดบูผลทขีริ่ Logs

ผล
Logs
[
{ "Id": "001", "qty": 3 },
{ "Id": "002", "qty": 2 },
{ "Id": "003", "qty": 4 }
]

บททขีริ่ 13 : อาเรยต์เมถอด ตระกบูลวนลบูป 171


172 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)
บททขีที่ 14
วลัตถถ Array
14.1. วลัตถถุ Array
Array
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
Array เปป็น Builtin object หรงอเปป็น Gobal object ทคีงื่ถยกใชค้ในกสำรสรค้สำงวลัตถถอสำเรยล

กสำรใชค้งสำนอสำเรยลทลังื่วๆไป ปกตพิจะไมยู่มสำถถึงบทนคีซ บทนคีซถงอเปป็นกสำรใชค้งสำนอสำเรยลในอคีกแบบหนถึงื่ง แตยู่มกลั ใชลักลับ


วลัตถถของ Javascript มสำกกวยู่สำ ฉะนลัซนขค้สำมไปกก็ไดค้

14.2. Array() constructor


Array() constructor
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Array

Array() constructor ใชค้สรค้สำงวลัตถถอสำเรยล

รยปแบบกสำรใชค้งสำน
// แบบปกตร
[element0, element1, ..., elementN]
// แบบใชช้ Constructor
new Array(element0, element1[, ...[, elementN]])
// แบบใชช้ Constructor - ระบคุจกานวนสมาชรก
new Array(arrayLength)

เรสำสสำมสำรถสรค้สำงอสำเรยลโดยใชค้ Constructor กก็ไดค้ แตยู่ถค้สำใชค้งสำยทลังื่วๆไป กก็ไมยู่นพิยพิมใชค้กลัน


ตลัวอยยู่สำง

let fruits = new Array(2) ;


console.log(fruits.length) ; // 2
console.log(fruits[0]) ; // undefined

ตลัวอยยู่สำง
let fruits = new Array('Apple', 'Banana') ;
console.log(fruits.length) ; // 2
console.log(fruits[0]) ; // Apple

174 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


14.3. Array prototype constructor
JavaScript Array prototype Constructor
https://www.w3schools.com/jsref/jsref_prototype_array.asp
Prototype constructor ทสสำใหค้เรสำเพพิงื่มคถณสมบลัตพิและเมถอดตลัวใหมยู่ ใหค้กลับวลัตถถ Array

รยปแบบกสำรใชค้งสำน

Array.prototype.name = value

Array.prototype ไมยู่ไดค้หมสำยถถึงอสำเรยลเดคียว แตยู่เหมสำยถถึง วลัตถถ Array

Prototype เปป็น Global object constructor ซถึงื่งใชค้ไดค้กลับวลัตถถ Javascript ทถกตลัว


เมงงื่อสรค้สำงคถณสมบลัตพิ ทถกอสำเรยลจะไดค้รลับคถณสมบลัตพิ และคยู่สำของอสำเรยล โดยปรพิยสำย
เมงงื่อสรค้สำงเมถอด ทถกอสำเรยลจะมคีเมถอดตลัวนคีซ
ตลัวอยยู่สำง
สรค้สำงเมถอดใหมยู่ใหค้กลับวลัตถถ Array เพงงื่อจะเปลคีงื่ยนคยู่สำของอสำเรยลเปป็นตลัวพพิมพลใหญยู่

Array.prototype.myUcase = function() {
for (i = 0 ; i < this.length ; i++) {
this[i] = this[i].toUpperCase() ;
}
};

กสำรเรคียกใชค้งสำน

var fruits = [ "Banana", "Orange", "Apple", "Mango" ] ;


fruits.myUcase() ;

14.4. Array.prototype.slice.call(arguments)
Array.prototype.slice.call(arguments)
https://medium.com/@andrewsburke/array-prototype-slice-call-arguments-a94b04e74a4
ตลัวอยยู่สำง
function mysum() {
let argarr = Array.prototype.slice.call(arguments);
return argarr.reduce( (total,item) => total+item ) ;
}
function callpoint(){
const x = mysum(1, 123, 500, 115, 44, 88) ;
Logger.log(x) // 871
}

บททขีริ่ 14 : วลัตถคุ Array 175


176 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)
บททขีที่ 15
เทคนนิคอาเรยร์
15.1. จลับแถวและคอลลัมนย์ใน Google Sheets มสำใสม่อสำเรยย์
ตลัวอยยู่สำงนคีซมคีกสำรเรคียกใชค้เซอรลวพิส SpreadsheeetApp ฉะนลัซนใหค้สรค้สำงไฟลล Google Sheets จสำกนลัซนพพิมพล
ขค้อมยลตลัวอยยู่สำงลงไป ตลัวอยยู่สำงตสำมภสำพ

เมงงื่อเตรคียมขค้อมยลใน Google Sheet พรค้อมแลค้ว ใหค้สรค้สำงโปรเจก็ค Google Apps Script แบบฝฝังไฟลล จสำก
นลัซ นพพิ ม พล โ คค้ ด ตยู่ อ ไปนคีซ ล งไป โดยโคค้ด นคีซ จ ะจลั บ ขค้ อ มย ล ขค้ สำ งตค้ น มสำใสยู่ อ สำเรยล แ ลค้ ว Logs ดย เพงงื่ อ ดย วยู่ สำ Google Apps
Script จลับขค้อมยลมสำเปป็นอสำเรยลอยยู่สำงไร

function getData() {
// จลับชขีนี้ททขีริ่เปปิดไวช้ ในไฟลต์ Google Sheet ใสค่ตลัวแปร sheet
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet() ;
// จลับขช้อมบูลในเรช้นจต์ A2:A5 - 1 คอลลัมนต์
var d1Col = sheet.getRange("A2:A5").getValues() ;
// จลับขช้อมบูลในเรช้นจต์ B1:D1 - 1 แถว
var d1Row = sheet.getRange("B1:D1").getValues() ; // จลับขช้อมบูล 1 แถว
Logger.log(d1Col) ; // ดบูผลทขีริ่ Logs ตค่อ –------ > [ 01 ]
Logger.log(d1Row) ; // ดบูผลทขีริ่ Logs ตค่อ –------ > [ 02 ]
}

ผล
Logs
[ 01 ] [[AAA], [BBB], [CCC], [DDD]] // 1 คอลลัมนต์ - เปป็นอาเรยต์ 2 มรตร
[ 02 ] [[XXX, YYY, ZZZ]] // 1 แถว - เปป็นอาเรยต์ 2 มรตร

15.2. จลับเรค้นจย์ใสม่ในอสำเรยย์ จลับอสำเรยย์ใสม่ในเรค้นจย์ (Google Sheets)

ขค้อนคีซใชค้เซอรลวพิส SpreadsheeetApp และ Method ของคลสำสตยู่สำงๆจสสำนวนหนถึงื่ง แตยู่กก็เปป็น Method พงนซ ๆ


ทคีงื่ใชค้บยู่อยๆ
ใหค้สรค้สำงโปรเจก็ค แลค้วลองพพิมพลโคค้ดเพงงื่อทสสำควสำมเขค้สำใจไปกยู่อน

178 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


15.2.ก.) จตับเรค้นจลใน Google Sheet มาใสยู่ในอาเรยล

ขค้อมยลในไฟลล Google Sheet ทคีชงื่ คีซทชงงื่อ Sheet2 มคีดลังตยู่อไปนคีซ

เรสำสสำมสำรถจลับขค้อมยลทลัซงหมดไปใสยู่ในตลัวแปรอสำเรยลไดค้ดลังนคีซ

function getData() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
var data = sheet.getRange(1 , // เรรริ่มแถวทขีริ่
1
1, // เรรริ่ม
คอลลัมนต์ A
sheet.getLastRow() , // 4 แถว
sheet.getLastColumn()).getValues() ;// 2 คอลลัมนต์
Logger.log(data) ; // ดบูผลทขีริ่ Logs ตค่อ –------ > [ 01 ]
}

ผล – ไดค้อสำเรยล 2 มพิตพิ เปป็นแบบอสำเรยลเสค้น ในอสำเรยลเสค้น

Logs
[ 01 ] [[มะนาว, 12.0], [มะพรค้าว, 35.0], [สค้มโอ, 45.0], [แตงโม, 50.0]]

15.2.ข.) จตับคยู่าในอาเรยล ไปใสยู่ใน Google Sheet


ขค้อนคีซตรงขค้สำมกลับ ขค้อกยู่อนหนค้สำ เรสำจะนสสำคยู่สำในอสำเรยล ไปใสยู่ในไฟลล Google Sheet แทน

function setData() {
var Arr2dim = [
["Linda", 27] , // Arr2dim[0] กก็คอมื อาเรยต์เสช้นนขีนี้
["Lisa", 35] , // Arr2dim[1] กก็คมือ อาเรยต์เสช้นนขีนี้
["John", 42] // Arr2dim[2] กก็คอมื อาเรยต์เสช้นนขีนี้
];
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2") ;
// เรรริ่มทขีริ่ D1 3 แถว 2 คอลลัมนต์
var data = sheet
.getRange(1, 4, Arr2dim.length, Arr2dim[0].length)
.setValues(Arr2dim) ;
}

บททขีริ่ 15 : เทคนรคอาเรยต์ 179


ผล – ดยทคีงื่เซลลล D1:E3

15.3. นสสำคอลลัมนย์ในชคีซทมสำคสสำนวณ แลค้ววสำงไวค้อคีกคอลลัมนย์หนนที่ง (Google Sheets)

ขค้อนคีซ ตยู่อเนงงื่องจสำกขค้อกยู่อนหนค้สำ แตยู่จะเปป็นกสำรนสสำ map มสำใชค้คสสำนวณใน Google Sheets โดย นสสำคอลลัมนล


ในชคีซทมสำคสสำนวณ แลค้ววสำงไวค้อกคี คอลลัมนลหนถึงื่ง
ขค้อมยลในชคีซทมคีดลังตยู่อไปนคีซ

15.3.ก.) พตัฒนาการททที่ 1
จลับขค้อมยลใน Google Sheet มสำ Log ดยกยู่อน เพงงื่อดยวสำยู่ จลับขค้อมยลมสำถยกหรงอเปลยู่สำ

function calcColumn() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2") ;
var data = sheet.getRange(2,1, sheet.getLastRow()-1,
sheet.getLastColumn()).getValues() ;
Logger.log(data) ; // ดบูผลทขีริ่ Logs -------- >
}

ผล

Logs
[[1.0, LibreOffice Calc, 7600.0], [2.0, LibreOffice Base, 9000.0], [3.0, Google Apps,
7600.0], [4.0, Google Sheet, 7600.0], [5.0, Google Apps Script, 9000.0]]

180 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


15.3.ข.) พตัฒนาการททที่ 2

เรสำตค้องกสำรนสสำคอลลัมนล C เทยู่สำนลัซนมสำคสสำนวณ (คอลลัมนล "คยู่าใชค้จยู่าย" ) แลค้ววสำงลงไปในคอลลัมนลทคีงื่ D


อลันดลับแรก คสสำนวณกค้อนขค้อมยลทคีงื่จลับมสำจสำก Google Sheet โดยใชค้ map() ดถึงสมสำชพิกมสำคสสำนวณ จสำกนลัซน
เอสำผลลลัพธลทลัซงกค้อน ใสยู่กลลับไปทคีงื่ Google Sheets

function calcColumn() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2") ;
var data = sheet.getRange(2,1, sheet.getLastRow()-1,sheet.getLastColumn()).getValues() ;
/* [ // คสานวณคอลตัมนลนทนี้
[1.0, LibreOffice Calc, 7600.0],
[2.0, LibreOffice Base, 9000.0],
[3.0, Google Apps, 7600.0],
[4.0, Google Sheet, 7600.0],
[5.0, Google Apps Script, 9000.0] ] */
var calcData = data.map(function(row){
// คกานวณเฉพาะคอลลัมนต์ทขีริ่ 3 – หารดช้วย 8 แลช้วเกก็บคค่าไวช้ในตลัวแปร
var cost = row[2]/8 ;
// return [ row[0] , row[1] , cost ] ;
// ครนกลลับทลันี้งหมด โดยคกานวณบางคอลลัมนต์
return [cost] ; // คมืนกลลับเฉพาะคอลลัมนต์ทคขีริ่ กานวณ
}) /* จบ map / ;
// Logger.log(calcData);
/* [ มท 5 แถว 1 คอลตัมนล
[950.0],
[1125.0],
[950.0],
[950.0],
[1125.0] ] */
// คอลลัมนต์สคุดทช้ายของชขีนี้ท+1 จกานวนสมาชรก จกานวนสมาชรกตลัวแรก(ในอาเรยต์)
// 2 4 5 1
sheet.getRange(2, sheet.getLastColumn()+1, calcData.length, calcData[0].length)
.setValues(calcData) ;
}

ผล – ดยคอลลัมนล D

บททขีริ่ 15 : เทคนรคอาเรยต์ 181


15.4. กรองแถววม่สำง หรรือ แถวทคีที่มคีเซลลย์วม่สำงทพซง
ตลัวอยยู่สำงขค้อมยล ใน Google Sheets มคีดลังตยู่อไปนคีซ

แถววยู่สำง เมงงื่อจลับขค้อมยลมสำเปป็นอสำเรยล จะไดค้เปป็นอสำเรยล 2 มพิตวพิ ยู่สำงๆ กก็คงอ [ [ ] , [ ] , [ ] , [ ] , [ ] , [ ] ]


โคค้ดตยู่อไปนคีซ กรองแถววยู่สำงออก แลค้ววสำงขค้อมยลทคีงื่กรองแลค้วกลลับไปทคีงื่เดพิม
function filterEmptyRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet() ;
var sheetData = ss.getSheetByName("Sheet3") ;
var rawData = sheetData.getRange(2,1,sheetData.getLastRow()-1, sheetData.getLastColumn())
.getValues() ;
// =========== ตลัวตรวจสอบและกรองขช้อมบูล ==================
var fData = rawData.filter(function(row){
return !row.every(function(cell){ // กรองตลัวทขีริ่ไมค่ใชค่(!) ทขีผริ่ ค่านเงมืริ่อนไขมาจาก every-จลับตลัวไมค่วค่าง
return cell == "" ; // ตรวจสอบวค่าทคุกเซลลต์เปป็นคค่าวค่างหรมือไมค่
}); // End – every
}); // End - filter
sheetData.activate().getRange(2,1,sheetData.getLastRow()-1,sheetData.getLastColumn())
.clearContent(); // จลับไปทขีชริ่ ขีนี้ทเดรมทขีริ่มขีขช้อมบูล จากนลันี้นลช้างตลันี้งแตค่แถวทขีริ่ 2 ทรนี้งไป
sheetData.getRange(2,1,fData.length,fData[0].length).setValues(fData);
// Logger.log(fData);
} // End function

182 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


หสำกตค้องกสำรกรองบรรทลัดทคีงื่มคีเซลลลวสำยู่ งเพคียงบสำงเซลลลทพิซง ใหค้เปลคีงื่ยนจสำก every เปป็น some

var fData = rawData.filter(function(row){


return !row.some(function(cell){ // filter ตลัวทขีริ่ไมค่ใชค่(!) ทขีริ่ผค่านเงมืริ่อนไขมาจาก every
return cell == "" ; // ตรวจสอบวค่าทคุกเซลลต์เปป็นคค่าวค่างหรมือไมค่
}); // End – every
}); // End – filter

ผล - กรองบรรทลัดทคีงื่มคีเซลลลวสำยู่ งทพิซง

15.5. กสำรกรองตลัวซสซสำในอสำเรยย์ ใหค้เหลรือแตม่ตลัวทคีที่ไมม่ซสซสำ


ขค้อนคีซ เปป็นกสำรกรองตลัวซสซสำในอสำเรยล ใหค้เหลงอแตยู่ตลัวทคีงื่ไมยู่ซสซสำ
งสำนลลักษณะทคีงื่เรสำตค้องกรองตลัวซสซสำภสำยในอสำเรยลออก เปป็นงสำนทคีงื่เรสำตค้องทสสำบยู่อยๆ เชยู่น จลับคอลลัมนลจสำกในชคีซท
แลค้วกรองตลัวซสซสำออก เปป็นตค้น
หมสำยเหตถุ : ดยเพพิงื่มเตพิมเรงงื่อง Remove duplicates (เมนย Tools → Remove duplicates) เปป็นเครงงื่อง
มงอใน Google Sheets ทคีงื่ใชค้กรองตลัวซสซสำ
15.5.ก.) เทคนพิคททที่ 1 - สตันี้นแตยู่มทประสพิทธพิภาพสยง
โคค้ดตยู่อไปนคีซ เปป็นลอจพิกทคีงื่ใชค้กรองตลัวซสซสำทคีงื่เขคียนโคค้ดไดค้สลัซน แตยู่มคีประสพิทธพิภสำพสยง
var arr = [ "A" , "1" , 2 , 3 , 4 , 5 , 5 , 5 , 7 , 8 , 2 , 3 , 4 , 4 , 3 , 4 , 4 ] ;
var result = [] ;
result = arr.filter(function(item,i){
return arr.indexOf(item) == i ;
// ตลัวอยค่าง
// [ "A" , "1" , 2 , 3 , 4 , 5 , 5 , 5 , 7 , 8 , 2 , 3 , 4 , 4 , 3 , 4 , 4 ] ;
// indexOf(2) 2 (true) 10(false)
// i 0 1 2 3 4 5 6 7 8 8 10 11 12 13 14 15 16
}) ;
Logger.log(result); // พพิมพล : [ A , 1 , 2.0 , 3.0 , 4.0 , 5.0 , 7.0 , 8.0 ]

บททขีริ่ 15 : เทคนรคอาเรยต์ 183


15.5.ข.) เทคนพิคททที่ 2 - แยกสมาชพิกในอาเรยลทซทที่ สนี้าและไมยู่ซสนี้าออกเปป็นอาเรยล 2 กค้อน
โคค้ดตยู่อไปนคีซ แยกสมสำชพิกในอสำเรยลทคีงื่ซสซสำและไมยู่ซสซสำออกเปป็นอสำเรยล 2 กค้อน
var arr = [37, 39, 42, 46, 46, 11, 33, 11] ;
var uniqueDays = [] ;
var dupDays = [] ;
arr.forEach(function(d){
if(uniqueDays.indexOf(d) === -1) {
uniqueDays.push(d) ;
}else{
dupDays.push(d) ;
}
}); // Close forEach
Logger.log(uniqueDays) ; // [ 37.0, 39.0, 42.0, 46.0, 11.0, 33.0 ] // กช้อนทขีริ่ไมค่ซกนี้า
Logger.log(dupDays) ; // [ 46, 11 ] // กช้อนทขีซริ่ กนี้า

ขลัซนตอน
ลยป d uniqueDays uniqueDays.indexOf(d) uniqueDays.push(d)
1 37 [] -1 (false) [37]
2 39 [37] -1 (false) [37, 39]
3 42 [37, 39] -1 (false) [37, 39,42]
4 46 [37, 39,42] -1 (false) [37, 39, 42, 46]
5 46 [37, 39, 42, 46] 3 (true) [37, 39, 42, 46]
6 11 [37, 39, 42, 46] -1 (false) [37, 39, 42, 46, 11]
7 33 [37, 39, 42, 46, 11] -1 (false) [37, 39, 42, 46, 11, 33]
8 11 [37, 39, 42, 46, 11, 33] 4 (true) [37, 39, 42, 46, 11, 33]

15.6. กสำรกรองตลัวซสซสำในอสำเรยย์ ใหค้เหลรือแตม่ตลัวทคีที่มคีกสำรซสซสำ


ปรลังแตค่งจาก
https://stackoverflow.com/questions/840781/get-all-non-unique-values-i-e-duplicate-more-than-one-occurrence-in-an-array

กลลับกลันกลับขค้อกยู่อนหนค้สำ ขค้อนคีซเปป็นกสำรกรองอสำเรยลใหค้เหลงอแตยู่ตวลั ทคีงื่ซสซสำ


var input = [ 'A', 'B', 'C', 'A', 'C', 'A' ] ;
var duplicates = input.reduce(function(acc, el, i, arr) {
if (arr.indexOf(el) !== i && acc.indexOf(el) < 0) {
acc.push(el) ;
} // Close - if
return acc ;
}, [] ) ; // Close - reduce
Logger.log(duplicates) ; // ผล : [ A, C ]

184 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


กสำรวนลยปของโคค้ดขค้สำงตค้น
ลยป acc el i arr arr.indexOf(el) !== i && acc.push(el) return
acc.indexOf(el) < 0
1 [] A 0 [ 'A', 'B', 'C', 'A', 'C', 'A' ] arr.indexOf('A') !== 0 && [] []
acc.indexOf('A') < 0
0 !== 0 && -1 < 0
0 && 1
0 (false)
2 [] B 1 [ 'A', 'B', 'C', 'A', 'C', 'A' ] arr.indexOf('B') !== 1 && [] []
acc.indexOf('B') < 0
1 !== 1 && -1 < 0
0 && 1
0 (false)
3 [] C 2 [ 'A', 'B', 'C', 'A', 'C', 'A' ] arr.indexOf('C') !== 2 && [] []
acc.indexOf('C') < 0
2 !== 2 && -1 < 0
0 && 1
0 (false)
4 [] A 3 [ 'A', 'B', 'C', 'A', 'C', 'A' ] arr.indexOf('A') !== 3 && [A] [A]
acc.indexOf('A') < 0
0 !== 3 && -1 < 0
0 && 1
1 (true)
5 [A] C 4 [ 'A', 'B', 'C', 'A', 'C', 'A' ] arr.indexOf('C') !== 4 && [A,C] [A,C]
acc.indexOf('C') < 0
2 !== 4 && -1 < 0
1 && 1
1 (true)
6 [A,C] A 5 [ 'A', 'B', 'C', 'A', 'C', 'A' ] arr.indexOf('A') !== 5 && [A,C] [A,C]
acc.indexOf('A') < 0
0 !== 4 && 0 < 0
1 && 0
1 (false)

บททขีริ่ 15 : เทคนรคอาเรยต์ 185


15.7. กรองตลัวซสซสำในอสำเรยย์ ใหค้เหลรือแตม่ตลัวทคีที่ Unique
ขค้อนคีซ ใหค้ผลเหมงอนกลับกสำรใชค้ฟฝังกลชลังื่น UNIQUE() ของ Google Sheets
โคค้ด
var arr = [ 'A', 'B', 'C', 'A', 'C', 'A' ] ;
var uniqueInArr = [] ;
arr.forEach(function(item){
if( uniqueInArr.indexOf(item) === -1)
{
uniqueInArr.push(item)
} // Close - if
}) ; // Close - forEach
Logger.log(uniqueInArr) ; // [A, B, C]

15.8. กสำรกรองตลัวซสซสำในอสำเรยย์ 2 มพตพ ใหค้เหลรือแตม่แถวทคีที่ Unique

15.8.ก.) วพิธทททที่ 1

กสำรจลับขค้อมยลจสำก Google Sheets มลักไดค้มสำเปป็นอสำเรยล 2 มพิตพิ กสำรกรองตลัวซสซสำในขค้อนคีซ เหมสำะกลับกสำรกรอง


แถวซสซสำทคีจงื่ ลับมสำจสำก Google Sheets
โคค้ด

const arr = [
[ 1 , 'A' ] ,
[ 2 , 'B' ] ,
[ 3 , 'C' ] ,
[ 1 , 'A' ] ,
[ 1 , 'A' ] ,
[ 2 , 'B' ]
];
var uniques = [] ;
var itemsFound = {} ;
for(let i = 0, l = arr.length ; i < l ; i++) {
var stringified = JSON.stringify(arr[i]) ;
if(itemsFound[stringified]) { continue ; }
uniques.push(arr[i]) ;
itemsFound[stringified] = true ;
}
Logger.log(uniques) ; // [[1.0, A], [2.0, B], [3.0, C]]

186 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


15.8.ข.) วพิธทททที่ 3
How to get distinct values from an array of arrays in JavaScript using the filter() method? [duplicate]
https://stackoverflow.com/questions/57562611/how-to-get-distinct-values-from-an-array-of-arrays-in-javascript-using-the-filte

โคค้ด
let x = [["A", 2], ["B", 4], ["A", 2]] ;
var unique = x.map( ar => JSON.stringify(ar) )
// [ '[A,2]', '[B,4]', '[A,2]' ]
.filter(( itm, idx, arr) => arr.indexOf(itm) === idx )
// [ '[A,2]', '[B,4]' ]
.map( str => JSON.parse(str)) ;
// [ [ A, 2 ], [ B, 4 ] ]
Logger.log(unique) ;
const sum = unique[0][1] + unique[1][1]
console.log(sum) ; // 6

15.9. เปรคียบเทคียบอสำเรยย์ 2 กค้อน

15.9.ก.) เปรทยบเททยบอาเรยล 2 กค้อน เกล็บตตัวททที่ไมยู่ซสนี้ากตันไวค้

ตลัวอยยู่สำง
// อาเรยต์กอช้ นทขีริ่ 1 – ถบูกเปรขียบเทขียบ - จลับจากเรก็นจต์ใน Google Sheets 1 แถว
//
var arrData2Dims = [[ 'D' , 'C' , 'X' , 'B' ]] ;
var arrData1Row = arrData2Dims[0] ; // [D,C,X,B]
// อาเรยต์กอช้ นทขีริ่ 2 – ใชช้เปรขียบเทขียบ - จลับจากเรก็นจต์ใน Google Sheets 1 เซลลต์
//
var findArr = [[ 'X' ]] ;
var findVal = findArr[0][0] ; // X

var filterOut = [] ;
arrData1Row.forEach(function(item){
if(item != findVal){
filterOut.push(item);
}
}) ; // Close - forEach
Logger.log(filterOut) ; // ผล : [ D, C, B ]

บททขีริ่ 15 : เทคนรคอาเรยต์ 187


15.9.ข.) เปรทยบเททยบอาเรยล 2 กค้อน เกล็บตตัวททที่ไมยู่ซสนี้ากตันไวค้ วพิธทท ทที่ 2

ตลัวอยยู่สำง
var arrFrm = [ 1 , 2 , 7 ] ;
var arrFull = [ 0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ] ;

var filOut = [] ;
arrFull.forEach(function(a){
if(arrFrm.indexOf(a) == -1 ){
filOut.push(a) ;
}
}) ;
Logger.log(filOut) ; // ผล : [0.0 , 3.0 , 4.0 , 5.0 , 6.0 , 8.0 , 9.0]
หมายเหตจุ
ถค้สำจะเกก็บตลัวซสซสำบรรทลัด ตยู่อไปนคีซแกค้เปป็น
if(arrFrm.indexOf(a) == -1 ) → if(arrFrm.indexOf(a) != -1 )

15.10. กรองเซลลย์วม่สำงทพซง (ขค้อมมูล 1 คอลลัมนย์)

ขค้อมยลใน Google Sheets ชคีทซ มคีดลังตยู่อไปนคีซ

188 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


โคค้ดตยู่อไปนคีซ จลับคยู่สำในเซลลล A2:F12 แตยู่เซลลล A9:A12 เปป็นเซลลลวยู่สำง ซถึงื่งเรสำจะกรองคยู่สำวยู่สำงทคีงื่จลับมสำไดค้ทพิซงไป
function filterEmpCell(){
var valCatCodes = ss.getRange(' A2:A12')
.getValues()
// [[OTC], [DGG], [DGB], [CTG], [CTB], [OPT], [DCC], [], [], [], []]
.reduce(function(total, value) {
return total.concat(value) ;
},[])
// [OTC, DGG, DGB, CTG, CTB, OPT, DCC, , , , ]
.filter(function(e){
return e ;
// [OTC, DGG, DGB, CTG, CTB, OPT, DCC]
});
Logger.log(valCatCodes) // [OTC, DGG, DGB, CTG, CTB, OPT, DCC]
}

15.11. ใชค้ filter() กรองตสำรสำงขค้อมมูลใน Google Sheet


JavaScript Filter Method Tutorial - Google Sheets Apps Scripts - Array Methods Part 7
https://youtu.be/PT_TDhMhWsE?list=PLv9Pf9aNgemvD9NFa86_udt-NWh37efmD
ตสำรสำงขค้อมยลทคีงื่จะใชค้ทดสอบ มคีขค้อมยลดลังตยู่อไปนคีซ

บททขีริ่ 15 : เทคนรคอาเรยต์ 189


15.11.ก.) พตัฒนาการททที่ 1 : จตับคยู่าในคอลตัมนลมากรอง
กยู่อนองงื่นๆ จลับคยู่สำในคอลลัมนล มสำกรองตสำมเงงงื่อนไข ออกมสำ Log ดยกยู่อน
ตลัวอยยู่สำงโคค้ดนคีซ เอสำเฉพสำะคยู่สำในคอลลัมนล "Instructor" (E) ทคีงื่มคีคสำยู่ เปป็น Por ออกมสำ Log ดย
function filterArr() {
var ss = SpreadsheetApp.getActiveSpreadsheet() ;
var sCrs = ss.getSheetByName("OurCourse") ;
var dCrs = sCrs.getRange(2,1,sCrs.getLastRow()-1,sCrs.getLastColumn()).getValues() ;
var nInstr = "Por" ;
// จลับฟฟังกต์ชลัริ่นทขีใริ่ ชช้กรองยลัดลงไปใน filter เลย
var fData = dCrs.filter(function(row){
return row[4] === nInstr ;
}) ;
Logger.log(fData) ; // ดบูผลทขีริ่ Logs –---------------- >
}

ผล – มคี 2 บรรทลัดทคีงื่ผสำยู่ นกสำรกรอง


Logs
[01] [ [1.0, LibreOffice Writer : Basic, 7600.0, LibreOffice, Por, 6.0],
[3.0, LibreOffice Calc : Basic, 7600.0, LibreOffice, Por, 6.0 ] ]

15.11.ข.) พตัฒนาการททที่ 2 : ใสยู่ผลการกรองกลตับไปททที่ชทนี้ท


เมงงื่อจลับคยู่สำทคีงื่ตค้องกสำรและกรองเรคียบรค้อยแลค้ว ถลัดมสำจะเปป็นกสำรใสยู่กลลับไปใน Google Sheet ทคีงื่ชคีซทใหมยู่ทคีงื่
สรค้สำงโดยใชค้โคค้ด
function filterArr() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sCrs = ss.getSheetByName("OurCourse");
var dCrs = sCrs.getRange(2,1,sCrs.getLastRow()-1,sCrs.getLastColumn()).getValues();
var nInstr = "Por" ;
var fData = dCrs.filter(function(row){ return row[4] === nInstr ; });
// สรช้างชขีนี้ทใหมค่สกาหรลับเกก็บผลการกรอง
var sTarget = ss.insertSheet("Courses by "+ nInstr);
// ใสค่ขช้อมบูลทขีกริ่ รองแลช้ว ลงไปในชขีนี้ท
sTarget.getRange(2, 1 ,fData.length, fData[0].length).setValues(fData);
}

ผล

190 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


15.11.ค.) พตัฒนาการททที่ 3 : กรอง 2 เงรที่อนไข
โคค้ดนคีซจะเปป็นกสำรกรองแบบ 2 เงงงื่อ นไข กก็คง อ กรองผมูค้ส อนเปป็ น Wasankds และ คม่ สำใชค้ จม่สำยตม่อคอรพ์ ส
มสำกกวม่สำ 10,000 บสำท
function filterArr() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sCrs = ss.getSheetByName("OurCourse");
var dCrs = sCrs.getRange(2,1,sCrs.getLastRow()-1,sCrs.getLastColumn()).getValues();
var nInstr = "Wasankds" ;
var fData = dCrs.filter(function(row){ // กรอง 2 เงมืริ่อนไข
return row[4].toLowerCase() === nInstr.toLowerCase() && row[2] > 10000 ;
});
// Logger.log(fData);
// สรช้างชขีนี้ทใหมค่สกาหรลับเกก็บผลการกรอง
var sTarget = ss.insertSheet("Courses by "+ nInstr);
// ใสค่ขอช้ มบูลทขีริ่กรองแลช้ว ลงไปในชขีนี้ท
sTarget.getRange(2,1,fData.length,fData[0].length).setValues(fData);
}

ผล

หมายเหตจุ 1
กรณทกรองแลค้ว ไมม่มทบรรทรดไหนผม่สำนกสำรกรองเลย ใหค้เรสำใชค้ if ตรวจสอบดค้วย ไมยู่เชยู่นนลัซน โคค้ดจะ Error
ในขลัซนตอนเขคียนผลกสำรกรองกลลับไปทคีงื่ Google Sheets ใหค้แกค้โคค้ดเปป็นดลังตยู่อไปนคีซ

if(fData.length > 0) { // ตรวจสอบจกานวนสมาชรกในอาเรยต์ผลการกรอง


sTarget.getRange(2,1,fData.length,fData[0].length).setValues(fData);
} else {
sTarget.getRange(2,1,1.1).setValue("ไมยู่มทขอค้ มยลททที่ผยู่านการกรอง");
};

บททขีริ่ 15 : เทคนรคอาเรยต์ 191


หมายเหตจุ 2
กสำรกรองแบบ 2 เงงงื่อนไข กรณทเชรืที่อมกสำรกรองแบบ Or ใชค้ Operator เปป็น || (Double Pipes) กสำรใชค้งสำน
ยกตลัวอยยู่สำงเชยู่น
var fData = dCrs.filter(function(row){
return row[4] === "Por" || row[4] === "PoE Club" ; // กรอง 2 เงมืริ่อนไขแบบ Or
}) ;

ผล – กรองโดยเชงงื่อมเงงงื่อนไขแบบ Or

15.12. ทสสำ VLOOKUP ดค้วยอสำเรยย์


ในขค้อนคีซ เปป็นตลัวอยยู่สำงกสำรทสสำ Lookup ทคีงื่ใหค้ผลลลัพธลคลค้สำยกลับฟฝังกลชลังื่น VLOOKUP กก็คงอ สยู่งตลัวคค้นหสำไปยลัง
ตสำรสำงขค้อมยล จสำกนลัซนคค้นหสำในคอลลัมนลทคีงื่ระบถ หสำกเจอขค้อมยลทคีงื่ตรงกลันใหค้คงนคยู่สำคอลลัมนลตสำมทคีงื่ระบถในแถวทคีงื่พบ
ขค้อมยลกลลับมสำ
ตรวอยม่สำง – สคีเขคียวคงอตสำรสำงขค้อมยล เซลลล F2 คงอเซลลลทคีงื่จะใชค้ Lookup ถค้สำ Lookup ในตสำรสำงขค้อมยลแลค้ว
แลค้วเจอคยู่สำตรงกลัน จะคงนคยู่สำในแถวเดคียวกลัน คอลลัมนลทคีงื่ 3 กลลับมสำใสยู่ในเซลลล G2

192 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


โคค้ด
var ss = SpreadsheetApp.getActiveSpreadsheet() ;
var sheet = ss.getActiveSheet() ;
// (1.) จลับคค่าในคอลลัมนต์ทขีริ่จะไปคช้นหา >> แปลงเปป็นอาเรยต์ 1 มรตร - เพราะ indexOf ใชช้ไดช้กลับอาเรยต์ 1 มรตเร ทค่านลันี้น
var columnToLookup = sheet.getRange('A2:A13').getValues() ;
columnToLookup = columnToLookup.map(function(r){
return r[0] ;
});
Logger.log(columnToLookup)
// [OTC0020, OTC0021, OTC0022, OTC0023, DGG1520, DGG0715, DGG0017, DCC0050, DCC0040, DCC0030, DCC0020, DCC0010]

// (2.) จลับคค่าทขีใริ่ ชช้เปป็นตลัวคช้นหา เชค่น DGG1520


var lookupValue = ss.getRange('F2').getValue() ;
Logger.log(lookupValue) ; // DGG1520

// (3.) ใชช้คค่าทขีริ่เปป็นตลัวคช้นหา ไปคช้นในคอลตัมนลทขีริ่จลับมา >> ไดช้ดรรนขีตกาแหนค่งกลลับมา (ถช้าไมค่เจอไดช้ -1)


var index = columnToLookup.indexOf(lookupValue) ; // ************
Logger.log(index) ; // 4.0 (แถวทขีริ่ 4+1)

// (4.) กรณขีเจอคยู่าททที่คนช้ หา >> จตับขค้อมยลทตังนี้ แถวททตที่ รงกตันออกมา


var rowData = sheet.getRange('A2:D13').getValues()[index] ;
Logger.log(rowData) ; // [DGG1520, DGG, อาบนกนี้าและตลัดขนหมา (15-20 กก.) , 550.0]

// (5.) กรณขีเจอคค่าทขีคริ่ ช้นหา >> จตับเซลลลในคอลตัมนลทขทที่ ค้อมยลตรงกตันออกมา


var columnToGet = 3 ;
var cellData = sheet.getRange('A2:D13').getValues()[index][columnToGet-1] ;
Logger.log(cellData) ; // อาบนกนี้าและตลัดขนหมา (15-20 กก.)

// (6.) เซก็ตคค่าทขีริ่จบลั มาไดช้ ไปทขีเริ่ ซลลต์ G2


var lookupValue = ss.getRange('G2').setValues([[cellData]]) ;

15.13. ทสสำ Lookup แบบครืนหลสำยคม่สำ


ปรตับแตยู่งจาก
https://stackoverflow.com/questions/36631641/javascript-indexof-method-with-multiple-values
ตรวอยม่สำงททที่ 1 - ในอสำเรยลมคีคสำยู่ ทคีงื่ซสซสำกลันหลสำยตลัว เรสำจะ Lookup เพงงื่อจลับตสสำแหนยู่งวยู่สำ ขค้อมยลทคีงื่เรสำคค้นหสำ อยยยู่
ในตสสำแหนยู่งทคีงื่เทยู่สำไรบค้สำง
function Lookup_return_multiple(){
var array = [ "test234", "test9495", "test234", "test93992", "test234" ] ;
var newArr = [] ;
for ( i=0 ; i<array.length ; i++) {
if (array[i].indexOf("test234") >= 0 ) {
newArr.push(i) ;
}
}
Logger.log(newArr) ; // [0.0, 2.0, 4.0]
}

บททขีริ่ 15 : เทคนรคอาเรยต์ 193


ตรวอยม่สำงททที่ 2 – พลัฒนสำจสำกตลัวอยยู่สำงกยู่อนหนค้สำ เรสำจะจลับคยู่สำทคีงื่ซสซสำกลันออกมสำ

function Lookup_return_multiple(){
var array = [ "test234", "test9495", "test234", "test93992", "test234" ] ;
var newArrData = [] ;
for ( i=0 ; i<array.length ; i++) {
if (array[i].indexOf("test234") >= 0 ) {
newArrData.push(array[i]) ;
}
}
Logger.log(newArrData) ; // [test234, test234, test234]
}

หรงอใชค้ forEach แทน for กก็ไดค้

function Lookup_return_multiple_using_forEach(){
var array = [ "test234", "test9495", "test234", "test93992", "test234" ] ;
var newArrData = [] ;
array.forEach(function(item,i){
if (array[i].indexOf("test234") >= 0 ) {
newArrData.push(array[i]) ;
} ; // Close - if
}) ; // Close - forEach
Logger.log(newArrData) ; // [test234, test234, test234]
}

15.14. วนลมูปเซซ็ตขค้อมมูลลงใน Google Sheets

วพิธคีทคีงื่งสำยู่ ยในกสำรเซก็ตขค้อมยลลงไปใน Google Sheets กก็คงอใชค้ Method setValues แตยู่ตค้องจลับมพิตพิของเรค้นจลใหค้


พอดคี กลับมพิตพิของขค้อมยลทคีงื่จะเซก็ตลงไป
เชยู่น
เรสำจะเซก็ตขค้อมยลลง Name range ทคีงื่มคีมพิตพิ 7x30 แตยู่ขค้อมยลทคีงื่จะเซก็ตลงไปมคีมพิตพิ 7x18 setValues จะใชค้งสำน
ไมยู่ไดค้ วพิธคีแกค้กก็คงอ ใชค้ for 2 ลยปวนเซล็ตขค้อมยลลงไปททละตตัว โดยใชค้ setValue (ไมยู่มคี s)

194 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ตรวอยม่สำง – จลับคยู่สำใน Name range จสำกนลัซนกรองเซลลลวยู่สำงทพิซง แลค้วเซก็ตกลลับไปยลังตสสำแหนยู่งเดพิมใหมยู่
กสำรใชค้งสำนโคค้ดนคีซ สสำมสำรถประยถกตลใชค้ในกสำรโหลดขค้อมยล ไปยลังอคีกชคีซทหรงออคีกไฟลลไดค้
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Test') ;
var nr_dcItemsTable = 'dcItemsTable' // eg. sheet1!A13:G42
// จลับขช้อมบูลใน Name range + กรองแถววค่างทรนี้ง
var dcItemsTable = ss.getRangeByName(nr_dcItemsTable)
.getRangeByName(nr_dcItemsTable)
.getValues()
.filter(function(row){
return !row.every(function(cell){ // กรองตลัวทขีริ่ไมค่ใชค่(!) -
return cell == "" ; // ถช้าวค่างทคุกเซลลต์ใน 1 แถว คมืนคค่า จรรง
}) ; // close – every
}) ; // close - filter
// จลับเซลลต์แรกใน Name range
var nr_dcItemsTable_1st = ss.getRangeByName(nr_dcItemsTable).getCell(1, 1) ; // A13
var nr_dcItemsTable_1st_col = nr_dcItemsTable_1st.getColumn() ; // 13
var nr_dcItemsTable_1st_row = nr_dcItemsTable_1st.getRow() ; // 1
// วนลบูปเซก็ตคค่าลงไปทขีละเซลลต์ - โดยเรรริ่มจากเซลลต์แรกใน Name range
for(var r = 0 ; r < dcItemsTable.length ; r++){ // แตค่ละแถว
for(var c = 0 ; c < dcItemsTable[r].length ; c++){ // แตค่ละคอลลัมนต์ในแตค่ละแถว
sheet.getRange(nr_dcItemsTable_1st_row + r , nr_dcItemsTable_1st_col + c )
.setValue(dcItemsTable[r][c]) ;
} // close - for #2 - inner
} // close - for #1 – outter

15.15. แทรกคอลลัมนย์ลงในอสำเรยย์ 2 มพตพ


ตลัวอยยู่สำงตยู่อไปนคีซ แทรกคอลมลันนลแรกเพพิงื่มใหค้กลับอสำเรยล 2 มพิตพิ
var arr2dim = [ ["Linda", 27, "Bangkok" ] ,
["Lisa", 35, "Nontaburi" ] ,
["John", 42, "Petchaboon" ] ] ;
// แทรกคอลลัมนต์ลงไปทขีริ่ตกาแหนค่งแรกสคุด – ใชช้ unshift
arr2dim.map(function(row) {
return row.unshift('1stCol') ;
}) ;
Logger.log(arr2dim) ;

ผล – สลังเกตถผลลลัพธลทคีงื่ Log map เขค้สำไปเปลคีงื่ยนอสำเรยลดลัซงเดพิม แตยู่ตลัวทคีงื่เขค้สำไปเปลคีงื่ยนคงอ unshift


Logs
[ [ 1stCol, Linda, 27.0, Bangkok ] ,
[ 1stCol, Lisa, 35.0, Nontaburi ] ,
[ 1stCol, John, 42.0, Petchaboon ] ]

บททขีริ่ 15 : เทคนรคอาเรยต์ 195


15.16. จลับคอลลัมนย์ออกมสำจสำกอสำเรยย์ 2 มพตพ

ตลัวอยยู่สำงตยู่อไปนคีซ จลับคอลลัมนลออกมสำจสำกอสำเรยล 2 มพิตพิ ใชค้เทคนพิคงยู่สำยๆ แคยู่เพคียง return คยู่สำกลลับมสำ


โคค้ด
var arr2dim = [ ["Linda", 27, "Bangkok" ] ,
["Lisa", 35, "Nontaburi" ] ,
["John", 42, "Petchaboon" ] ] ;
arr2dim.map(function(row) {
return row[1] ;
}) ;
Logger.log(arr2dim) ; // ดบูผลทขีริ่ Logs ------------------- >
var col1 = arr2dim.map(function(row) {
return row[0] ;
}) ;
Logger.log(col1) ; // ดบูผลทขีริ่ Logs ------------------- >

ผล

Logs
[01] [ [Linda, 27.0, Bangkok] , [Lisa, 35.0, Nontaburi] , [John, 42.0, Petchaboon] ]
[02] [ Linda, Lisa, John ]

15.17. กสำรรวมอสำเรยย์ 2 มพตพ

โคค้ด
var arr2dim = [ ["Linda", 27, "Bangkok" ] ,
["Lisa", 35, "Nontaburi" ] ,
["John", 42, "Petchaboon" ] ] ;
var arr2ad = [ ["X" , "A"] ,
["Y" , "B"] ,
["Z" , "C"] ] ;
var comArr = [arr2dim[0] , arr2ad[0]] // [[Linda, 27.0, Bangkok], [X, A]]
var comArr2 = [...arr2dim[0] , ...arr2ad[0]] // [Linda, 27.0, Bangkok, X, A]
Logger.log(comArr) ;
Logger.log(comArr2) ;
var comArr3 = [] ;
for(let i = 0 ; i < arr2dim.length ; i++){
comArr3.push([...arr2dim[i] , ...arr2ad[i]]) ;
}
Logger.log(comArr3) // ดบูผลทขีริ่ Logs ------------------ >

196 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ผล
[] [ [ Linda, 27.0, Bangkok, X, A ] ,
[ Lisa, 35.0, Nontaburi, Y, B ] ,
[ John, 42.0, Petchaboon, Z, C ] ]

15.18. ทสสำทรสำนสโพสอสำเรยย์ 2 มพตพ

ตลัวอยยู่สำงตยู่อไปนคีซ ทสสำทรสำนสโพสอสำเรยล 2 มพิตพิ กก็คงอ กลลับแถวเปป็นคอลลัมนลกลลับคอลลัมนลเปป็นแถว


// อาเรยต์ 2 มรตร - มขี 1 แถว
var array = [ [ 'A' , 'B' , 'C' , 'D' , 'E' ] ] ;
// แบบทขีริ่ 1
var arrayTran2 = array[0].map((col, i) => array.map(row => [i+1,row[i]] )) ;
// แบบทขีริ่ 2
var arrayTran3 = array[0].map((col, i) => {
return array.map( row => {
return [i+1,row[i]] ;
}) ;
}) ;
// แบบทขีริ่ 3
var arrayTran4 = array[0].map((col, i) => array.map( row => row[i] ) ;
Logger.log(arrayTran2) ; // [[[1.0, A]], [[2.0, B]], [[3.0, C]], [[4.0, D]], [[5.0, E]]]
Logger.log(arrayTran3) ; // [[[1.0, A]], [[2.0, B]], [[3.0, C]], [[4.0, D]], [[5.0, E]]]
Logger.log(arrayTran4) ; // [[A]], [[B]], [[C]], [[D]], [[E]]

15.19. หสำคม่สำสมูงสถุดตสสำสถุดในอสำเรยย์ โดยใชค้ Spread operator – Chrome V8

ถค้สำเปป็น Apps Script หรงอ Javascript รถยู่นเกยู่สำจะทสสำยสำก แตยู่พอเปป็น Chrome V8 หรงอ Javascript ES6
กสำรหสำคยู่สำสยงสถดตสงื่สำสถดในอสำเรยลจะกลสำยเปป็นเรงงื่องงยู่สำย โดยใชค้ Spread operator (3 จจุด)
ตลัวอยยู่สำง
const array = [ 15, 21, 3, 14, 54 ] ;
Logger.log(Math.max(...array) ) ; // 54
Logger.log(Math.min(...array) ) ; // 3

บททขีริ่ 15 : เทคนรคอาเรยต์ 197


15.20. สรค้สำงอสำเรยย์วม่สำง
javascript create empty array of a given size
https://stackoverflow.com/questions/34937349/javascript-create-empty-array-of-a-given-size/34937412
Most efficient way to create a zero filled JavaScript array?
https://stackoverflow.com/questions/1295584/most-efficient-way-to-create-a-zero-filled-javascript-array

ตลัวอยยู่สำง
var len = 5 ;
var x = new Array(len) ;
Logger.log(x) ; // ดบูผลทขีริ่ Logs ------------------- > [ 01 ]
var y = new Array(len).fill(0) ;
Logger.log(y) ; // ดบูผลทขีริ่ Logs ------------------- > [ 02 ]
var z = Array.from({ length: 4 })
Logger.log(z) ; // ดบูผลทขีริ่ Logs ------------------- > [ 03 ]
var w = Array.from({ length: 4 }).map((mem, i) => i)
Logger.log(w) ; // ดบูผลทขีริ่ Logs ------------------- > [ 04 ]

ผล

Logs
[ 01 ] [null, null, null, null, null]
[ 02 ] [0.0, 0.0, 0.0, 0.0, 0.0]
[ 03 ] [null, null, null, null ]
[ 04 ] [0.0, 1.0, 2.0, 3.0]

15.21. สรค้สำงอสำเรยย์วม่สำง 2 มพตพ

15.21.ก.) สรค้างอาเรยลวยู่าง 2 มพิตพิ

สรค้สำงอสำเรยลวยู่สำง 2 มพิตพิ จสสำนวนสมสำชพิกตสำมกสสำหนด


// แถว คอลลัมนต์
var arr2dim = Array.from(Array(5), () => new Array(3)) ;
// หรมือแบบนขีกนี้ ก็ไดช้
// var arr2dim = Array.from(new Array(5), function(){ return new Array(3) })
Logger.log(arr2dim) ;
// [ [null, null, null],
[null, null, null],
[null, null, null],
[null, null, null],
[null, null, null] ]

198 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


สรค้สำงอสำเรยลวยู่สำง 2 มพิตพิ จสสำนวนสมสำชพิกตสำมกสสำหนด วพิธคีทคีงื่ 2 (นยู่สำจะเขค้สำใจงยู่สำยกวยู่สำ)
var arr = Array(2).fill(null).map(() => Array(4)) ;
arr[0][0] = "XX"
Logger.log(arr) ;
// [ [XXl, null, null, null],
[null, null, null, null] ]

15.21.ข.) วนลยปกสาหนดคยู่าใหค้กตับอาเรยล 2 มพิตพิ


ตรวอยม่สำง – วนลยปกสสำหนดคยู่สำใหค้กลับอสำเรยล 2 มพิตพิ
// สรช้างอาเรยต์วค่างขนาด 5x3
var arr2dim = Array.from(new Array(5), function(){ return new Array(3) })
Logger.log(arr2dim) ;
for( let i=0 ; i<arr2dim.length ; i++ ){
for( let j=0 ; j<arr2dim[0].length ; j++ ){
arr2dim[i][j] = "R"+(i+1)+"C"+(j+1)
}
}
Logger.log(arr2dim) ;
[ [R1C1, R1C2, R1C3],
[R2C1, R2C2, R2C3],
[R3C1, R3C2, R3C3],
[R4C1, R4C2, R4C3],
[R5C1, R5C2, R5C3]]

ตรวอยม่สำง – วนลยปกสสำหนดคยู่สำใหค้กลับอสำเรยล 2 มพิตพิ โดยใชค้คสำยู่ จสำกสมสำชพิกของอสำเรยลตลัวองงื่นๆ


const rows = [11,12,13,14,15,16,17,18]
const cols = ["A","B","C"]
var arr2dim = Array.from(Array(rows.length), () => new Array(cols.length)) ;
for( let i=0 ; i<arr2dim.length ; i++ ){
for( let j=0 ; j<arr2dim[0].length ; j++ ){
arr2dim[i][j] = cols[j]+rows[i]
}
}
Logger.log(arr2dim) ;
[ [A11, B11, C11],
[A12, B12, C12],
[A13, B13, C13],
[A14, B14, C14],
[A15, B15, C15],
[A16, B16, C16],
[A17, B17, C17],
[A18, B18, C18] ]

บททขีริ่ 15 : เทคนรคอาเรยต์ 199


15.22. SUM แถวและคอลลัมนย์ในอสำเรยย์ 2 มพตพ
โคค้ด
function myFunction() {
const arr = [
[1, 22, 111 ],
[2, 15, 125],
[3, 12, 215],
[4, 30, 230]
];
// SUM of each ROWS =======================
arr.map( (row,i,self) => {
return self[i].push( row.reduce( (total, cval) => total + cval,0) )
})
Logger.log(arr) ;
// [[1.0, 22.0, 111.0, 134.0],
// [2.0, 15.0, 125.0, 142.0],
// [3.0, 12.0, 215.0, 230.0],
// [4.0, 30.0, 230.0, 264.0]]

// SUM of each COLUMNS =======================


var sumCols = []
arr.forEach( (row) =>{
row.forEach( (cell,j) => {
if(sumCols[j]){
sumCols[j] += cell ;
}else{
sumCols[j] = cell ;
} // else
}) // forEach
}) // forEach

Logger.log(sumCols) ;
// [10.0, 79.0, 681.0, 770.0]
//===============================================
// แทรกไวช้แถวลค่างสคุด
arr.push(sumCols)
Logger.log(arr) ;
// [[1.0, 22.0, 111.0, 134.0],
// [2.0, 15.0, 125.0, 142.0],
// [3.0, 12.0, 215.0, 230.0],
// [4.0, 30.0, 230.0, 264.0],
// [10.0, 79.0, 681.0, 770.0]]
}

200 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


15.23. กรองคอลลัมนย์ในอสำเรยย์ 2 มพตพ
Best Way to Filter Certain Columns in an Array of Arrays in Javascript
https://stackoverflow.com/questions/45345936/best-way-to-filter-certain-columns-in-an-array-of-arrays-in-javascript

โคค้ด
function callFil(){
var indexlist = [0, 2, 3] ;
var arr2dims = [ // 0 1 2 3 4
['a', 'b', 'c', 'd', 'e'] ,
['m', 'n', 'o', 'p', 'q'] ,
['t', 'u', 'v', 'w', 'x'] ]
Logger.log(shortenedCol(arr2dims,indexlist)) ;
}
function shortenedCol(arr2dims, indexlist) {
return arr2dims.map(function(array) {
return indexlist.map(function(idx) {
return array[idx] ;
}) ;
}) ;
}

ผล
Logs
// 0 2 3
[ [a, c, d ],
[m, o, p ],
[t, v, w ] ]

ทดสอบ เพงงื่อควสำมเขค้สำใจทคีงื่งยู่สำยขถึซน
var arr2dims = [ // 0 1 2 3 4
['a', 'b', 'c', 'd', 'e'] ,
['m', 'n', 'o', 'p', 'q'] ,
['t', 'u', 'v', 'w', 'x'] ]
var newarr = arr2dims.map( row => [ row[0], row[2], row[3]] )
Logger.log(newarr) ;

ผล – ใหค้ผลเหมงอนกลัน แตยู่ตลัวอยยู่สำงนคีซฟปิกซลคอลลัมนล เพงองื่ ใหค้เขค้สำใจงยู่สำยขถึซน เพรสำะเหลงอแคยู่ลยปเดคียว


Logs
// 0 2 3
[ [a, c, d] ,
[m, o, p] ,
[t, v, w] ]

บททขีริ่ 15 : เทคนรคอาเรยต์ 201


202 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)
บททขีที่ 16
รลูรู้จลักกลับ
Google Services
16.1. สรถุป OOP
Google Apps Script มคีโครงสรค้สำงกสำรเขคียนโปรแกรมเหมงอนกลับ Java Script

โครงสรค้สำงกสำรเขคียนโปรแกรมของ Google Apps Script เปป็นแบบ OOP(Object-Oriented


Programming) หรงอ การเขทยนโปรแกรมเชพิงวตัตถจุ

ผยค้เขคียนพยสำยสำมจะอธพิบสำยเรงงื่องของ OOP ใหค้งสำยู่ ยทคีงื่สถด ดลังนคีซ


Programming กก็คงอ กสำรเขค้สำไปควบคถุมหรรือสรที่งงสำน โดยสพิงื่งทคีงื่เรสำจะเขคียนโปรแกรมเขค้สำไปควบคถม จะถยก
มองวยู่สำเปป็นวรตถถุ(Objects) เชยู่น ไฟลล, โฟลเดอรล, ตสำรสำงคสสำนวณ, เอกสสำร เปป็นตค้น
วลัตถถมคี คถุณสมบรตพิ(Properties) หรงอ คถุณลรกษณะ(Attributes) เชยู่น สคี, ขนสำด เปป็นตค้น และวลัตถถ
สสำมสำรถทสสำสพิงื่งตยู่สำงๆไดค้ตสำมคสสำสลังื่ง (Methods) เชยู่น ยค้สำย, จลับ, หนคีบ, หมถน เปป็นตค้น วลัตถถสสำมสำรถประกอบไป
ดค้วยวลัตถถยยู่อยๆไดค้อคีก เปป็นวรตถถุลมูกหลสำน ซถึงื่งกก็มคี Properties และ Methods ดค้วยเชยู่นเดคียวกลัน
เมงงื่อ Google ออกแบบอะไรมสำใหค้เรสำใชค้งสำน เรสำจะเรคียกวยู่สำ เซอรพ์วพิส(Services) หรงอ บรพิกสำร ซนที่งภสำยใน
บรพิกสำรจะประกอบไปดค้วยวรตถถุตสำม่ งๆนสำนสำ
ตลัวอยยู่สำงทคีงื่มลักจะยกขถึซนมสำเปรคียบเทคียบกลัน กก็คงอ บรพิกสำรรถยนตพ์
บรพิกสำรรถยนตพ์ มคี วรตถถุหลรกททที่เรสำจะควบคถุม กก็คงอ ตรวรถยนตพ์ มคี คถุณสมบรตพิ(Properties) สคี, นสซสำหนลัก,
ยคีงื่หค้อ เปป็นตค้น และรถยนตลสสำมสำรถทสสำตสำมคสสำสลังื่งไดค้(Methods) เชยู่น เรยู่งควสำมเรก็ว, เหยคียบเบลค เปป็นตค้น ตลัว
รถยนตลประกอบไปดค้วยวลัตถถยยู่อยๆมสำกมสำย เชยู่น ประตย, ครลัช, คลันเรยู่ง, ลค้อ เปป็นตค้น
เมงงื่อคยู่สำยรถยนตลทสสำรถมสำขสำย เขสำไดค้ทสสำรถยนตพ์มสำเรทยบรค้อยแลค้ว หรงอ มทบรพิกสำรเตรทยมไวค้แลค้ว ในสยู่วนของ
เรสำหรงอผยค้ใชค้งสำน กก็คงอ เลรือกรถททที่ใชม่รถุม่นททที่ชอบ จสำกนลัซนกก็ นสสำรถมสำใชค้งสำนตสำมททรที่ ถยนตพ์จะทสสำไดค้

16.2. Google Services (G Suite services)


G Suite services
https://developers.google.com/apps-script/reference
Google Services กซ็คลค้สำยกรบกสำรทสสำรถยนตพ์ออกมสำขสำย
Google Services หรงอ บรพิกสำรจสำก Google สสสำหรลับนลักพลัฒนสำหรงอนลักเขคียนโปรแกรม เพงองื่ ควบคถม กสำรใชค้
งสำน Google Apps มคีมสำกกวยู่สำ 30 เซอรลวพิส(Services) เชยู่น เซอรลวพิส Spreadsheet, เซอรลวพิส Document
เปป็นตค้น โดยแตยู่ละเซอรลวพิสประกอบไปดค้วย วรตถถุ(Objects) มสำกมสำยหลสำยตลัว ซถึงื่งบยู่อยครลัซงเรคียกวลัตถถวยู่สำ
คลสำส(Class) เชยู่น เซอรลวพิส Spreadsheet ประกอบไปดค้วย คลสำส Range, คลสำส Sheet เปป็นตค้น
เซอรพ์วสพิ ของ Google เปป็นสพิที่งททที่ Google จรดเตรทยมไวค้ใหค้แลค้ว ทคีงื่เหลงอเรสำกก็แคยู่เลงอกและนสสำมสำโปรแกรมใหค้
ตรงตสำมวลัตถถประสงคลของเรสำ โดยกสำรเขคียนโปรแกรมเขค้สำไปควบคถม ตสำม Methods หรงอ Properties ทคีงื่ Objects
หรงอ Class มคีใหค้

204 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


เชยู่น
เซอรลวพิส Spreadsheet เรพิงื่มตค้นจสำกคลสำส SpreadsheetApp ซถึงื่งมคี Method เชยู่น openById() ใชค้สสสำหรลับ
เปปิดไฟลล Google Sheet โดยระบถ ID ของไฟลลลงใน () นอกจสำกนคีซคลสำส SpreadsheetApp มคี Property เชยู่น
BandingTheme ซถึงื่งเกก็บชงงื่อของรยปแบบของ Alternating Colors ไวค้

16.3. กสำรเรคียกใชค้ Google Services


กสำรเขคียนโปรแกรมเพงงื่อใชค้บรพิกสำร Google Services อสำศลัยกสำรเขค้สำไปจลับวลัตถถเรพิงื่มตค้นกยู่อน จสำกนลัซนจถึงคยู่อยๆ
ลงลถึกลงไป จนถถึงวลัตถถทคีงื่เรสำจะควบคถม ซถึงื่งเรสำเรคียกวยู่สำ Chainning(การรค้อยโซยู่)
เมงงื่อจลับสพิงื่งทคีงื่ตค้องกสำรไดค้แลค้ว กก็กสสำหนดคถณสมบลัตพิ หรงอใชค้เมถอด สลังื่งงสำนใหค้วตลั ถถทสสำอะไรกก็วยู่สำไป
Google Services มทโครงสรค้สำงกสำรเเรทยกใชค้งสำน ไดค้ดลังนคีซ

GlobalObjectName.methodName(argument1, argument2, ..., argumentN) ;

GlobalObjectName เปป็นชงงื่อคลสำสในเซอรลวพิส เชยู่น MailApp, SpreadsheetApp, DocumentApp


เปป็นตค้น
ตรวอยม่สำง โคค้ดตยู่อไปนคีซ เรคียกใชค้เมถอดชงงื่อ sendMail() ในคลสำส GmailApp เพงงื่อสยู่งอคีเมลล

GmailApp.sendEmail('claire@example.com', 'Subject line', 'This is the body.') ;

ตรวอยม่สำงวรตถถุรถยนตพ์
กสำรเรคียกใชค้งสำนเซอรลวพิส เพงงื่อเขค้สำไปควบคถมวลัตถถหรงอคลสำส เพงงื่อใหค้เขค้สำใจงยู่สำย ขอยกตลัวอยยู่สำง วรตถถุรถยนตพ์
ตลัวอยยู่สำงตยู่อไปนคีซ เรสำจะสลังื่งงสำนใหค้รถยนตลขลับทคีงื่ควสำมเรก็ว 80 ซถึงื่งสสำมสำรถเขคียนเปป็นโคค้ดไดค้ดลังตยู่อไปนคีซ

// Object.Object.Method(Value)
รถยนตล.คตันเรยู่ง.เหยทยบคตันแรยู่ง(80) ;

ตรวอยม่สำงกสำรเรทยกใชค้คลสำส Math
คลสำส Math เปป็น Built-in Services ของ Google ทคีงื่มคีกสำรใชค้งสำนเหมงอนคลสำส Math ของ JavaScript
ตลัวอยยู่สำงโคค้ดตยู่อไปนคีซ เรคียกใชค้ Method ชงงื่อ pow() ของคลสำส Math เพงงื่อคสสำนวณเลขยกกสสำลลัง จสำกนลัซนเกก็บคยู่สำไวค้ใน
ตลัวแปร numPow
Math object ของ JavaScript
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math

var numPow = Math.pow(2,3) ;


Logger.log(numPow) ; // พรมพต์ : 8

บททขีริ่ 16 : รบูช้จลักกลับ Google Services 205


เรทยกใชค้บรพิกสำรในคลสำสยม่อย
กรณคีเมถอดทคีงื่เรสำเรคียกใชค้บรพิกสำร คงนคยู่สำกลลับมสำเปป็นคลสำสองงื่น ยกตลัวอยยู่สำง
DocumentApp.create('New document') ;
เมถอดชงงื่อ create() คงนคยู่สำกลลับมสำเปป็นคลสำส Document เรสำจถึงสสำมสำรถรค้อยเมถอดของคลสำสเขค้สำดค้วยกลัน
ในบรรทลัดเดคียว(Chaining method) โดยใชค้ . (Period หรรอ จจุด) ตยู่อกลันไปเรงงื่อยๆ เพงองื่ เขค้สำถถึงวลัตถถหรงอคลสำสทคีงื่เรสำ
ตค้องกสำรจะควบคถม
ตรวอยม่สำง - โคค้ดตยู่อไปนคีซสรค้สำงไฟลล Google Docs ไฟลลใหมยู่ โดยตลัซงชงงื่อไฟลลวสำยู่ New document และพพิมพล
ยยู่อหนค้สำทคีงื่มคีขค้อควสำม New paragraph ลงไป

// สรช้างไฟลต์ Google Docs ชมือริ่ New document … แลช้วจลับใสค่ตลัวแปรชมืริ่อ doc ไวช้


var doc = DocumentApp.create('New document') ;
// จลับไปทขีริ่ Body ของเอกสาร New document ใสค่ตลัวแปรชมืริ่อ body ไวช้
var body = doc.getBody() ;
// พรมพต์ตอค่ ทช้าย ดช้วยยค่อหนช้าทขีมริ่ ขีขช้อความ New paragraph
body.appendParagraph('New paragraph.') ;

โคค้ดตยู่อไปนคีซ ใหค้ผลลลัพธลลเหมงอนกลับขค้สำงบน แตยู่เขคียนโคค้ดโดยรค้อยกลันเปป็นบรรทลัดเดคียว

DocumentApp.create('New document').getBody().appendParagraph('New paragraph.') ;

โคค้ดขค้สำงตค้น เขคียนไวค้คนละบรรทลัดกก็ไดค้ ดลังนคีซ

DocumentApp.create('New document')
.getBody()
.appendParagraph('New paragraph.') ;

16.4. Enum หรรือ Enumeration


Enum (Enumeration) เปป็นกสำรแจกแจงคถณสมบลัตพิของวลัตถถ วยู่สำวลัตถถมคีคถณสมบลัตพิอะไรบค้สำง เพงงื่อทคีงื่เรสำจะ
สสำมสำรถเขค้สำไปเปลคีงื่ยนหรงอดถึงคยู่สำของคถณสมบลัตพิออกมสำดยไดค้
ยกตลัวอยยู่สำง
วรตถถุลค้อรถยนตพ์ มคีคถณสมบลัตพิอะไรบค้สำง ผยค้ผลพิตกก็จะแจกแจงมสำใหค้เลย เชยู่น สคี, ขนสำด, รสำคสำ เปป็นตค้น จสำกนลัซน
กก็มลัดรวมกลันไวค้ แลค้วตลัซงชงงื่อวยู่สำ ENUM ลค้อรถยนตล เปป็นตค้น
ในกรณคีของ Google Apps วลัตถถตยู่สำงชนพิดกลัน สสำมสำรถมคี Enum ตลัวเดคียวกลันไดค้ เพรสำะคถณสมบลัตพิใกลค้เคคียง
กลันมสำก จถึงไมยู่จสสำเปป็นตค้องมคี Enum เฉพสำะวลัตถถ เพรสำะ Enum จะมสำกเกพินไป เชยู่น ตตัวอตักษร(Characters) และ
ยยู่อหนค้า(Paragraph) ใชค้ Enum ตลัวเดคียวกลันไดค้ แตยู่คถณสมบลัตพิใน Enum บสำงตลัวอสำจไมยู่มคี

206 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ยกตลัวอยยู่สำง Enum Attribute ในคลสำส Document
Enum Attribute(คจุณลตักษณะ) เปป็นกสำรแจกแจงคถณลลักษณะของวลัตถถ เชยู่นคถณสมบลัตพิ BOLD กก็คงอ
คจุณสมบตัตพิตตัวหนาของอตักษร เปป็นตค้น

เรสำสสำมสำรถเขค้สำถถึง Enum Attribute ไดค้โดยใชค้โคค้ด ทคีงื่มคีโครงสรค้สำงดลังนคีซ


// Class Enum Property
DocumentApp.Attribute.[Property]

โดย Properties ใน Enum Attribute สสำมสำรถดยไดค้จสำกตสำรสำงตยู่อไปนคีซ


( ทขีริ่มา https://developers.google.com/apps-script/reference/document/attribute )
Property Description
BACKGROUND_COLOR The background color of an element (Paragraph, Table, etc) or document.
BOLD The font weight setting, for rich text.
BORDER_COLOR The border color, for table elements.
BORDER_WIDTH The border width in points, for table elements.
CODE The code contents, for equation elements.
FONT_FAMILY The font family setting, for rich text.
FONT_SIZE The font size setting in points, for rich text.
FOREGROUND_COLOR The foreground color setting, for rich text.
HEADING The heading type, for paragraph elements (for example, DocumentApp.).
HEIGHT The height setting, for image elements.
HORIZONTAL_ALIGNMENT The horizontal alignment, for paragraph elements (for example, DocumentApp.).
INDENT_END The end indentation setting in points, for paragraph elements.
INDENT_FIRST_LINE The first line indentation setting in points, for paragraph elements.
INDENT_START The start indentation setting in points, for paragraph elements.
ITALIC The font style setting, for rich text.
GLYPH_TYPE The glyph type, for list item elements.
LEFT_TO_RIGHT The text direction setting, for rich text.
LINE_SPACING The line spacing setting as a multiplier, for paragraph elements.
The link URL, for rich text. The default link style (foreground color, underline) is
LINK_URL automatically applied.
LIST_ID The ID of the encompassing list, for list item elements.
MARGIN_BOTTOM The bottom margin setting in points, for paragraph elements.
MARGIN_LEFT The left margin setting in points, for paragraph elements.
MARGIN_RIGHT The right margin setting in points, for paragraph elements.
MARGIN_TOP The top margin setting in points, for paragraph elements.
NESTING_LEVEL The item nesting level, for list item elements.
MINIMUM_HEIGHT The minimum height setting in points, for table row elements.
PADDING_BOTTOM The bottom padding setting in points, for table cell elements.
PADDING_LEFT The left padding setting in points, for table cell elements.
PADDING_RIGHT The right padding setting in points, for table cell elements.
PADDING_TOP The top padding setting in points, for table cell elements.
PAGE_HEIGHT The page height setting in points, for documents.
PAGE_WIDTH The page width setting in points, for documents.
SPACING_AFTER The bottom spacing setting in points, for paragraph elements.
SPACING_BEFORE The top spacing setting in points, for paragraph elements.
STRIKETHROUGH The strike-through setting, for rich text.
UNDERLINE The underline setting, for rich text.
VERTICAL_ALIGNMENT The vertical alignment setting, for table cell elements.
WIDTH The width setting, for table cell and image elements.

บททขีริ่ 16 : รบูช้จลักกลับ Google Services 207


ตรวอยม่สำง - ใหค้สรค้สำงไฟลล Google Docs จสำกนลัซน สรค้สำงโปรเจก็ค Google Apps Scritpt แบบฝฝัง และเขคียน
โคค้ดดลังตยู่อไปนคีซลงไป
function getAttributes_test() {
// จลับไปทขีริ่สค่วน Body ของไฟลต์ Google Docs ทขีริ่โคช้ดฝฟังอยบูค่
var body = DocumentApp.getActiveDocument().getBody() ;
// พรมพต์ยค่อหนช้าทขีริ่มขีขช้อความตค่อทช้ายสคุด + ทกาตลัวหนา + ทกาตลัวเอขียง
var par = body.appendParagraph('A bold, italicized paragraph.') ;
par.setBold(true) ; // ทกาตลัวหนา
par.setItalic(true) ; // ทกาตลัวเอขียง
// จลับ Attributes ของยค่อหนช้าขช้างบน ใสค่ตลัวแปร atts
var atts = par.getAttributes() ;
Logger.log(atts) ; // Logs ดบู Attributes ของยค่อหนช้า
// ดบูผลทขีริ่ Logs ----------------------------- >
// วนลบูป Logs ดบู Attributes(Property และ Value) ของยค่อหนช้า ทขีริ่เกก็บอยบูค่ในตลัวแปร atts
for (var att in atts) {
// Property Value
Logger.log(att + ":" + atts[att]) ; // ดบูผลทขีริ่ Logs ----------------- >
} // จบลบูป for
} // จบฟฟังกต์ชลัริ่น

ผลหลลังรลันโคค้ด - พพิมพลยยู่อหนค้สำทคีงื่มคีขค้อควสำม A bold, italicized paragraph. และ กสสำหนดตรวอรกษรเปป็น


ตรวหนสำ และเอทยงทรรั้งยม่อหนค้สำ ตสำมภสำพ

ผลจสำกบรรทลัด Logger.log(atts); ไดค้ผลลลัพธลดลังตยู่อไปนคีซ - จะเหก็นวยู่สำ atts เปป็นตลัวแปร Object หสำกจะจลับ


แตยู่ละ Item ในตลัวแปร Object ออกมสำดย จถึงตค้องใชค้ for/in วนลยปเขค้สำไป
Logs
[ 01 ] {FONT_SIZE=null, ITALIC=true, HORIZONTAL_ALIGNMENT=Left,
INDENT_END=0.0, INDENT_START=0.0, LINE_SPACING=1.15, LINK_URL=null,
UNDERLINE=null, BACKGROUND_COLOR=null, INDENT_FIRST_LINE=0.0,
LEFT_TO_RIGHT=true, SPACING_BEFORE=0.0, HEADING=Normal,
SPACING_AFTER=0.0, STRIKETHROUGH=null, FOREGROUND_COLOR=null, BOLD=true,
FONT_FAMILY=null}

208 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ผลจสำกวนลยป for/in เพงงื่อดย Attributes(Property และ Value) ของยยู่อหนค้สำไดค้ผลลลัพธลดลังตยู่อไปนคีซ
Properties ตยู่สำงๆทคีงื่ปรสำกฎใน Logs มคีอยยใยู่ นตสำรสำง Enum Attribute (แตยู่ไมยู่ครบทลัซงหมด) นอกจสำกนคีซ
แตยู่ละ Property มคี Value(คยู่สำของคถณสมบลัตพิ) ระบถไวค้ดวค้ ย เชยู่น ITALIC:true กก็คงอ เปป็นอลักษรตลัวเอคียง(จรพิง)
Logs
[01] FONT_SIZE:null
[02] ITALIC:true // โคช้ดตลันี้งเปป็นตลัวเอขียงไวช้
[03] HORIZONTAL_ALIGNMENT:Left
[04] INDENT_END:0
[05] INDENT_START:0
[06] LINE_SPACING:1.15
[07] LINK_URL:null
[08] UNDERLINE:null
[09] BACKGROUND_COLOR:null
[10] INDENT_FIRST_LINE:0
[11] LEFT_TO_RIGHT:true
[12] SPACING_BEFORE:0
[13] HEADING:Normal
[14] SPACING_AFTER:0
[15] STRIKETHROUGH:null
[16] FOREGROUND_COLOR:null
[17] BOLD:true // โคช้ดตลันี้งเปป็นตลัวหนาไวช้
[18] FONT_FAMILY:null

หมสำยเหตถุ : ทคีงื่มสำของโคค้ดขค้สำงตค้นกก็คงอ
https://developers.google.com/apps-script/reference/document/body#getattributes
getAttributes() เปป็นเมถอดในคลสำส Body/Text ใชค้จลับ Attributes ของวลัตถถ โดยจะคงนคยู่สำกลลับมสำเปป็น
Enum Attribute

16.5. Interfaces
Interfaces เปป็นบรพิกสำรหรงอเปป็นสยู่วนทคีงื่บอกวยู่สำวลัตถถนลัซนๆ สสำมสำรถทสสำอะไรไดค้บค้สำง หรงอเปป็นกลถยู่มของ เมถ
ถอด(Methods)ของวลัตถถ Interfaces มลักใชค้เรคียกเมถอดรวมๆของวลัตถถ

โดยปกตพิ ผยค้เขคียนมลักไมยู่คยู่อยใชค้คสสำวยู่สำ Interfaces ในกสำรสงองื่ ถถึงเมถอดของวลัตถถหรงอคลสำส แตยู่จะใชค้คสสำวยู่สำ เม


ถอดอยยู่สำงเดคียวอยยยู่บยู่อยๆ
แตยู่ทคีงื่ตค้องทสสำควสำมเขค้สำใจกลับคสสำวยู่สำ Interfaces เพรสำะเมถอดของวลัตถถบสำงตลัว คงนคยู่สำกลลับมสำเปป็น Interfaces
ของวลัตถถอคีกตลัวหนถึงื่ง กก็คงอ คงนคยู่สำกลลับมสำเปป็นเมถอดของวลัตถถอคีกตลัวหนถึงื่งนลังื่นเอง ฉะนลัซน เรสำจะไดค้ไมยู่ตค้องงงวยู่สำ
Interfaces คงออะไร

อยยู่สำสลับสนระหวยู่สำง User Interfaces และ Interfaces


User Interfaces เปป็นสยู่วนของหนค้สำตสำของโปรแกรม เชยู่น เมนยหรงอไซดลบสำรล เปป็นตค้น สยู่วน Interfaces
ทคีงื่อธพิบสำยในขค้อนคีซ เปป็นกลถยู่ม Methods ของวลัตถถหรงอคลสำส

บททขีริ่ 16 : รบูช้จลักกลับ Google Services 209


ยกตลัวอยยู่สำง Interface Element ของเซอรลวพิส DocumentApp
https://developers.google.com/apps-script/reference/document/element
เอกสสำร Google Docs ประกอบไปดค้วย Elements ตยู่สำงๆ เชยู่น ListItem (หตัวขค้ออตัตโนมตัตพิ เชยู่น Bullets
หรรอ Numbering), Paragraph(ยยู่อหนค้า) และ Table(ตาราง) เปป็นตค้น ทถกตลัวกก็คงอ Element ซถึงื่งมคีเมถอดกลถยู่ม
หนถึงื่งทคีงื่ซสซสำกลัน กก็เลยถยกจลับมสำมลัดรวมกลัน (Inherit หรงอสงบทอดสพิงื่งทคีงื่ซสซสำกลันออกมสำ) กลสำยเปป็น Interface
Element หรงอ เปป็นกลจุมยู่ เมถอดวตัตถจุ Element

เมถอดใน Interface Element ยกตลัวอยยู่สำงเชยู่น getAttributes(), เมถอดตระกยล as เชยู่น


asParagraph() เปป็นตค้น

อยยู่สำสลับสลันกลับ คลาส Element(ตสำมลพิงคลดค้สำนลยู่สำง) เพรสำะเปป็นคนละตลัวกลัน คลาส Element เปป็นวลัตถถ


สยู่วน Interface Element เปป็นกลถยู่มของเมถอด ของวตัตถจุ Element
( Class Element https://developers.google.com/apps-script/reference/xml-service/element )

ยกตรวอยม่สำง
องคลประกอบในสยู่วน Body ในเอกสสำร Google Docs มคีตสำมภสำพ

โคค้ดตยู่อไปนคีซ จลับ Elements ใน Body ของเอกสสำร Google Docs มสำ Log ดยวยู่สำมคีชนพิดเปป็นอะไรบค้สำง
function testElem() {
var body = DocumentApp.getActiveDocument().getBody();
var elemInBody = body.getNumChildren();
for(var x = 0 ; x < elemInBody ; x++){
Logger.log(body.getChild(x).getType());
};
}

210 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


ผลหลลังรลัน
Logs
[ 01 ] PARAGRAPH
[ 02 ] TABLE
[ 03 ] LIST_ITEM
[ 04 ] LIST_ITEM
[ 05 ] LIST_ITEM
[ 06 ] PARAGRAPH

หมสำยเหตถุ
ดยรสำยละเอคียดเพพิงื่มเตพิมไดค้จสำกลพิงคลตยู่อไปนคีซ
getType() - Method ใน Interface Element
https://developers.google.com/apps-script/reference/document/element#gettype
ใชค้จลับชนพิดของ ELement คงนคยู่สำกลลับมสำเปป็น Enum ElementType
Enum ElementType – แจกแจงชนรดของ Elements
https://developers.google.com/apps-script/reference/document/element-type.html

getChild – Method ในคลาส ContainerElement/Element


https://developers.google.com/apps-script/reference/document/container-element#getchildchildindex
https://developers.google.com/apps-script/reference/xml-service/element#getchildname
ใชค้จลับ Element ตสำมดรรชนคีลสสำดลับ เชยู่น getChild(0) เปป็นตค้น คงนคยู่สำกลลับมสำเปป็น Element
getNumChildren() – Method ในคลาส ContainerElement
https://developers.google.com/apps-script/reference/document/container-element#getnumchildren
ใชค้จลับจสสำนวน Elements คงนคยู่สำกลลับมสำเปป็น เลขจสสำนวนเตก็ม

บททขีริ่ 16 : รบูช้จลักกลับ Google Services 211


212 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)
บททขีที่ 17
คลาส Logger
และ console
17.1. คลสำส Logger
Class Logger
https://developers.google.com/apps-script/reference/base/logger?hl=th
คลสำส Logger เปป็นหนค้สำตยู่สำง Console ทคีงื่ใชค้แสดงผลลลัพธลลจสำกกสำรรลันโคค้ด
Methods ของคลสำส Logger มคีดลังตยู่อไปนคีซ
Method Return type Brief description
clear() void ลช้าง log
getLog() String คมืนคค่าเปป็นรายการของขช้อความใน log ปฟัจจคุบลัน
log(data) Logger เขขียนสตรรงไปทขีริ่ logging console
เขขียนสตรรงทขีริ่ถบูกจลัดรบูปแบบไปทขีริ่ logging console
log(format,values) Logger
โดยใชช้รบูปแบบและคค่าทขีริ่ระบคุ

17.2. log()
log() เปป็นเมถอดทคีงื่ใชค้เขคียนผลจสำกกสำรรลันโคค้ด ใหค้อยยยู่ในรยปแบบขค้อควสำมลงในหนค้สำตยู่สำง Console (ขณะอยยยู่
ในหนค้สำโปรเจก็ค Google Apps Script กด <Ctrl><Enter> เพงงื่อเปปิด Logs )
สสำมสำรถใชค้ %s ใสยู่ลงไปใน log() เพงงื่อรลับคยู่สำจสำกตลัวแปรมสำใสยู่ หรงอ จะใสยู่ตลัวแปรตรงๆลงไปใน log() กก็ไดค้
แตยู่กก็จะมคีควสำมแตกตยู่สำงกลัน ใหค้สลังเกตถจสำกตลัวอยยู่สำงตยู่อไปนคีซ
ตรวอยม่สำง
var groups = GroupsApp.getGroups();
Logger.log('You are a member of %s Google Groups.', groups.length);

ผล

อทกตรวอยม่สำง
var values = [1,2,3];
Logger.log('Values is %s' , values) ; // พรมพต์ใน Logger : Values is [1.0, 2.0, 3.0]
Logger.log('Values is' + values) ; // พรมพต์ใน Logger : Values is 1,2,3

214 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


17.3. คลสำส console
Class console
https://developers.google.com/apps-script/reference/base/console
คลสำส console ชยู่วยใหค้เรสำเขคียนบลันทถึกไปยลังบรพิกสำร Stackdriver Logging ของ Google Cloud Platform
คลสำส console ใชค้งสำนคลค้สำย Logger มสำก มคีเมถอด log() ทคีงื่ใชค้งสำนเหมงอนกลัน และแสดงผลทคีงื่เดคียวกลัน
ตลัวอยยู่สำง : จลับเวลสำกสำรทสสำงสำนของสครพิปตล
function test(){
var x = 10 ;
x++
console.time("label") // เรรริ่มจลับเวลา
Logger.log("Longger : " + x )
console.log("console : " + x )
console.timeEnd("label") // หยคุดจลับเวลา และ แสดงผลทขีริ่ console
}

ผล
Log
[01] Longger : 11
[02] console : 11
[03] label: 6ms

บททขีริ่ 17 : คลาส Logger และ console 215


216 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)
บททขีที่ 18
Triggers
18.1. Triggers ครืออะไร
Triggers ใชค้รลันฟฝังกลชลังื่นแบบอลัตโนมลัตพิ เชยู่น เมงงื่อมคีเหตถกสำรณลเกพิดขถึซน เมงงื่อเปปิดไฟลล เปป็นตค้น
Triggers มคี 2 แบบดค้วยกลันกก็คงอ Simple Triggers และ Installable Triggers

18.2. Simple Triggers


Simple Triggers
https://developers.google.com/apps-script/guides/triggers
Simple Triggers เปป็นกลถยู่มฟฝังกลชลังื่นสงวน เชยู่น ฟฝังกลชลังื่นทคีงื่ใชค้ชงงื่อ onOpen(e) ชงงื่อนคีซสงวนไวค้สสสำหรลับ Trigger
โดยเฉพสำะ ฟฝังกลชลังื่นจะทสสำงสำนอลัตโนมลัตพิเมงงื่อไฟลล Google Apps อยยู่สำง Docs, Sheets, Slides หรงอ Form ถยกเปปิด
องงื่นๆมคีดลังตยู่อไปนคีซ
onOpen(e)
รลันเมงงื่อ ผยค้ใชค้งสำนเปปิดไฟลล Sheet, Docs, Sheets, Slides หรงอ Forms
onEdit(e)
รลันเมงงื่อ ยยสเซอรลเปลคีงื่ยนคยู่สำในเซลลลใน Spreadsheet
onInstall(e)
รลันเมงงื่อ ยยสเซอรลตดพิ ตลัซง Addon (add-on)
onSelectionChange(e)
รลันเมงงื่อ ยยสเซอรลเปลคีงื่ยนกสำรเลงอกใน Spreadsheet
doGet(e)
รลันเมงงื่อยยสเซอรลเปปิด Web App หรงอเมงงื่อโปรแกรมสยู่ง HTTP GET request ไปทคีงื่ Web App
(https://developers.google.com/apps-script/guides/web)
doPost(e)
รลันเมงงื่อ โปรแกรมสยู่ง HTTP POST request ไปทคีงื่ Web App
พสำรสำมพิเตอรล e กก็คงอ Event Object ทคีงื่สยู่งใหค้ฟฝังกลชลังื่น บรรจถไปดค้วยขค้อมยลและเนงซอหสำเกคีงื่ยวกลับ Event ทคีงื่เกพิด
ขถึซน (ดยเพพิงื่มเตพิม https://developers.google.com/apps-script/guides/triggers/events )
หมสำยเหตถุ
Simpple Trigger ใชค้ไดค้กลับแอพชนพิดแตกตยู่สำงกลันไป บสำงตลัวใชค้ไดค้ บสำงตลัวใชค้ไมยู่ไดค้ ซถึงื่งสสำมสำรถดยไดค้จสำกลพิงคล
ตยู่อไปนคีซ
Available types of triggers
https://developers.google.com/apps-script/guides/triggers#available_types_of_triggers

218 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


18.2.ก.) ตตัวอยยู่าง เมรที่อคอลตัมนล A เปลทที่ยน พพิมพลเวลาไวค้ททที่คอลตัมนล B

โคค้ดตยู่อไปนคีซเปป็น Google Apps Script แบบฝฝังในไฟลล Google Sheet เมงงื่อเปลคีงื่ยนแปลงคยู่สำในเซลลลใน


คอลลัมนล A เซลลลขค้สำงๆในคอลลัมนล B ทคีตงื่ พิดกลัน จะกรอกเวลสำลงไปอลัตโนมลัตพิ
โคค้ดนคีซถค้สำรลันปกตพิจะ Error เพรสำะไมยู่มคี e สยู่งผยู่สำนมสำ ใหค้บลันทถึกโปรเจก็คของ Google Apps Script กก็ใชค้ไดค้
แลค้ว จสำกนลัซนใหค้ไปลองคคียลคยู่สำตยู่สำงลงในคอลลัมนล A
function onEdit(e) {
Logger.log(e); // ดบูวค่า e มขีอะไร –---- > [ 01 ]
Logger.log(e.source.getActiveSheet().getName()); // ดบูชมืริ่อชขีนี้ททขีริ่จบลั มา –---- > [ 02 ]
Logger.log(e.range.getA1Notation()); // ดบูเซลลต์ทขีริ่จบลั มา –---- > [ 03 ]
var formattedDate = Utilities.formatDate(new Date(), "GMT", "dd-MMM-yyyy HH:mm:ss") ;
if (e.range.getColumn() == 1) { // ถช้าเปป็นคอลลัมนต์ A
e.range.offset(0, 1).setValue(formattedDate) ;
}
}
formatDate
https://developers.google.com/apps-script/reference/utilities/utilities.html#formatdatedate,-timezone,-format

ผล

หสำกดยผลกสำร Logs เพงงื่อดยวยู่สำ e เปป็นอะไรจะไดค้ Logs ดลังนคีซ


[ 01 ] { authMode=LIMITED ,
range=Range ,
source=Spreadsheet ,
user=wasankds@gmail.com ,
value=ccc }
[ 02 ] Sheet1
[ 03 ] A1

18.3. Event Objects


Event Objects
https://developers.google.com/apps-script/guides/triggers/events
เมงงื่อ Triggers ทสสำงสำน Google Apps Script จะสยู่งผยู่สำนสพิงื่งทคีงื่เรคียกวยู่สำ Event Object ซถึงื่งบรรจถไปดค้วยขค้อมยล
และเนงซอหสำเกคีงื่ยวกลับ Event ทคีงื่เกพิดขถึซน เชยู่น เมงงื่อ Submit form (คลพิกปถปุ่ม SUBMIT เพงงื่อสยู่งสพิงื่งทคีงื่กรอกลงในฟอรลม)
กก็จะสยู่งผยู่สำน Event Object ชงงื่อ Form Submit

บททขีริ่ 18 : Triggers 219


ตรวอยม่สำง
โคค้ดตยู่อไปนคีซ จะใสยู่ Note ลงในเซลลลทคีงื่มคีกสำรเปลคีงื่ยนแปลงโดยอลัตโนมลัตพิ โดย Note ทคีงื่ใสยู่เปป็น วลันเวลสำทคีงื่แกค้ไข
คยู่สำในเซลลล
โปรเจก็ค Google Apps Script ตลัวนคีซ ใหค้สรค้สำงแบบฝฝังในไฟลล Google Sheets
โคค้ดนคีซถค้สำรลันปกตพิ จะ Error เพรสำะไมยู่มคี e สยู่งผยู่สำนมสำใหค้ฟฝังกลชลังื่น กสำรใชค้งสำนฟฝังกลชลังื่นนคีซ ใหค้บลันทถึกโปรเจก็ค
Google Apps Script โคค้ดกก็ใชค้ไดค้แลค้ว โดยฟฝังกลชลังื่นจะรลันเอง เมงงื่อมคีกสำรเปลคีงื่ยนแปลงคยู่สำใน Google Sheets

function onEdit(e){
var range = e.range ;
range.setNote('Last modified: ' + new Date()) ;
}

ผล

220 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


18.4. Installable Triggers
Installable Triggers
https://developers.google.com/apps-script/guides/triggers/installable
Installable Triggers ตค้องมคีกสำรเซก็ตกยู่อน เพงงื่อผยกฟฝังกลชลังื่นทคีงื่จะรลันกลับ Event ตลัวอยยู่สำงเชยู่น ใหค้ทสสำ
ฟฝังกลชลังื่น sendMall เมงงื่อมคีบรรทลัดขค้อมยลเพพิงื่มเขค้สำมสำใน Google Sheets เมงงื่อคลพิกปถปุ่ม Submit แบบฟอรลม เปป็นตค้น
เรสำสสำมสำรถสรค้สำง Installable Triggers ไดค้โดย
ทคีงื่หนค้สำโปรเจก็ค Google Apps Script ไปทคีงื่เมนย Edit → Current Project’s Triggers จะเขค้สำสยยู่หนค้สำ
Triggers

ทคีงื่หนค้สำ Triggers ตสำมภสำพ คลพิกทคีปงื่ จุปุ่ม Add Trigger จะปรสำกฎหนค้สำตยู่สำงมสำใหค้ตลัซงคยู่สำ Trigger ตสำมภสำพถลัด
ไป

บททขีริ่ 18 : Triggers 221


ชยู่อง Choose which fuction to run
ใชค้เลงอกฟฝังกลชลังื่นในโปรเจก็ค Google Apps Script ทคีจงื่ ะรลัน
ชยู่อง Select event source
ใชค้เลงอกวยู่สำแหลยู่งของ event จะมสำจสำกไหน เชยู่น Form กก็คงอ มสำจสำก Form
ชยู่อง Select event type
ใชค้เลงอก event เชยู่น On form submit กก็คงอ เมงงื่อคลพิ กทคีงื่ ปถปุ่ม Submit เพงงื่อสยู่งคสสำ ตอบในกสำรกรอกแบบ
ฟอรลม

เมงงื่อคลพิกปถปุ่ม Save จะไดค้ Trigger ตสำมภสำพ

222 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


18.5. newTrigger()
How to create an automated calendar with Google Apps Script with open source on top
https://opensource.com/article/19/1/automate-calendar
deleteTrigger(trigger)
https://developers.google.com/apps-script/reference/script/script-app#deletetriggertrigger
คลาส Class ScriptApp
https://developers.google.com/apps-script/reference/script/script-app#newTrigger(String)
ใชค้เขค้สำถถึงและจลัดกสำรกสำรเผยแพรยู่ สครพิปตลและ Triggers คลสำสนคีซอนถญสำตใหค้ผยค้ใชค้งสำนสรค้สำง Triggers และ
ปลยู่อยสครพิปคลในลลักษณะ Script as a service
คลาส TriggerBuilder
https://developers.google.com/apps-script/reference/script/trigger-builder.html
newTrigger(functionName) – เมถอดในคลาส ScriptApp
https://developers.google.com/apps-script/reference/script/script-app#newtriggerfunctionname
newTrigger() ใชค้สรค้สำง Installable trigger โดยพสำรสำมพิเตอรล functionName คงอ ฟฝังชลังื่นทคีงื่จะรลันเมงงื่อ
Trigger ทสสำงสำน โดยจะคงนคยู่สำกลลับมสำเปป็นคลสำส TriggerBuilder

ตรวอยม่สำง – โคค้ดตยู่อไปนคีซรลันฟฝังกลชลังื่น updateEvents ทถก 5 นสำทคี โดยเมงงื่อรลันโคค้ดนคีซ Installable trigger จะ


ถยกสรค้สำงดค้วย
function createTrigger() {
ScriptApp.newTrigger('updateEvents')
.timeBased()
.everyMinutes(5)
.create() ;
}

ตรวอยม่สำง – สรค้สำง Trigger ใหค้กลับ Spreadsheeet ทสสำงสำนเมงงื่อ Submit form


function createTrigger(){
var ss = SpreadsheetApp.getActiveSpreadsheet() ;
ScriptApp.newTrigger("sendEmail")
.forSpreadsheet(ss)
.onFormSubmit()
.create() ;
}

บททขีริ่ 18 : Triggers 223


ตรวอยม่สำง – โคค้ดตยู่อไปนคีซลบ Trigger ทลัซงหมด ภสำยในโปรเจก็ค
function deleteTriggers(){
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0 ; i < triggers.length; i++) {
ScriptApp.deleteTrigger(triggers[i]);
}
}

ตรวอยม่สำง – โคค้ดตยู่อไปนคีซลบ Trigger ทลัซงหมด ภสำยในโปรเจก็ค และมคีกสำรจลัดกสำร Error ดค้วย


function deleteTriggers(){
var triggers = ScriptApp.getProjectTriggers() ;
triggers.forEach(function(trigger){
try{
ScriptApp.deleteTrigger(trigger) ;
}
catch(e)
{
throw e.message ;
};
Utilities.sleep(1000) ;
}) ; // Close - forEach
} // Close - function

224 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


บททขีที่ 19
การใชรู้โปรเจจ็ค
Google Apps Script
ในไฟลร์องที่น
19.1. กสำรนสสำโปรเจซ็ค Google Apps Script ไปใชค้ในไฟลย์อรืที่น
How to export / import a Google Apps Script as a file into a new spreadsheet?
https://webapps.stackexchange.com/questions/57920/how-to-export-import-a-google-apps-script-as-a-file-into-a-new-spreadsheet

19.1.ก.) ปฝัญหาการใชค้งาน 1 โปรเจล็ค(แบบฝฝัง) ในหลายไฟลล


กรณคีโปรเจก็ค Google Apps Script ของเรสำเปป็นแบบฝฝังไฟลล หสำกโปรเจก็ค ฝฝังอยยยู่ในไฟลลไหน กก็จะสสำมสำรถ
เรคียกใชค้ไดค้เฉพสำะในไฟลลนลัซน
หสำกเรสำกก๊อปปปปี้ไฟลล Google Apps เชยู่นกก๊อปปปปี้ไฟลล Google Sheets มสำอคีกไฟลล โปรเจก็คทคีงื่สรค้สำงไวค้จะตพิดมสำ
ดค้วย แตยู่โปรเจก็คทคีงื่ตพิดมสำดค้วย แมค้จะยลังใชค้ชงงื่อเดคียวกลัน แตยู่ไดค้กลสำยเปป็นคนละโปรเจก็คไปแลค้ว
เมงงื่อเปป็นแบบดลังกลยู่สำว กก็จะเกพิดปฝัญหสำกสำรซสซสำซค้อนของโปรเจก็ค และเวอรลชลังื่นของโปรเจก็ค ฉะนลัซน 1 โปรเจก็ค
สสสำหรลับ Google Apps 1 ไฟลล จถึงไมยู่เวพิรลค
ฉะนรรั้น จนงตค้องมทวพิธท ในกสำรนสสำ โปรเจซ็ค Google Apps Script ไปใชค้ในหลสำยๆไฟลพ์ กสำรสรค้สำง Addon
เปป็นทสำงออกทคีงื่ดคี(แตยู่ผสำยู่ นกสำรอนถมลัตพิโคตรยสำก ) อยยู่สำงไรกก็ดคี มทวพิธทกสำรแชรพ์โปรเจซ็ค (คนละอยยู่สำงกลับกสำรแชรลสพิทธพิกสำร
ใชค้งสำนโปรเจก็ค) ไปใหค้ไฟลพ์อรืที่นเรทยกใชค้งสำนไดค้ โดยยลังไมยู่ตค้องไปถถึงขลัซนกสำรสรค้สำง Addon
19.1.ข.) การนสาโปรเจล็ค Google Apps Script ไปใชค้ในไฟลลอรที่น

ขรรั้นตอน
1. (ทคีงื่ไฟลลหลลักทคีงื่เรสำสรค้สำงโปรเจก็ค Google Apps Script) สรค้สำงเวอรพ์ชรที่นใหค้กรบโปรเจซ็ค
1.1 ทคีงื่โปรเจก็ค Google Apps Script ไปทคีงื่เมนย File → Manage Versions
1.2 (ทคีงื่หนค้สำตยู่สำง Manage Versions ) บลันทถึกเวอรลชลังื่น
ก.) ตลัซงชงงื่อเวอรลชลังื่น อะไรกก็ไดค้ เชยู่น 1.0 Begin
ข.) คลพิกปถปุ่ม Save new version จะไดค้เวอรลชลังื่นของโปรเจก็คตสำมภสำพ
ค.) คลพิกปถปุ่ม OK

226 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


2. (กลลับมสำทคีงื่โปรเจก็ค Google Apps Script) ดมูคทยพ์ของโปรเจซ็ค
2.1 ไปทคีงื่เมนย File → Project Properties
2.2 ทคีงื่หนค้สำตยู่สำง Project Properties แทก็บ Info หลัวขค้อ Product key (Deprecated) จดคทยพ์เอสำไวค้

3. ททที่ไฟลพ์ Google Apps(ไฟลพ์ใหมม่) ททที่ตค้องกสำรจะเรทยกใชค้ Script – ลพิงคพ์ Resource


3.1 สรค้สำงโปรเจก็ค Google Apps Script ( Tools → Script Editor )
3.2 (ทคีงื่โปรเจก็ค Google Apps Script) ระบถุททที่แหลม่งททที่มสำของโปรเจซ็คททที่จะเรทยกโคค้ดมสำใชค้งสำน
ก.) ไปทคีงื่เมนย Resources → Libraries จะปรสำกฎหนค้สำตยู่สำง Libraries

3.3 (ทคีงื่หนค้สำตยู่สำง Libraries) เพพิที่ม Resource ใหค้กรบโปรเจซ็ค


(โคค้ดของโปรเจก็คทคีงื่เปป็น Resource จะกลสำยเปป็น Library ของโปรเจก็คนคีซ)
ก.) ชยู่อง Add Libraries ใสยู่ Product Key ลงไป (คคียลของโปรเจก็คในไฟลลหลลัก)
ข.) คลพิกปถปุ่ม Add – แหลยู่งทคีงื่มสำของโปรเจก็คจะถยกเพพิงื่มเปป็น Library
ค.) ชยู่อง Version เลงอก เวอรลชตัที่นของโปรเจล็ค เชยู่น 1.0 begin
ง.) ชยู่อง Identifier จสสำชรืที่อไวค้ ตสำมภสำพกก็คงอ WKPowerScript เพรสำะตค้องนสสำไปใชค้เรคียกใชค้โคค้ดจสำก
โปรเจก็คตค้นทสำง

บททขีริ่ 19 : การใชช้โปรเจก็ค Google Apps Script ในไฟลต์อมืริ่น 227


จ.) Development mode เลงอกเปป็น On/Off แลค้วแตยู่เรสำ
ถค้สำตค้นทสำงบลันทถึกเวอรลชลังื่นนคีซใหมยู่ เชยู่น 1.0 Begin
ถค้สำเลงอกเปป็น On เรสำจะเรคียกใชค้โคค้ดลยู่สำสถดไดค้ดค้วย
ถค้สำเลงอกเปป็น Off เรสำจะเรคียกใชค้ไดค้เฉพสำะโคค้ดตอนทคีงื่ลพิงคล Resource โคค้ดทคีงื่พลัฒนสำใหมยู่จะไมยู่ลพิงคลมสำ

4. ทคีงื่ไฟลล Google Apps(ไฟลลใหมยู่) ทคีตงื่ ค้องกสำรจะเรคียกใชค้ Script


4.1 เขทยนโคค้ดเพรืที่อเรทยกใชค้ฟฟังกพ์ชรที่นจสำก Resource

ตรวอยม่สำงททที่ 1
function myFunction() {
// เรขียกใชช้ฟฟังกต์ชลัริ่น onOpen() จาก Resource WKPowerScript ทขีริ่ลรงคต์กลันอยบูค่
WKPowerScript.onOpen();
}

ตรวอยม่สำงททที่ 2
// ฟฟังกต์ชนลัริ่ นขีนี้ สค่งผค่าน Agrument และ รลับคค่ากลลับมา
function BAHTTEXT(number) {
return WKPowerScript.BAHTTEXT(number);
}

หมสำยเหตถุ
ปฝัจจถบลัน Google ไดค้สรค้สำงฟฝังกลชลังื่น BAHTTEXT ใน Google Sheets ใหค้เปป็นฟฝังกลชลังื่น Built-in แลค้ว สสำมสำรถ
เรคียกใชค้ไดค้เลย ไมยู่ตค้องเขคียนสครพิปตลอกคี แลค้ว

228 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)


Resource มคีฟฝังกลชลังื่น อะไรใหค้ เรคี ยกใชค้บค้ สำ ง สสำมสำรถทสสำ AutoComplete ไดค้เหมงอ นกลั บ คลสำสของ Object
ทลัวงื่ ๆไป

19.1.ค.) การนสาโปรเจล็คไปใชค้ในไฟลลอรที่นแบบขค้าม Account และ ขค้าม Domain

การนสาโปรเจล็คไปใชค้ในไฟลลอรที่นแบบขค้าม Account และ ขค้าม Domain สสำมสำรถทสสำ ไดค้โดย แชรลโคค้ดไปใหค้


บลัญชคี Google องงื่นๆ หรงอคนองงื่นๆนอกโดเมนไดค้ เชยู่น จสำก @gmail แชรลไปใหค้ @snpfood ใชค้ไดค้ เพทยงแตม่โปร
เจซ็ค Google Apps Script ททที่ใชค้เกซ็บ Library ของโคค้ด ตค้องเปป็น Standalone

19.1.ง.) สรจุป
บททขีริ่ 19 : การใชช้โปรเจก็ค Google Apps Script ในไฟลต์อมืริ่น 229
วพิธคีกสำรใชค้งสำนโปรเจก็ค Google Apps Script 1 โปรเจก็คหลสำยไฟลล ตสำมทคีงื่ไดค้อธพิบสำยในขค้อนคีซ มคีขค้อดคีทคีงื่เรสำ
สสำมสำรถเขคียนโคค้ดไดค้ในโปรเจก็คหลลักตลัวเดคียว แลค้วโปรเจก็คองงื่นๆสสำมสำรถเรคียกใชค้โคค้ดจสำกโปรเจก็คหลลักไดค้
อยยู่สำงไรกก็ดคี ไฟลพ์ททที่เรทยกใชค้กซ็ตค้องสรค้สำงโปรเจซ็คอยมูม่ดท
หสำกโปรเจก็คของเรสำ ยยสเซอรลจสสำเปป็นตค้องใชค้โปรเจก็ค Google Apps Script กลันเปป็นจสสำนวนมสำก และไมยู่อยสำก
ยถยู่งยสำกกลับกสำรสรค้สำงโปรเจก็คอคีก ทสำงออก กก็คงอ กสำรสรค้สำง Addon

230 หลลักการเขขียนโปรแกรม Google Apps Script โดย วสลันตต์ คคุณดรลกเศวต (wasankds@gmail.com)

You might also like