Author: kanakorn.h

  • แทนที่ข้อความ ด้วยค่าใน Google Sheets

    1. เปิด Google Sheets : GASWS1
    2. สร้าง Sheet ใหม่ ชื่อ “Salary”
    3. ใส่ข้อมูล
      A1 = “Firstname”
      B1=”Lastname”
      C1=”Email”
      D1=”SalaryDetail”
      E1=”Salary”
      F1=”TransferDate”
    4. จากนั้น ให้กรอกข้อมูลต่างๆ จำนวน 5 แถว ดังภาพ
      Capture
    5. สร้าง Sheet ใหม่ ชื่อ “Template”
    6. ใส่ข้อมูล
      A1: เรียน คุณ{Firstname} {Lastname}
      A2: จะมี {SalaryDetail} จำนวน {Salary} บาท โอนให้คุณในวันที่ {TransferDate}
      A3: จึงเรียนมาเพื่อทราบ
      A4: การเงิน
    7. เมนู Tools > Script Editor…
    8. เมนู File > New > Script File
      ตั้งชื่อ: myscript5
      เขียนโค๊ดตามนี้

      function MailMerge1() {
       var ss = SpreadsheetApp.getActiveSpreadsheet(),
       SalarySheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Salary")),
       TemplateSheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Template")),
       header = "A1:G1",
       data="A2:G6",
       template="A1:A4",
       dataRows = SalarySheet.getRange(data).getValues(),
       headerRow = SalarySheet.getRange(header).getValues(),
       numColumns = SalarySheet.getRange(header).getNumColumns(),
       templateRows= TemplateSheet.getRange(template).getValues();
       
       for (var i=0 ; i < dataRows.length ; i++) {
       var newText = templateRows[0][0] + "\n" + 
       "\t" + templateRows[1][0] + "\n" +
       "\t" + templateRows[2][0] + "\n" +
       templateRows[3][0] + "\n"; 
       for (var j = 0 ; j < numColumns -1 ; j++) { 
       newText = newText.replace('{' + headerRow[0][j] + '}', dataRows[i][j]); 
       }
       try { 
      
       dataRows[i][numColumns-1] = new Date(); 
       } catch (e) {
       
       dataRows[i][numColumns-1] = e.message;
       }
       
       Logger.log(newText);
       }
       
       
       SalarySheet.getRange(data).setValues(dataRows);
       
      }
    9. เมนู File > Save หรือ กดปุ่ม Ctrl+s
    10. เมนู Run > MailMerge1
    11. ดูผลได้ที่ เมนู View > Logs หรือ กดปุ่ม Ctrl+Enter
  • spam 20150515

    นี่คือจดหมายหลอกลวง อย่าหลงเชื่อ ห้ามคลิก หรือ Reply ให้ลบทิ้งทันทีspam-20150515

  • เทคนิคการอ่านค่าจากเว็บไซต์ที่มีการเปลี่ยนแปลง (ราคาหุ้น) มาเก็บไว้บน Google Sheets

    มีโจทย์ว่าต้องการคำนวนค่า Indicator ชื่อ RSI ของกองทุนรวมในต่างประเทศ ซึ่งปิดการซื้อขายเวลา 04:00 ของเวลาในประเทศไทย ทางกองทุนจะประกาศราคา (NAV) ในเวลาประมาณ 09:00 แต่ในการตัดสินใจลงทุน จะต้องพิจารณาค่า RSI ซึ่งกองทุนจะคำนวนและประกาศให้ประมาณ 12:00 ซึ่งบางทีก็หลงลืม และไม่ทันการ

    การคำนวนค่า RSI ใช้ค่าการเปลี่ยนแปลงของราคา แบ่งเป็น Gain และ Loss แล้วมาหาค่าเฉลี่ยและเข้าสูตรคำนวน (ไม่ขอกล่าวถึง หากต้องการทราบข้อมูลเพิ่มเติม อ่าน http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:relative_strength_index_rsi)

    สรุปคือ หากต้องการทราบค่า RSI ก่อนที่ทางกองทุนจะประกาศให้ ก็ต้องคำนวนเอง โดยจดค่าการเปลี่ยนแปลงของราคาในแต่ละวันซึ่งเป็นงานที่น่าเบื่อ จึงต้องหาวิธีลดภาระ

    แนวคิดคือ เว็บไซต์ http://www.bloomberg.com/quote/WGHCEPA:ID ซึ่งจะประกาศราคา NAV ในเวลา 09:00 นั้น หากเปิด HTML ดูจะพบว่าข้อมูลที่ต้องการจะอยู่ในรูปแบบของ

    ...
    <meta itemprop="price" content="46.92">
    ...
    <meta itemprop="priceChange" content="0.16">
    ...
    <meta itemprop="priceChangePercent" content="0.34">
    ...
    <meta itemprop="quoteTime" content="2015-05-11T00:59:30-0400">

    จากนั้น สร้าง Function ตามนี้

    function getWGHCEPA(){
     var content=UrlFetchApp.fetch("http://www.bloomberg.com/quote/WGHCEPA:ID");
     //'<meta itemprop="priceChange" content="0.16">';
     var data = content.getContentText().match(/meta itemprop="(.*)" content="(.*)"/mg );
     
     var id="xxxxxxxxxxxxxxxxxxxx Your file ID xxxxxxxxxxxxxx";
     var db=SpreadsheetApp.openById(id);
     var table=db.setActiveSheet(db.getSheetByName("Data"));
     
     var result=[];
     for (var i=0; i<data.length; i++){
     var temp=data[i].match(/meta itemprop="(.*)" content="(.*)"/); 
     result[temp[1]]=temp[2];
     } 
     
     table.appendRow([result["quoteTime"], result["price"], result["priceChange"], result["priceChangePercent"]]);
     
    }

    จากนั้น ตั้ง Trigger ให้ทำงานวันละครั้ง เวลาตั้งแต่ 09:00-10:00 เป็นอันเรียบร้อย

    wghcepa-trigger

    ผลที่ได้

    wghcepa-result

  • ชีวิตสะดวกและปลอดภัยด้วยการ Sign In บน Google Chrome

    เคยเจอปัญหาเหล่านี้เมื่อต้องไปใช้งานเครื่องอื่นที่ไม่ใช่เครื่องตนเองหรือไม่ ?

    1. จะเข้าเว็บไซต์ที่เคย Bookmark เอาไว้ในเครื่องตนเอง ก็ทำไม่ได้
    2. ทำไงดีรหัสผ่านมากมาย เคยให้เว็บจำไว้ให้ แล้วตอนนี้จะใช้งานยังไงหล่ะ
    3. สภาพแวดล้อมไม่คุ้นชินเมื่อไปใช้เครื่องอื่น

    ปัญหาเหล่านี้จะหมดไป เมื่อใช้ Google Chrome และ ทำการ Sign In เอาไว้

    คำเตือน:

    1. ผู้ที่จะใช้วิธีการนี้ ควรทำระบบ 2-Step Verification ไว้ก่อน เพื่อป้องกันรหัสผ่านรั่วไหล และป้องกัน กรณีมี Keyboard Logger ฝังตัวเพื่อดักการพิมพ์รหัสผ่านจาก Keyboard ซึ่งแม้จะมีผู้ร้ายดักรหัสผ่านไปได้ ก็จะติดขั้นตอนการยืนยันตัวตนอีกชั้นของ 2-Step Verification
    2. กรณีผู้ใช้ Google Apps ขององค์กร (ทั้ง For Education และ For Business) ระบบจะทำการสร้าง Profile แยกให้ แต่ถ้าเป็น Google Account ของ Gmail นั้น จะต้องทำการ Create Profile เอง แล้วจึง Sign In เข้าไป มิฉะนั้นข้อมูลของเราจะไปปะปนกับของผู้ใช้ทั่วไป ซึ่งไม่ปลอดภัยอย่างยิ่ง
    3. วิธีการนี้ ผู้ใช้ต้อง “Remove This Person” ทุกครั้งเมื่อจบการใช้งาน (จะอธิบายต่อไป)

    วิธีการใช้งาน

    1. เปิด Google Chrome ขึ้นมาScreenshot from 2015-05-11 09:22:24
    2. ด้านขวามือบน ใกล้ๆ Tools Box คลิกรูป “คน” ดังภาพ แล้วคลิก Sign in to ChromeScreenshot from 2015-05-11 09:23:38
    3. ใส่ Google Account (Gmail Account)  หรือ Google Apps Account (Google Apps For Education/Business) และรหัสผ่าน จากนั้นคลิก Sign In สำหรับท่านที่ทำ 2-Step Verification จะพบหน้าต่างให้ใส่ Code ก็ให้ดำเนินการตามปรกติไปScreenshot from 2015-05-11 09:25:20
    4. สำหรับบัญชี Google Apps ขององค์กร จะแสดงหน้าต่างให้เลือกว่า จะสร้าง Profile ใหม่หรือไม่ แนะนำให้คลิกปุ่ม Create a new profileScreenshot from 2015-05-11 09:27:20
    5. ต่อไป คลิกปุ่ม “Ok, got it”Screenshot from 2015-05-11 09:28:20
    6. ใช้เวลาไม่นาน ระบบจะ Sync ข้อมูล Apps, Autofill, Bookmark, Extensions, History, Password, Settings, Themes, Opentabs มาให้ (สามารถเลือกได้ว่าจะ Sync อะไรมาบ้างได้) และทำการเข้ารหัส รหัสผ่านไว้ด้วย (เลือกได้ว่าจะเข้ารหัสด้วย Google Credential หรือจะสร้าง Paraphrase แยกต่างหาก — ในที่นี้ เลือกเป็น Google Credential) คราวนี้ ก็จะสามารถใช้งานได้เหมือนนั่งอยู่ที่เครื่องตนเองอีกทั้งวิธีการนี้ จะสามารถใช้งานได้ทั้งบน Smartphone และ Tablet ได้ด้วย ทำให้เมื่อ Save Bookmark เอาไว้บนคอมพิวเตอร์ ก็สามารถไปเปิดดูได้บน Tablet ได้ทันทีScreenshot from 2015-05-11 09:32:15
    7. เมื่อเลิกใช้งาน ให้ทำตามข้อ 2. แล้วคลิก Switch User แทน จากนั้น ที่รูป Profile ด้านมุมขวา คลิก Remove this personScreenshot from 2015-05-11 09:37:38
    8. คลิก Remove this person อีกครั้งเพื่อยืนยันScreenshot from 2015-05-11 09:37:46
    9. เท่านี้ ข้อมูลก็จะปลอดภัยแล้ว 😉Screenshot from 2015-05-11 09:38:31
    10. หากต้องการปรับแต่งเรื่อง สิ่งที่ต้องการจะ Sync ให้เปิด chrome://settings/syncSetup แล้วเลือกสิ่งต่างๆได้ตามต้องการScreenshot from 2015-05-11 09:41:35
    11. สลับหลาย user ได้แบบไม่ต้องกลัวว่าระบบ Single Sign-On จะตีกัน 😉 เพราะแยก Profile ออกไปชัดเจน ไม่ต้องคอย Login – Logout ข้ามไปมาตลอดเวลา
      chrome-multiuser

    ชีวิตดี๊ดี 😉

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

  • Spam 20150508

    นี่คือจดหมายหลอกลวง อย่าหลงเชื่อ ห้ามคลิก หรือ Reply ให้ลบทิ้งทันทีScreenshot from 2015-05-08 13:23:47

  • เริ่มต้นใช้งาน GAS Editor

    1. เปิด https://drive.google.com แล้ว Login
    2. คลิกปุ่ม New > Google Sheets
    3. ตั้งชื่อไฟล์: GASWS1
    4. เมนู Tools > Script Editor
    5. เลือก Blank Project
    6. ตั้งชื่อโปรเจค : myproject1
    7. เมนู File > New > Script File
    8. ตั้งชื่อ: myscript1
    9. แก้ไข myFunction() ตามนี้
      function myFunction() {
       Logger.log("Hello World");
      }
      
    10. เมนู File > Save หรือ กดปุ่ม Ctrl+s
    11. เมนู Run > myFunction
    12. ดูผลได้ที่ เมนู View > Logs หรือ กดปุ่ม Ctrl+Enter
    13. สร้าง function myForLoop ดังนี้
    14. function myForLoop(){
      for (var i=1; i<=10 ; i++) {
      myFunction();
      }
      }
    15. แล้ว Save ด้วย กดปุ่ม Ctrl+s
    16. เมนู Run > myForLoop
    17. ดูผลได้ที่ เมนู View > Logs หรือ กดปุ่ม Ctrl+Enter
    18. เมนู File > New > Script File
    19. ตั้งชื่อ myscript2
    20. สร้าง function myDate ดังนี้
    21. function myDate() {
      Logger.log(new Date());
      }
    22. แล้ว Save ด้วย กดปุ่ม Ctrl+s
    23. เมนู Resources > All yours triggers
    24. คลิก No triggers set up. Click here to add one now.
    25. ตั้งค่า
      Run = myDate
      Event = Time-driven
      แล้วเลือกเป็น Minutes timers และ Every minute
      จากนั้นคลิกปุ่ม Save
    26. ดูผลได้ที่ เมนู View > Logs หรือ กดปุ่ม Ctrl+Enter

     

  • Case Study: ตรวจสอบ Website Availability ด้วย Google Apps Script

    1. เปิด Google Sheets : GASWS1
    2. สร้าง Sheet ใหม่ ชื่อ “Log”
    3. เมนู Tools > Script Editor…
    4. เมนู File > New > Script File
    5. ตั้งชื่อ: myscript4
    6. เขียนโค๊ดตามนี้
       function check_website(url) { 
       var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
       return response.getResponseCode();
      }
      
      function doLog(timestamp, responseCode, timeDiff) {
       
       var ss=SpreadsheetApp.getActiveSpreadsheet();
       var sheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Log")); 
       sheet.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);
      }
    7. เมนู Resources > All yours triggers
      คลิก No triggers set up. Click here to add one now.
      ตั้งค่า
      Run = getTime
      Event = Time-driven
      แล้วเลือกเป็น Minutes timers และ Every minute
      จากนั้นคลิกปุ่ม Save
  • อ่าน/เขียนข้อมูลกับ Google Sheets

    1. เปิด Google Sheets : GASWS1
    2. เมนู Tools > Script Editor…
    3. เมนู File > New > Script File
    4. ตั้งชื่อ: myscript3
    5. สร้าง function insertData1() ตามนี้
      function insertData1() {
       var ss=SpreadsheetApp.getActiveSpreadsheet();
       var sheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Sheet1"));
       sheet.getRange(1, 1).setValue("Hello World");
       sheet.getRange("A2").setValue("สวัสดี");
       
       var v1=[ ["ชื่อ","นามสกุล","อายุ"] ];
       var v2=[
       ["สมชาย"]
       ,["Robert"]
       ,["39"]
       ];
       sheet.getRange("A3:C3").setValues(v1);
       sheet.getRange("A4:A6").setValues(v2);
      }
    6. เมนู Run > insertData1
    7. สร้าง function insertData2() ตามนี้
      function insertData2() {
       var ss=SpreadsheetApp.getActiveSpreadsheet();
       var sheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Sheet1")); 
       sheet.appendRow([new Date(),"something"]);
      }
    8. เมนู File > Save หรือ กดปุ่ม Ctrl+s
    9. เมนู Run > insertData2
    10. เมนู Resources > All yours triggers
      คลิก No triggers set up. Click here to add one now.
      ตั้งค่า
      Run = insertData2
      Event = Time-driven
      แล้วเลือกเป็น Minutes timers และ Every minute
      จากนั้นคลิกปุ่ม Save
    11. ไปที่ Google Sheets “GASWS1”
    12. สร้าง Sheet ใหม่ ชื่อ “ReadData”
    13. เมนู Tools > Script Editor…
    14. สร้าง function readData1() ตามนี้
      function readData1(){
       var ss=SpreadsheetApp.getActiveSpreadsheet();
       var sheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("ReadData")); 
      
       var url="https://docs.google.com/spreadsheets/d/1oztRXjC2KJzrqC3LtiRnUPrEgohX4VTYHixylvtCdzY/edit?usp=sharing";
       var db=SpreadsheetApp.openByUrl(url);
       var table=db.setActiveSheet(db.getSheetByName("WGHCEPA"));
       var data=table.getRange("A1:J10").getValues();
       
       for (var i=0; i<data.length;i++){
       sheet.appendRow(data[i]);
       }
       
      }
    15. เมนู File > Save หรือ กดปุ่ม Ctrl+s
    16. เมนู Run > readData1
    17. สร้าง function readData2() ตามนี้
      function readData2(){
       var ss=SpreadsheetApp.getActiveSpreadsheet();
       var sheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("readData")); 
      
       var id="1oztRXjC2KJzrqC3LtiRnUPrEgohX4VTYHixylvtCdzY";
       var db=SpreadsheetApp.openById(id);
       var table=db.setActiveSheet(db.getSheetByName("WGHCEPA"));
       var data=table.getDataRange().getValues();
       
       for (var i=0; i<data.length;i++){
       sheet.appendRow(data[i]);
       }
       
      }
    18. เมนู File > Save หรือ กดปุ่ม Ctrl+s
    19. เมนู Run > readData2
    20. สร้าง function insertData3() ตามนี้
      function insertData3(){
       var url="https://docs.google.com/a/psu.ac.th/spreadsheets/d/1bQyyQrB3PPyawWVb3afMi0Kgz1KUibIfMblv351BtQI/edit?usp=sharing";
       var db=SpreadsheetApp.openByUrl(url);
       var table=db.setActiveSheet(db.getSheetByName("Sheet1"));
       // เปลี่ยนเป็น ชื่อ นามสกุล และคณะ/หน่วยงานของท่าน
       var mydata=["ชื่อ","นามสกุล","คณะ/หน่วยงาน"];
       
       table.appendRow(mydata);
      }
    21. เมนู File > Save หรือ กดปุ่ม Ctrl+s
    22. เมนู Run > insertData3