Tag: Google Sheets

  • วิธีใช้งาน Google Form ให้เฉพาะผู้เกี่ยวข้องเท่านั้นที่จะตอบแบบฟอร์มได้ โดยต้องไม่บังคับ Login ด้วย Google Account ด้วย

    Google Form เป็นเครื่องมือสร้างแบบสำรวจยอดฮิต สร้างง่าย ใช้ง่าย เหมาะสำหรับงานที่เปิดให้ใครก็ได้ สามารถตอบแบบสอบถาม

    แต่ ถ้าต้องการให้เฉพาะคนในองค์กรซึ่งใช้ G Suite (เช่น กรณีของ มหาวิทยาลัยสงขลานครินทร์ ใช้ G Suite for Education โดเมน psu.ac.th เป็นต้น) ตอบแบบสอบถามเท่านั้น ก็พอจะทำได้ แต่ก็จะเจอปัญหาคือ ผู้ใช้ในองค์กรอาจจะ Login ด้วย Web Browser ซึ่ง Sign-In ด้วย Gmail ส่วนตัว ก็จะยุ่งยากหน่อย ต้องสลับ Account เป็นต้น แล้วยิ่งบางคน ใช้ LINE เพื่อ Scan QR Code แล้วก็ไปใช้ In-App Browser ซึ่งก็ไม่รู้ว่า Sign-In ด้วย Account ไหน ยิ่งไปกว่านั้น ถ้าเป็นการไปใช้งานนอกสถานที่ที่ใช้ประจำ Google ก็มักจะ Challenge โดยการ ให้ระบุ เบอร์โทรศัพท์มือถือ หรือ Email ที่ใช้ Recovery สร้างความวุ่นวายได้เป็นอย่างมาก

    แล้ว ก็มี Requirement “ง่าย ๆ” มาให้คิด

    • ต้องการออกแบบระบบ ลงคะแนน ให้คณะกรรมการ ซึ่งอยู่ทั้งในและนอกองค์กร
    • ท่าน ๆ เหล่านี้ ล้วน … ทรงคุณวุฒิ และ วัยวุฒิ
    • ใช้อุปกรณ์หลากหลาย
    • ส่งแบบฟอร์มไปให้กรอก โดยผ่าน Email ท่าน ๆ ซึ่งเป็น @yahoo.com, @hotmail.com, @gmail.com, @xxx.edu, @xxxxxxxxx
    • บางท่าน ไม่มี Email แต่มี LINE เท่านั้น
    • การลงคะแนน ต้องมั่นใจว่า กรรมการแต่ละท่าน เป็นผู้ลงคะแนนจริง ๆ
    • ท่าน ๆ ลงคะแนนได้ 1 เสียงเท่านั้น
    • เปลี่ยนใจได้ด้วย คือ ตอนแรกจะลงคะแนนอย่างนึง แล้วก็ Submit ไปแล้ว แต่ก็คิดว่า เอ๊ะ เปลี่ยนใจแระ (ในกรอบเวลา)
    • ไม่สามารถทราบได้ว่าใครเป็นผู้ลงคะแนนได้ (โดยง่าย)

    แนวทางการแก้ปัญหา

    Google Form มี Feature นึง ที่บางคนไม่เคยใช้ นั่นคือ “Get pre-filled link”

    Pre-filled Link กล่าวคือ ทำการกรอกข้อมูลบางอย่างใน Google Form แล้วส่งให้ผู้ใช้ เช่น เรารู้อยู่แล้วว่า จะส่งแบบฟอร์มนี้ ไปทาง Email ของกรรมการท่านนี้ ก็แทนที่ต้องให้ท่าน กรอกชื่อตัวเอง เราก็กรอกไปให้ท่านเลย อะไรทำนองนั้น

    Idea ของเราคือ จะสร้าง “Question” ชื่อ Token ขึ้นมา (จะตั้งว่าอะไรก็ได้นะ)

    แล้วคลิกที่ “Get Pre-filled Link”

    จะได้แบบฟอร์มพร้อมกรอกอย่างนี้ เราก็จะ Mark ตำแหน่งที่จะแทนค่า Token ด้วยการใส่คำอะไรก็ได้ แต่ในที่นี้ จะใส่เป็นคำว่า “token” ตัวพิมพ์เล็ก ไปใส่ แล้วคลิกปุ่ม Get Link จากนั้น คลิกปุ่ม COPY LINK

    Link ที่ได้ จะเป็นแบบนี้

    https://docs.google.com/forms/d/e/XXXXXXXXXX/viewform?usp=pp_url&entry.625502761=token

    จากนั้นแค่ค่า ข้อความ “token” ด้วยค่า Hash เช่น เอาชื่อ นามสกุล และ email address ของแต่ละคนมาเข้ารหัส MD5 (จะกล่าวถึงวิธีการได้มาในตอนท้าย) เช่น ได้เป็น

    b4771c1c4d65442b32d7029d13fb6e41

    ก็จะได้ URL ที่จะส่งให้ท่านกรรมการ อย่างนี้

    https://docs.google.com/forms/d/e/XXXXXXXXXX/viewform?usp=pp_url&entry.625502761=b4771c1c4d65442b32d7029d13fb6e41

    เมื่อผู้รับคลิก Link ก็จะได้หน้าตาฟอร์มแบบนี้

    คราวนี้ ในภาพใหญ่ ก็ต้องหาทางทำสร้าง Hash ของกรรมการแต่ละท่าน อันนี้เป็นตัวอย่าง

    ต่อไปนี้เป็นวิธีการหาค่า Hash (เขียนด้วย Google App Script)
    Source: https://www.answiz.com/questions/2594/hash-of-a-cell-text-in-google-spreadsheet

    function MD5 (input) {
      var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, input);
      var txtHash = '';
      for (i = 0; i < rawHash.length; i++) {
        var hashVal = rawHash[i];
        if (hashVal < 0) {
          hashVal += 256;
        }
        if (hashVal.toString(16).length == 1) {
          txtHash += '0';
        }
        txtHash += hashVal.toString(16);
      }
      return txtHash;
    }

    จากนั้นก็เขียน Script ส่ง Email / LINE แจ้งข้อความที่ต้องการ พร้อม Link ที่กรอกข้อมูล Hash ของแต่ละท่าน

    เป็นอันเรียบร้อย …

    เหมือนเดิม เพิ่มเติมคือ ความซับซ้อน

    คราวนี้ ท่าน ๆ ก็ลงคะแนนกันมา แต่ว่า

    • ช่อง Token นั้น บน Google Form มันแก้ไขได้ ไม่มีทาง Lock ทำให้บางท่าน เอ่อ เผลอ แก้ไข/ลบ/ทดลอง
    • บางท่าน ก็ ลงคะแนน Submit แล้ว อยากเปลี่ยนใจทำไงดี ?

    ดังนั้น ต้องหาทางทำให้

    • ถ้า Hash ไม่ตรงกับข้อมูลที่มี ไม่นับคะแนน
    • ถ้า Hash ตรง แต่ซ้ำ ๆ มา ให้นับคะแนนจาก Record ล่าสุด

    ก็มาร่าย Formula กันหน่อย

    หน้าตา Google Sheets ซึ่งเป็นผลการลงคะแนนที่ได้จาก Google Form

    ไปเขียนสูตรใน Column D โดย จะนำค่าจาก Column C ไปตรวจสอบกับ Hash ซึ่งขอยกตัวอย่างว่า อยู่ที่ Sheet2 ใน Column A โดยใช้สูตร

    =IF(ISNA(VLOOKUP(C2,Sheet2!A:A,1,false)),"Not Match","Match")

    จากภาพแสดงให้เห็นว่า แถว 5 นั้น ค่า Hash ไม่ตรง จึงขึ้นคำว่า “Not Match”

    ต่อไป ก็ Filter เฉพาะที่ Match แล้ว Sort ตาม Timestamp

    สูตรประมาณนี้

    =sort(filter(A2:D6,D2:D6="Match"),3,True)

    คราวนี้ เราจะรู้ต้องหาว่า อันไหนหล่ะ ที่เป็น Record ล่าสุดในแต่ละกลุ่ม

    ใช้สูตรประมาณนี้

    =if(C14=C15,"","1")

    กล่าวคือ พอเรียงลำดับแล้ว ก็หาว่า บรรทัดไหน เป็นขอบของกลุ่ม ว่างั้น (อธิบายยากจัง) ก็แสดงค่า 1

    สุดท้าย จะก็ได้ผลสรุป Record ที่ Hash ตรง และเป็นการ Submit ล่าสุดของแต่ละกลุ่ม

    สูตรประมาณนี้

    =filter(A14:E17,E14:E17="1")

    ก็เอาไปทำ Chart สรุป ได้แล้ว

    หวังว่าจะเป็นประโยชน์ครับ

  • วิธีใช้ Google Calendar เพื่อบันทึกปฏิบัติงาน และใช้ Google Sheets เพื่อรายงานผลการปฏิบัติงาน

    บทความนี้ นำเสนอแนวทางที่ผมใช้ในการ “บันทึกการปฏิบัติงาน” และ “รายงานผลการปฏิบัติงาน” เพื่อนำไปกรอกในระบบ TOR ของมหาวิทยาลัยสงขลานครินทร์

    เครื่องมือที่ใช้

    1. Google Calendar
    2. Google Sheets
    3. Google Sheets Add-ons ชื่อ “Timesheet”
    4. Google Keep

    เป้าหมาย

    การบันทึกผลปฏิบัติงาน เพื่อ รายงานผลการปฏิบัติงานในระบบ TOR

    ระบบ TOR ของมหาวิทยาลัยสงขลานครินทร์

    TOR Online – ระบบประเมินผลการปฏิบัติงาน มหาวิทยาลัยสงขลานครินทร์

    ผู้ปฏิบัติงาน จะต้องตกลงกับหัวหน้าฝ่าย ว่า รอบ TOR นี้ เราจะทำอะไร และมีเป้าหมายอย่างไรบ้าง เอาเป็นว่า … จะกำหนดเป็น “ภาระงาน” แบ่งเป็น 3 ด้าน ได้แก่
    1. งานประจำ
    2. งานเชิงพัฒนา/งานพิเศษ
    3. ผลงานอื่นๆ(ตามที่คณะกำหนด)

    ในแต่ละ หัวข้อใหญ่ ก็จะแจกแจงว่า ทำอะไร เป็นสัดส่วนเท่าไหร่ เช่น

    1.1 5ส
    1.2 ประชุมติดตามงานของทีมงาน

    อะไรทำนองนั้น

    หัวข้อย่อย ของ ผลงานประจำ — มันสำคัญตรงการกรอก ผลการปฏิบัติงาน และ เอกสาร/ข้อมูลอ้างอิงนี่แหล่ะ

    ซึ่ง นอกจากต้องทำงานในหน้าที่ ประชุม ๆ ตอบคำถาม แก้ไขปัญหา กิจกรรรม … ฯลฯ ก็ต้อง บันทึกว่า ทำอะไรลงไปบ้าง มีเอกสารอ้างอิง และ ต้องสามารถ ให้หัวหน้า (และคณะกรรมการประเมิน) สามารถเข้าไปดูได้ด้วย

    ขอยกตัวอย่าง หัวข้อ “ภาระงาน” ของผมใน TOR ปี 2562
    ( TwT )

    
    1.1 5 ส
    1.2 ประชุมติดตามงานของทีมงาน
    1.3 ติดตั้ง Server/Software บริการ PSU Email
    1.4 เฝ้าระวังบริการ PSU Email
    1.5 ตอบคำถาม/ให้คำแนะนำบริการ PSU Email
    1.6 ประยุกต์ใช้ DialogFlow พัฒนา Chatbot กับ Facebook Page ของศูนย์คอมพิวเตอร์
    1.7 ประยุกต์ใช้ Deep Learning ในการคัดกรองอีเมลขยะ
    1.8 พัฒนาระบบหน่วยตรวจสอบภายใน
    1.9 โครงการปรับปรุงความปลอดภัย PSU Email
    1.10 โครงการพัฒนาอะไรสักอย่าง
    
    2.1 งานปรับปรุงและพัฒนา
    2.2 Helpdesk
    2.3 Internal Auditor
    
    3.1.1 อบรมประชุมที่ศูนย์จัด
    3.1.2 กิจกรรมมหาวิทยาลัย
    3.1.3 กิจกรรมศูนย์คอมพิวเตอร์
    3.1.4 กรรมการ/คณะทำงาน
    3.2   กิจกรรมกลุ่มงาน
    3.2.1 ประชุมติดตามโครงการ

    แล้วเราจะบันทึกผลการปฏิบัติงานอย่างไร ให้ ง่าย และสามารถ นำมากรอกใน TOR ได้ด้วย

    เริ่มจาก Google Keep

    เอาข้อหัวย่อย ของภาระงานข้างต้น มาสร้างเป็น Note ใหม่ใน Google Keep ตั้งหัวข้อว่า TOR 2562 (หรือใครอยากจะทำไว้ใช้ของ TOR 2563 ก็ค่อยลองทำดู)

    ต่อไป เราจะสร้าง Label ของแต่ละหัวข้อย่อย โดยการใส่ # ไว้ด้านหน้า หัวข้อย่อย เช่น
    1.10 โครงการพัฒนาอะไรสักอย่าง
    เป็น
    [Update – สำหรับให้รายงานสวยงามยิ่งขึ้น แนะนำให้ Replace ” ” ด้วย “_”]
    #1.10_โครงการพัฒนาอะไรสักอย่าง

    พอใส่ # หน้า 1.10 แล้ว Google Keep จะขึ้น Popup ให้สร้าง Label “1.10” เราก็สร้างไว้ (มันมีเหตุผล ทำตามไปก่อน เดี๋ยวเล่าให้ฟัง)

    Popup ให้สร้าง Label “1.10”

    ทำจนครบทุกข้อ เราจะได้ Note ใน Google Keep อย่างนี้
    จากนั้น ให้คลิก รูป Pin เพื่อปักหมุดเอาไว้
    แล้วกดปุ่ม Close ด้านล่างได้เลย

    [Update: ใน Google Keep สามารถเอาภาพ เช่น เกณฑ์การประเมิน การพิจารณาว่าเรื่องนี้ เข้าในส่วน งานประจำ หรือ งานเชิงพัฒนา เพื่อประกอบการตัดสินใจได้ จะได้ไม่ต้องไปค้นหาหลาย ๆ ที่]

    บันทึกการปฏิบัติงานใน Google Calendar

    ใน Google Calendar จะมี Panel ด้านขวามือ จะเห็น Icon ของ Google Keep สีเหลือง ๆ คลิกสิครับ รออะไร

    Icon ของ Google Keep ใน Google Calendar

    เราก็จะเห็น Note ของ Google Keep ที่เรา Pin ไว้ตะกี้ อยู่บนสุด

    Note ที่ Pin ไว้ จะอยู่บนสุด

    ใน Google Calendar นั้น ปรกติเราจะลงนัดหมายต่าง ๆ ลงไปใน Default Calendar ของเรา แต่ในที่นี้ แนะนำให้สร้างอีก Calendar นึงขึ้นมา ตั้งชื่อว่า worklog

    แนะนำให้สร้าง Calendar ใหม่ ชื่อ worklog เพื่อแยกบันทึกปฏิบัติงาน กับ การนัดหมายทั่วไป

    วิธีลงบันทึก

    เช่น วันนี้ เวลา 10:00-13:30 ทำงานของหน่วยตรวจสอบภายใน เป็นการ “ปรับปรุงโปรแกรมหน่วยตรวจสอบ” และบันทึกสิ่งที่จะต้องทำ กับ สิ่งที่ทำเสร็จไปแล้ว

    วิธีการบันทึก

    1. [Update] Copy ข้อความจาก Google Keep เช่น ข้อ #1.8_พัฒนาระบบหน่วยตรวจสอบภายใน มาใส่ใน Title
    2. [Update] อาจจะเพิ่ม ” ปรับปรุงโปรแกรมหน่วยตรวจสอบ” เป็นคำบรรยาย ในหัวข้อการทำงาน
    3. ใส่ เวลา 10:00 – 13:30 ว่าเราทำงานนี้ในช่วงเวลานี้
    4. บันทึกสิ่งที่จะต้องทำ กับ สิ่งที่ทำเสร็จไปแล้ว
    5. เลือกบันทึกลงใน worklog
    6. กดปุ่ม Save
    ขั้นตอนการบันทึกผลการปฏิบัติงาน

    วางแผนการทำงาน

    อย่างเช่น ผมมีงานที่ต้องทำทุกเช้า คือ “1.4 เฝ้าระวังบริการ PSU Email”

    1. [Update] ใส่ #1.4_เฝ้าระวังบริการ_PSU_Email
    2. เลือกบันทึกใน worklog
    3. คลิก More Option
    บันทึกปฏิบัติงาน ที่จะต้องทำทุกวัน

    เลือกเป็น Repeat > Every Weekday

    เลือกให้เกิดการบันทึกนี้ ทุกวัน

    แล้วมา Uncheck “All day” ออก เพื่อกำหนดช่วงเวลา เช่น ผมจะทำงานนี้ประจำทุกวันทำงาน เวลา 09:00-10:00 จากนั้น คลิกปุ่ม Save

    กำหนดเวลา

    สร้างนัดหมาย แล้วเอามาเป็นบันทึกปฏิบัติงานก็ได้

    เบื่อไม๊ เวลาจะนัดประชุม นอกจากจะต้องหาเวลาว่าง ห้องว่าง แล้วต้องมาหาว่า ใครว่างวันไหน แถม ลงนัดไปแล้ว ก็ยังไม่รู้ว่า ใครจะตอบรับการเข้าประชุมบ้าง

    ปัญหาเหล่านี้จะหมดไป เมื่อใช้ Google Calendar

    1. ใส่หัวข้อ เช่น “#1.10 นัดประชุม” –> เพื่อลงในบันทึกปฏิบัติงานของภาระงาน “1.10 โครงการพัฒนาอะไรสักอย่าง”
    2. ลงเวลานัด
    3. เพิ่ม Email ผู้เข้าร่วมประชุม
    4. ดูได้ว่าผู้เข้าร่วมประชุมว่างไม๊ในเวลานัด (ถ้ามันใช้ Calendar เป็นอ่ะนะ)
    5. ถ้าคนนี้ไม่สำคัญ ไม่มาก็ได้ ก็ Mark Optional
    6. ใน G Suite for Education สามารถจอง Resource ได้ เช่น จองหัองได้ ใน Free Gmail ไม่มีจร้า
    7. ใน G Suite for Education สามารถสร้างห้อง เพื่อ Video Conference ใน Google Meet ได้ ส่วน ใน Free Gmail ไม่มีจร้า
    8. คลิก Save

    ตอบ Email ก็เอามาลงบันทึกปฏิบัติงานได้

    เช่น มี Order มาให้ทำอะไร มาทาง Email ก็สามารถ เอามาลงบันทึกปฏิบัติงานได้เลย

    ก็สามารถเอามาใส่ในหัวข้อ ภาระงาน ที่ถูกต้องได้ แถม ถ้า email นี้ ถึงใครบ้าง ก็จะสร้างนัดหมายให้ได้ด้วย

    ผลการบันทึกปฏิบัติงาน

    เมื่อเวลาผ่านไป …

    วัน ๆ ไม่ได้ว่างงานนะ

    เมื่อถึงเวลารายงานผลการปฏิบัติงาน

    ใน Google Drive สร้าง Google Sheets ขึ้น จากนั้น ติดตั้ง Add-Ons ชื่อ “TimeSheet”

    เมื่อติดตั้งเสร็จจะได้อย่างนี้

    และนี่คือเหตุผลว่า ทำไมต้องใส่ # ไว้หน้าชื่อของ Event

    เริ่มเลยแล้วกัน

    Add-Ons > TimeSheet>Create Report

    เลือก Calendar และ กำหนดช่วงระยะเวลาที่ต้องการ

    ผลที่ได้

    ผลที่ได้ เรียงตามหัวข้อภาระงาน และ นับจำนวนชั่วโมงได้

    เช่น หัวข้อ #1.8 พัฒนาระบบหน่วยตรวจสอบภายใน ก็จะสามารถดูรายละเอียดและจำนวนชั่วโมงได้

    และเอาไปใส่ใน TOR ได้แระ

    ส่วน Google Sheets บันทึกผลข้างต้น ก็เอาไป Share ได้ตามปรกติ

    หวังว่าจะเป็นประโยชน์ครับ

  • Case Study: ระบบประเมินผลออนไลน์ด้วย Google Sheets แบบแก้ไขได้เฉพาะส่วนของตนเอง แต่มองเห็นของคนอื่นได้ด้วย

    โจทย์มีอยู่ว่า

    • ต้องการระบบประเมินผล Online ให้อาจารย์จากหลาย ๆ มหาวิทยาลัย จำนวน 5 ท่าน ประเมินผลการทำงาน ในมุมมองต่าง ๆ แยกตาม Sheet
    • และ ในแต่ละมุมมอง อาจารย์แต่ละท่าน สามารถเลือกตัวเลือกจาก Dropdown ในคอลัมน์ของตนเองในแต่ละหัวข้อย่อย
    • แต่ในขณะเดียวกัน สามารถมองเห็นได้ด้วยว่า อาจารย์ท่านอื่นให้คะแนนหัวข้อย่อยนั้นว่าอย่างไร แต่จะไม่สามารถแก้ไขของท่านอื่น หรือ แก้ไขส่วนอื่น ๆ ได้
    • มีระบบสรุปคะแนนอัตโนมัติ

    เริ่มกันเลย

    ลองคลิกไปดูตัวอย่างได้ที่นี่

    สร้าง Google Sheets โดยมีทั้งหมด 5 Sheets แต่ละ Sheet มีคอลัมน์แรก เป็นรายการที่จะประเมิน คอลัมน์ B – F เป็นส่วนที่ผู้ประเมินแต่ละท่านใช้ในการประเมิน

    ชีตที่ 1 -3 เป็น มุมมองในการประเมิน

    Sheet “มุมมองที่ 1”
    Sheet “มุมมองที่ 2”
    Sheet “มุมมองที่ 3”

    ชีตที่ 4 เป็น Rubric Score หรือ ค่าที่จะใช้ทำ Dropdown ด้วย V Lookup

    Rubric Score

    ชีตที่ 5 เป็น Summary เอาไว้แสดงภาพรวมการประเมิน (ใช้ในภายหลัง)

    Summary

    สร้าง Dropdown

    ไปที่ ชีต “มุมมองที่ 1” ที่เซล B7 (หัวข้อประเมินแรก ของผู้ประเมินคนแรก) แล้ว “คลิกขวา” เลือก Data Validation …

    จากนั้น ในบรรทัด On invalid data เลือก Reject input
    ในบรรทัด Criteria คลิกที่ช่องด้านหลัง

    แล้วไปคลิก ชีต “RubricScore” และเลือกส่วนที่จะมาแสดงใน Dropdown นั่นคือ “Not Met”, “Partially Met” และ “Met” แล้วคลิกปุ่ม OK

    จากนั้น กลับมาคลิกปุ่ม Save

    จากนั้น ก็ Copy เซล B7 ไปยังทุก ๆ ส่วนที่จะทำการประเมิน

    เพิ่มผู้ประเมินเป็น Editor

    คลิกปุ่ม Share แล้วกรอก Email Address ซึ่งเป็น Google Account ของผู้ประเมินทั้ง 5 คนลงไป ให้เป็น Editor จากนั้นคลิกปุ่ม Send

    ในขั้นตอนนี้ ทุกคนที่เป็น Editor สามารถเข้ามาแก้ไข ทุกส่วน ของ Google Sheets นี้ได้ ซึ่งไม่ใช่สิ่งที่ต้องการ ต่อไป จะเป็นการกำหนด ส่วนที่ แต่ละคนจะสามารถแก้ไขได้

    กำหนดส่วนที่ผู้ประเมินแก้ไขได้

    คิดเหมือนกับ การเจาะช่อง ให้เฉพาะส่วนที่กำหนดนี้ ให้มีการแก้ไขได้

    คลิกเมนู Tools > Protect sheet
    แล้วคลิก Except certain cells
    ในที่นี้คือ B:F

    แล้วเลือก Editor ทุกคน ให้สามารถ แก้ไขได้
    จากนั้นคลิกปุ่ม Done

    ตอนนี้ ทั้ง 5 คนจะสามารถแก้ไขสิ่งที่อยู่ในคอลัมน์ B-F ได้ แต่ยังมีปัญหาคือ อ.สมชาย สามารถแก้ไขข้อมูลในคอลัมน์ของ อ.สมหญิง ได้อยู่

    กำหนดให้ผู้ประเมินแก้ไขได้เฉพาะคอลัมน์ของตนเอง

    ต่อไป กำหนดให้ อ.สมศรี แก้ไขได้เฉพาะคอลัมน์ C ซึ่งเป็นของตนเองเท่านั้น
    เลือก คอลัมน์ C
    คลิกเมนู Data > Protected sheets and ranges …
    คลิกปุ่ม Set Permissions

    จากนั้น เลือกเฉพาะ email ของ อ.สมศรี เท่านั้นที่สามารถแก้ไขได้
    แล้คลิกปุ่ม Done

    ทำซ้ำกระบวนการนี้ กับ ผู้ประเมินทุกคน ให้แก้ไขได้เฉพาะของตนเองเท่านั้น
    ตอนนี้ อ.สมศรี จะเห็นหน้าจออย่างนี้
    กล่าวคือ แก้ไขได้เฉพาะส่วนของตนเองเท่านั้น

    Save เป็น Macro

    ทำเช่นนี้กับ มุมมองที่เหลือ หรือ จะ Save Macro ก็ได้
    โดยคลิก เมนู Tools > Macros
    จากนั้น ทำกระบวนการที่ต้องการให้บันทึกไปเรื่อย ๆ แล้ว Save
    แล้ว ค่อยไป Run Macro ที่สร้างขึ้น ในชีตที่ต้องการ

    Macro จะมีหน้าตาประมาณนี้

    หวังว่าจะเป็นประโยชน์ครับ

  • วิธีใช้ Google Sheets ลบผู้ใช้จำนวนมากบน GAFE

    [บทความนี้ สำหรับผู้ที่มี Admin Privilege ขึ้นไป]

    ต่อจากบทความ วิธีใช้ Google Sheets เปลี่ยนแปลงข้อมูลผู้ใช้จำนวนมากบน GAFE

    เมื่อต้องการลบผู้ใช้จำนวนมาก ก็ทำเหมือนเดิม แต่เปลี่ยน Script นิดหน่อยดังนี้

    1. สร้าง Google Apps Scripts ใน Google Sheets นี้ ด้วยเมนู Tools > Script Editor … จากนั้นเลือก Blank Project แล้วกดปุ่ม Close
    2. ตั้งชื่อโปรเจค UpdateUser แล้วใส่โค๊ดดังนี้ (ปรับค่า firstRow และ lastRow ให้เหมาะสมตามต้องการ)
    3. นอกนั้นเหมือนเดิม

    หวังว่าจะเป็นประโยชน์ครับ

  • วิธีใช้ Google Sheets เปลี่ยนแปลงข้อมูลผู้ใช้จำนวนมากบน GAFE

    [บทความนี้ สำหรับผู้ที่มี Admin Privilege ขึ้นไป]

    วิธีใช้ Google Sheets สร้าง Account ใหม่ลงใน Sub Organization ของ GAFE

    เมื่อต้องการแก้ไขข้อมูลของผู้ใช้จำนวนมาก ได้แก่

    • ตั้งรหัสผ่านใหม่
    • ไม่บังคับให้เปลี่ยนรหัสผ่านในครั้งแรกที่เข้าระบบ
    • ย้าย Organization Unit ไปอยู่ภายใต้ /Students

    ใน Admin Console ของ Google Apps จะมีเครื่องมือ Users เพื่อใช้ในการจัดการผู้ใช้

    แต่เครื่องมือที่มีอยู่ มีข้อจำกัด คือ ไม่สามารถเขียนเงื่อนไขในการกรองเอาเฉพาะ Email Address ของผู้ใช้ที่ต้องการได้

    ดังนั้นจึงต้องใช้วิธีการ Download Users ทั้งหมดออกมาก่อน

    เลือก Download all users … แล้วกดปุ่ม OK

    จะได้ไฟล์ UserData-psu.ac.th-20141110.csv (ชื่ออาจจะแตกต่างกันไปในแต่ละโดเมน) ให้ Save ไว้ในเครื่องคอมพิวเตอร์ก่อน แล้ว Upload ไปเก็บไว้บน Google Drive แล้วเปิดด้วย Google Sheets จากนั้นเลือกคอลัมน์ A แล้วคลิกขวาเลือก Copy ไปใส่ใน Google Sheets ใหม่

    ใน Google Sheets ใหม่ ให้ Edit > Paste ข้อมูลมาลงไว้ในคอลัมน์ A เช่นกัน

    จากนั้นในคอลัมน์ B2 ใส่สูตรว่า (นักศึกษาของมหาวิทยาลัยจะใช้ Login เป็นรหัสนักศึกษาซึ่งเป็นตัวเลขทั้งหมด จำนวน 7 หรือ 10 หลัก ตามด้วย @psu.ac.th) ดังนี้

    )

    จากนั้นให้ Copy สูตรดังกล่าวไปในคอลัมน์ B ทั้งหมด จะทำให้ ชื่อบัญชีของนักศึกษาเท่านั้นที่จะมีค่าเป็น Y ส่วนบุคลากรจะมีค่าเป็น N หลังจากนั้นให้ Filter โดยเลือกเฉพาะคอลัมน์ B ที่มีค่าเป็น Y ก็จะได้นักศึกษาทั้งหมด

     แล้วทำการเลือกข้อมูลที่ได้ Copy เอาไว้แล้วสร้าง Google Sheets ใหม่อีกอันหนึ่ง ตั้งชื่อว่า Udate Users แล้วเอาข้อมูลดังกล่าวมาใส่ในคอลัมน์ A จากนั้นสร้าง B เป็น Organization Unit Path ที่ต้องการ แล้วสร้าง C เป็น Password ที่ต้องการตั้ง และ D เป็น Status

    ต่อไป เป็นขั้นตอนการเขียน Google Apps Script

    1. สร้าง Google Apps Scripts ใน Google Sheets นี้ ด้วยเมนู Tools > Script Editor … จากนั้นเลือก Blank Project แล้วกดปุ่ม Close
    2. ตั้งชื่อโปรเจค UpdateUser แล้วใส่โค๊ดดังนี้ (ปรับค่า firstRow และ lastRow ให้เหมาะสมตามต้องการ)
    3. ถ้าลอง Run เลย จะเจอ Error อย่างนี้
      คลิก Continue -> Accept -> Dismiss
      เพราะยังไม่ได้ Enable API ไว้
    4. เนื่องจากการสร้าง Account ต้องใช้สิทธิ์ของ Admin ขึ้นไป และต้องใช้ Admin SDK Directory API ด้วย วิธีการคือใช้เมนู Resources -> Advanced Google Services แล้วเลือก Admin Directory API เป็น On
    5. จากนั้นคลิกที่ Google Developers Consol
      ที่ Admin SDK ให้เปลี่ยน ON
    6. เมื่อ Run ใหม่ ก็จะได้ผลใน Google Sheets ตามภาพ
    7. ผลที่ได้คือสามารถย้ายนักศึกษาลงไปใน OU ที่เหมาะสมได้

    หวังว่าจะเป็นประโยชน์ครับ

  • วิธีใช้ Google Sheets สร้าง Account ใหม่ลงใน Sub Organization ของ GAFE

    [บทความนี้ สำหรับผู้ที่มี GAFE Admin Privilege ขึ้นไป]

    ในการสร้างบัญชีผู้ใช้ใหม่บน GAFE นั้นทำได้หลายวิธี ได้แก่

    1. การสร้างทีละคนผ่าน Admin Console
    2. การสร้างทีละหลายๆคนด้วย CSV File
    3. การสร้างทีละหลายๆคนผ่าน Google Apps Directory Sync

    เมื่อต้องการสร้างผู้ใช้จำนวนมาก เช่น 5,500 คน โดยต้องจัดแบ่งผู้ใช้ แยกลงไปในแต่ละ Sub Organization วิธีที่ 1. ทำได้แต่เป็นงานที่หนักมาก วิธีที่ 2. ทำไม่ได้ เพราะการใช้ CSV File ผ่าน Admin Console นั้นจะสร้างผู้ใช้รวมกันที่ Root Organization ไม่สามารถแยกลงไปใน Sub Organization ได้ ส่วนวิธีที่ 3. นั้นทำได้ แต่ต้องเข้าใจกระบวนการทำงานของ LDAP พอสมควร

    ในบทความนี้ จะนำเสนอวิธีการที่ ทำได้ง่ายเหมือนการใช้ CSV แต่สามารถแยกลงไปใน Sub Organization ได้ ด้วย Google Sheets และ Google Apps Script ดังต่อไปนี้ (ขอยกตัวอย่างเพียง 5 Account เพื่อความสะดวก)

    1. สร้าง Google Sheets แล้วใส่ข้อมูล email, firstname, lastname, OU, password, status
    2. สร้าง Google Apps Scripts ใน Google Sheets นี้ ด้วยเมนู Tools > Script Editor … จากนั้นเลือก Blank Project แล้วกดปุ่ม Close
    3. ตั้งชื่อโปรเจค AddMultiAccountToSubOU แล้วใส่โค๊ดดังนี้
    4. ถ้าลอง Run เลย จะเจอ Error อย่างนี้
      คลิก Continue -> Accept -> Dismiss
      เพราะยังงไม่ได้ Enable API ไว้
    5. เนื่องจากการสร้าง Account ต้องใช้สิทธิ์ของ Admin ขึ้นไป และต้องใช้ Admin SDK Directory API ด้วย วิธีการคือใช้เมนู Resources -> Advanced Google Services แล้วเลือก Admin Directory API เป็น On
    6. จากนั้นคลิกที่ Google Developers Consol
      ที่ Admin SDK ให้เปลี่ยน ON
    7. เมื่อ Run ใหม่ ก็จะได้ผลใน Google Sheets ตามภาพ
    8. และจะสามารถสร้างผู้ใช้ได้ตาม Sub Organization ที่ต้องการ

    หวังว่าจะเป็นประโยชน์ครับ

  • วิธีการใช้ Google Sheets เป็นระบบเฝ้าระวังเว็บไซต์ (Website Monitoring) จากภายนอกองค์กร

    จาก “วิธีการใช้ Google Sheets เป็นฐานข้อมูล” ซึ่งได้กล่าวถึงพื้นฐานการพัฒนา Google Apps Script เพื่อใช้ต่อยอดความสามารถของ Google Sheets สามารถนำมาประยุกต์ใช้เพื่อเฝ้าระวังบริการเว็บไซต์จากภายนอกระบบเครือข่ายขององค์กรได้ (จาก Google Cloud Infrastructure เลยทีเดียว)

    ขั้นตอนในการทำ

    1. ในโปรเจค ProjectMyDB สร้างไฟล์ monitoring.gs ดังภาพ
    2. ประกอบด้วย 3 ฟังก์ชัน คือ
      function check_website(url) {  
        var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
        return response.getResponseCode();
      }
      
      function doLog(timestamp, responseCode, timeDiff) {
        var ss = SpreadsheetApp.openByUrl('https://docs.google.com/a/psu.ac.th/spreadsheets/d/1HJmyqiBYC_AEATmdUWakLgHFyYGqSqeqSA8xEw-8o-c/edit');
        SpreadsheetApp.setActiveSpreadsheet(ss);
        SpreadsheetApp.setActiveSheet(ss.getSheetByName("Log"));
        var activeSheet=ss.getActiveSheet();
        activeSheet.appendRow([timestamp, responseCode, timeDiff]);
      }
      
      function getTime() {
        var startTime = new Date() ;
        var responseCode=check_website("http://www.psu.ac.th");
        var endTime = new Date() ;
        var timeDiff = endTime-startTime;  
        doLog(Utilities.formatDate(new Date(), "GMT+7", "yyyyMMdd-HHmmss") , responseCode , timeDiff);
      }
    • check_website ใช้ UrlFetchApp เพื่อ url ของเว็บไซต์ แล้วรีเทิร์นผล Response Code ของ HTTP Protocol กลับไป
    • doLog ใช้สำหรับเพิ่มค่า timestamp, responseCode และ timeDiff (เวลาในการตอบสนอง) ลงใน Sheet “Log” ใน Google Sheets ที่กำหนดไว้
    • getTime ใช้คำนวนเวลาตั้งแต่เริ่มต้น แล้วเรียกใช้ฟังก์ชั่น check_website และ จับเวลาที่สิ้นสุด จากนั้นคำนวนเป็นเวลาในการตอบสนอง (timeDiff) แล้ว เรียกฟังก์ขัน doLog เพื่อเขียนข้อมูลต่อไป
    1. สร้าง Trigger ด้วยเมนู Resources > Current project’s triggers
    2. เลือกฟังก์ชัน getTime กำหนดเป็น Time-driven ทำงานในหน่วยนาที (Minute timmer) และ ทำงานทุกๆ 5 นาที แล้วกดปุ่ม Save
    3. ผลการทำงาน และการสร้าง Chart ประกอบทำให้สามารถเห็นแนวโน้มได้

    จากตัวอย่างข้างต้น ทำให้เห็นว่า การใช้ Google Apps Script ร่วมกับ Google Sheet สามารถสร้างระบบเฝ้าระวังเว็บไซต์จากภายนอกองค์กรได้อย่างง่ายๆ และไม่มีค่าใช้จ่าย ทำให้เห็นภาพการใช้งานจากภายนอกได้เป็นอย่างดี

  • วิธีการใช้ Google Sheets เป็นฐานข้อมูล

    Google Sheets เป็นหนึ่งใน Google Apps ซึ่งเป็น Application Suite ของ Google ประกอบด้วย

    ในการใช้งานทั่วไป Google Apps สามารถตอบสนองการใช้งานได้เป็นอย่างดี แต่เมื่อต้องการทำกิจกรรมบางอย่างที่นอกเหนือไปจากการใช้งานพื้นฐาน ผู้ใช้สามารถพัฒนาเพิ่มเติมได้เอง ด้วย Google Apps Script

    Google Apps Script เป็น Scripting Language ที่อยู่บนพื้นฐานของภาษา JavaScript สามารถใช้งานได้และพัฒนาต่อยอดได้ทันทีโดยไม่ต้องติดตั้งอะไรเพิ่มเติมอีกแล้ว สามารถเรียกใช้ Google Service ต่างๆได้มากมาย รวมถึง Google Sheets เพื่อสร้าง เมนูพิเศษ หรือ Macro เพื่อให้การทำงานที่ทำหลายๆขั้นตอนลดลงเหลือเพียงแค่คลิกเดียว อีกทั้งยังสามารถตั้งเวลาให้ทำงานอัตโนมัติ หรือ ตั้ง Trigger เพื่อให้ทำงานเมื่อเกิด Action ต่างๆได้อีกด้วย

    Google Apps Script มี 3 ชนิด ได้แค่ Standalone, Bound to Google Apps และ Web App ซึ่งจะสามารถใช้งานร่วมกับ Google Sites ได้อีกด้วย (Sites Gadget) รายละเอียดสามารถอ่านเพิ่มเติมได้ที่ Google Apps Script

    ในที่นี้ จะแสดงตัวอย่างการประยุกต์ใช้ Google Apps Script แบบ Standalone เพื่อพัฒนาให้ Google Sheets ทำหน้าที่เป็นฐานข้อมูล และจะนำไปสู่การต่อยอดเป็น วิธีการใช้ Google Sheets เป็นระบบเฝ้าระวังเว็บไซต์ (Website Monitoring) จากภายนอกองค์กร เพื่อตรวจสอบระยะเวลาในการตอบสนอง ( Response Time) ของเว็บไซต์ ได้อีกด้วย

    วิธีการใช้งาน Google Apps Script แบบ Standalone

    1. ใน Google Drive คลิก New > More > Connect more apps
    1. ในชื่อ search ใส่คำว่า script แล้วกด Enter
      จะพบ Google Apps Script แล้วกดปุ่ม Connect
    2. จากนั้น ใน Google Drive ให้คลิกที่ New > More > Google Apps Script
    3. จากนั้นให้คลิก Close ได้เลย
    4. จะได้พื้นที่โปรเจค (Project) ในการพัฒนา Google Apps Script โดยในแต่ละโปรเจคจะประกอบไปด้วยหลายๆไฟล์ Google Apps Script ได้

    ในการพัฒนา Google Apps Script นั้น จะต้องเขียนในรูปแบบของฟังก์ชั่น (Function) เพื่อให้สะดวกในการใช้งานต่างๆ

    ตัวอย่างเช่น มี Google Sheets อยู่ใน Google Drive ดังภาพ

    มีรายละเอียดดังนี้

    1. ชื่อของ SpreadSheet คือ “ฐานข้อมูลของฉัน”
    2. ประกอบไปด้วย Sheet ชื่อ “Sheet1” และ “Log”
    3. มี URL คือ
      https://docs.google.com/a/psu.ac.th/spreadsheets/d/1HJmyqiBYC_AEATmdUWakLgHFyYGqSqeqSA8xEw-8o-c/edit

    ต่อไปเป็นขั้นตอนการเขียน Google Apps Script เพื่อติดต่อกับ Google Sheet ข้างต้น เพื่อเขียนข้อมูลลงไป โดยตั้งชื่อโปรเจคนี้ว่า ProjectMyDB ตั้งชื่อไฟล์ว่า SheetDB.gs และตั้งชื่อฟังก์ชั่น “editSheet” ดังภาพ

    ขั้นตอนการทำงานของฟังก์ชั่น editSheet

    1. สร้างตัวแปร ss รับค่าจากการเปิด SpreadSheet จาก URL ข้างต้นด้วยคำสั่ง
      var ss = SpreadsheetApp.openByUrl('https://docs.google.com/a/psu.ac.th/spreadsheets/d/1HJmyqiBYC_AEATmdUWakLgHFyYGqSqeqSA8xEw-8o-c/edit');
    1. สั่งให้ SpreadSheet ดังกล่าว Active ด้วยคำสั่ง
      SpreadsheetApp.setActiveSpreadsheet(ss);

    1. เนื่องจากในแต่ละ SpreadSheet ประกอบด้วยหลาย Sheet จึงต้องระบุว่า จะทำงานกับ Active Sheet ชื่อ “Sheet1” ด้วยคำสั่ง
      SpreadsheetApp.setActiveSheet(ss.getSheetByName("Sheet1"));

    1. สร้างตัวแปร activeSheet เพื่อกำหนดว่ากำลังทำงาน Active Sheet ด้วยคำสั่ง
      var activeSheet=ss.getActiveSheet();

    1. เมื่อต้องการเขียนค่า “Hello World” ลงใน Active Sheet ที่ Cell “C3” ใช้คำสั่ง
      activeSheet.getRange("C3").setValue("Hello World");

    1. หากต้องการเขียนค่าทีละหลายๆ Cell หรือเป็น Range ต้องสร้างข้อมูลชนิด Array 2 มิติขึ้นมา แล้วจึงเขียนค่าลงไป กรณีต้องการใส่ค่าในช่วง “A1:C1” ใช้คำสั่ง
      var values =[  ["คณกรณ์","หอศิริธรรม","'3720024"]  ];
      activeSheet.getRange("A1:C1").setValues(values);

    1. หากต้องการเขียนค่าในช่วง “A2:A4” ใช้คำสั่ง
      values = [ ["เกรียงไกร"],["หนูทองคำ"],["'4220020"] ];
      activeSheet.getRange("A2:A4").setValues(values);

    1. เมื่อจะเก็บข้อมูลจริงๆ วิธีการข้างต้นจะไม่สะดวก เพราะจะต้องทราบว่าแถวสุดท้ายแล้วเพิ่มค่าแถวไปทีละหนึ่ง ซึ่งสามารถใช้วิธีการ Append Row กล่าวคือเขียนค่าลงไปในแถวถัดจากแถวล่าสุดที่มีข้อมูลได้ ในตัวอย่างนี้ จะสลับไปใช้ Sheet ชื่อ “Log” แล้วใส่ค่าลงไปด้วยคำสั่ง
      SpreadsheetApp.setActiveSheet(ss.getSheetByName("Log"));
      activeSheet=ss.getActiveSheet();
      var timestamp = new Date();
      activeSheet.appendRow([timestamp, 200 , 300]);
      timestamp = new Date();
      activeSheet.appendRow([timestamp, 200 , 456]);

    จากนั้น Save ข้อมูล แล้วสั่ง Run โดยเลือกฟังก์ชั่นชื่อ editSheet ดังภาพ

    ในการใช้งานครั้งแรก จะปรากฏหน้าต่าง Consent ขึ้นมาเพื่อขอสิทธิ์ในการเข้าใช้ไฟล์

    ผลที่ได้จากการทำงานคือ

    และ

    จะเห็นได้ว่าสามารถใช้ Google Apps Script เพื่อเขียนค่าใน Google Sheets เพื่อเป็นฐานข้อมูลได้ และสามารถประยุกต์ใช้งานอื่นๆได้อีกมากมาย