Tag: gas

  • เทคนิคการวัดความเร็วในการตอบอีเมลลูกค้า

    ถ้ามี KPI ที่ต้องทำให้สำเร็จคือ “ร้อยละของปัญหาที่ตอบกลับลูกค้าภายใน 2 วันทำการ”
    แล้ว … ช่องทางที่รับปัญหาจากลูกค้าคือ ทางอีเมล (ในที่นี้เป็นบริการอีเมลบนระบบของ Google Mail หรือ Gmail)
    โดยการตอบกลับ คือ การ Reply กลับไปหาลูกค้า
    เวลาที่นับคือ นับตั้งแต่เวลาที่อีเมลเข้ามาถึง จนกระทั่งมีการตอบกลับไปหาลูกค้าทางอีเมลฉบับแรก

    สำหรับคนที่ใช้ Google Mail หรือ Gmail อยู่ สามารถใช้ Google Sheets ทำรายงานได้ ตามขั้นตอนต่อไปนี้
    1. ไปที่ drive.google.com (ให้ Login ด้วย Account ที่ต้องการด้วย)
    2. สร้าง Google Sheets แล้วตั้งชื่อตามต้องการ เช่น Report
    3. ไปที่เมนู Tools > Script Editor
    2559-08-04 11_20_00-My Drive - Google Drive
    4. ตั้งชื่อ Project ว่า report แล้ววางโค๊ดต่อไปนี้ลงไป

     

    function reportResponseTime() {
    // ถ้าจะทำรายงานทั้ง Inbox ให้ uncomment บรรทัดต่อไปแทน
    //var threads = GmailApp.getInboxThreads();

    // ถ้าจะทำรายงานเฉพาะ Lable ที่เตรียมไว้ ในที่นี้ใช้ Label “support-psuemail”
    var threads = GmailApp.search(‘label:support-psuemail ‘);

    for (var i = 0; i < threads.length; i++) { // วนลูปแต่ละ Thread
    if (threads[i].getMessageCount() > 1) { // สนใจเฉพาะ Thread ที่มีการตอบกลับเท่านั้น
    var messages = threads[i].getMessages(); // Subject ของอีเมล
    var d1= messages[0].getDate().getTime(); // เวลาที่อีเมลเข้ามา
    var d2= messages[1].getDate().getTime(); // เวลาที่ตอบกลับฉบับแรก
    var diff = (d2-d1)/(1000*60*60); // ระยะเวลาหน่วยเป็น ชั่วโมง

    // เขียนต่อท้าย Sheet ที่กำลังใช้งาน
    SpreadsheetApp.getActiveSheet().appendRow([messages[0].getSubject(), messages[0].getDate(), messages[1].getDate(), diff])
    }
    }
    }

     

     

    2559-08-04 11_24_42-Clipboard

    5. คลิก Run > reportResponseTime
    (หากมีหน้าจอ Consense ต่างๆขึ้นมาให้ Allow ไป)
    6. ผลจะปรากฏใน Sheet ที่เปิดไว้
    2559-08-04 11_34_18-Report - Google Sheets
    7. จากนั้นสามารถเอาผลไปคำนวนต่อ เช่น ร้อยละของอีเมลที่ตอบสนองภายใน 48 ชั่วโมงหรือ 2 วัน เป็นต้น และสามารถตอบคำถามได้ว่า ทำไมบางฉบับใช้เวลาเกิน 48 ชั่วโมง (อาจจะเป็นเพราะติดเสาร์อาทิตย์เป็นต้น)

    *** กรุณาอ้างอิงด้วยนะครับ หากนำไปเผยแพร่ต่อ ***

  • การแสดงผลจำนวน Quota การส่งอีเมลที่ยังเหลืออยู่ในรอบ 24 ชั่วโมง

    1. ปิด Google Sheets : GASWS1
    2. เมนู Tools > Script Editor…
    3. เมนู File > New > Script File
      ตั้งชื่อ: myscript6
    4. สร้าง function remainDailQuota() ตามนี้
      function remainDailQuota() {
       // https://developers.google.com/apps-script/guides/services/quotas
       var emailQuotaRemaining = MailApp.getRemainingDailyQuota();
       var emailaddress=Session.getActiveUser().getEmail();
       var subject="Email Quota Remaining";
       MailApp.sendEmail( emailaddress, 
       subject ,
       "คุณเหลือ Quota การส่งอีเมลอีก " + emailQuotaRemaining + " ฉบับ ในรอบ 24 ชั่วโมง"
       ); 
      }
    5. เมนู File > Save หรือ กดปุ่ม Ctrl+s
    6. เมนู Run > remainDailQuota
  • การส่งไฟล์แบบ Top Secret!

    1. ปิด Google Sheets : GASWS1
    2. เมนู Tools > Script Editor…
    3. เมนู File > New > Script File
      ตั้งชื่อ: myscript6
    4. สร้าง function MailMerge4() ตามนี้
      function MailMerge4() {
       var ss = SpreadsheetApp.getActiveSpreadsheet(),
       SalarySheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Salary")), 
       TemplateID='1bjpQnJikYMGYNaJQhetpZpkHyjI7iqBqDufprzMSo4k', 
       header = "A1:G1",
       data="A2:G6", 
       dataRows = SalarySheet.getRange(data).getValues(),
       headerRow = SalarySheet.getRange(header).getValues(),
       numColumns = SalarySheet.getRange(header).getNumColumns(),
       
       emailaddress= "",
       subject = "",
       docUrl = ""; 
      
       for (var i=0 ; i < dataRows.length ; i++) {
       emailText="";
       subject = "[ลับ] กองคลัง : แจ้งการโอนเงินให้คุณ " + dataRows[i][0] + " " + dataRows[i][1];
       var id =DriveApp.getFileById(TemplateID).makeCopy(subject).getId(),
       doc=DocumentApp.openById(id),
       docBody=doc.getBody();
       for (var j = 0 ; j < numColumns -1 ; j++) { 
       docBody.replaceText('{' + headerRow[0][j] + '}' , dataRows[i][j]); 
       } 
       
       emailaddress=dataRows[i][2];
       
       doc.addViewer( emailaddress);
       docUrl=doc.getUrl();
       doc.saveAndClose();
       
       var attachment = DocumentApp.openById(id);
       MailApp.sendEmail( emailaddress, 
       subject ,
       "เปิดอ่านเอกสารลับได้ที่ \n" + docUrl
       ); 
       try { 
      
       dataRows[i][numColumns-1] = new Date(); 
       } catch (e) {
       
       dataRows[i][numColumns-1] = e.message;
       } 
       }
       
       SalarySheet.getRange(data).setValues(dataRows);
      }
    5. เมนู File > Save หรือ กดปุ่ม Ctrl+s
    6. เมนู Run > MailMerge4
    7. สร้าง function MailMerge5() ตามนี้
      function MailMerge5() {
       var ss = SpreadsheetApp.getActiveSpreadsheet(),
       SalarySheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Salary")), 
       TemplateID='1WzzAwF5cDtQD0kcrLKRdP0ZO6-6MCqc_VXRUxzgq_gI', 
       header = "A1:H1",
       data="A2:H6", 
       dataRows = SalarySheet.getRange(data).getValues(),
       headerRow = SalarySheet.getRange(header).getValues(),
       numColumns = SalarySheet.getRange(header).getNumColumns(),
       
       emailaddress= "",
       subject = "",
       docUrl = ""; 
      
       for (var i=0 ; i < dataRows.length ; i++) {
       emailText="";
       subject = "[ลับสุดยอดดดดด] กองคลัง : แจ้งเอกสารลับให้คุณ " + dataRows[i][0] + " " + dataRows[i][1];
       var id =DriveApp.getFileById(TemplateID).makeCopy(subject).getId(),
       doc=DocumentApp.openById(id),
       docBody=doc.getBody();
       for (var j = 0 ; j < numColumns -1 ; j++) { 
       docBody.replaceText('{' + headerRow[0][j] + '}' , dataRows[i][j]); 
       } 
       
       emailaddress=dataRows[i][2];
       
       doc.addViewer( emailaddress);
       docUrl=doc.getUrl();
       doc.saveAndClose();
       
       var now = new Date();
       
       
       MailApp.sendEmail( emailaddress, 
       subject ,
       "เปิดอ่านเอกสารลับสุดยอดได้ที่ \n" + docUrl
       ); 
       try { 
       
       dataRows[i][numColumns-2] = id; 
       dataRows[i][numColumns-1] = now; 
       } catch (e) {
       
       dataRows[i][numColumns-1] = e.message;
       } 
       }
       
       SalarySheet.getRange(data).setValues(dataRows);
       ScriptApp.newTrigger('destroySecretDocument')
       .timeBased()
       .after(2 * 60 * 1000)
       .create();
       
      }
    8. สร้าง function destroySecretDocument() ตามนี้
      function destroySecretDocument() {
       var ss = SpreadsheetApp.getActiveSpreadsheet(),
       SalarySheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Salary")),
       DataRange=SalarySheet.getDataRange().getValues();
       
       for(var i=1; i< DataRange.length; i++){
       var id=DataRange[i][6];
       var emailAddress=DataRange[i][2];
       DocumentApp.openById(id).removeEditor(emailAddress);
       DriveApp.removeFile(DriveApp.getFileById(id));
       }
      }
    9. เมนู File > Save หรือ กดปุ่ม Ctrl+s
      เมนู Run > MailMerge5
  • การส่ง email ถึงผู้รับตามที่กำหนด พร้อมแนบข้อความ/ไฟล์ที่ต้องการ

    1. ปิด Google Sheets : GASWS1
    2. เมนู Tools > Script Editor…
    3. เมนู File > New > Script File
      ตั้งชื่อ: myscript6
    4. สร้าง function MailMerge3() ตามนี้
      function MailMerge3() {
       var ss = SpreadsheetApp.getActiveSpreadsheet(),
       SalarySheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Salary")), 
       TemplateID='1bjpQnJikYMGYNaJQhetpZpkHyjI7iqBqDufprzMSo4k', 
       header = "A1:G1",
       data="A2:G6", 
       dataRows = SalarySheet.getRange(data).getValues(),
       headerRow = SalarySheet.getRange(header).getValues(),
       numColumns = SalarySheet.getRange(header).getNumColumns(),
       emailText = ""; 
      
       for (var i=0 ; i < dataRows.length ; i++) {
       emailText="";
       var id =DriveApp.getFileById(TemplateID).makeCopy("กองคลัง : แจ้งการโอนเงินให้คุณ " + dataRows[i][0] + " " + dataRows[i][1]).getId(),
       doc=DocumentApp.openById(id),
       docBody=doc.getBody();
       for (var j = 0 ; j < numColumns -1 ; j++) { 
       docBody.replaceText('{' + headerRow[0][j] + '}' , dataRows[i][j]); 
       } 
       emailText=docBody.getText();
       doc.saveAndClose();
       
       
       var emailaddress=dataRows[i][2],
       subject = "กองคลัง : แจ้งการโอนเงินให้คุณ " + dataRows[i][0] + " " + dataRows[i][1],
       attachment = DocumentApp.openById(id);
       MailApp.sendEmail( emailaddress, 
       subject ,
       emailText, 
       {
       attachments: [attachment.getAs(MimeType.PDF)]
       }
       ); 
       try { 
      
       dataRows[i][numColumns-1] = new Date(); 
       } catch (e) {
       
       dataRows[i][numColumns-1] = e.message;
       } 
       }
       
       SalarySheet.getRange(data).setValues(dataRows);
      }
    5. เมนู File > Save หรือ กดปุ่ม Ctrl+s
    6. เมนู Run > MailMerge3
  • การสร้างไฟล์ PDF จากข้อความที่ต้องการ

    1. เปิด Google Sheets : GASWS1
    2. เมนู Tools > Script Editor…
    3. เมนู File > New > Script File
      ตั้งชื่อ: myscript6
    4. สร้าง function MailMerge2() ตามนี้
      function MailMerge2() {
       var ss = SpreadsheetApp.getActiveSpreadsheet(),
       SalarySheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Salary")), 
       TemplateID='1bjpQnJikYMGYNaJQhetpZpkHyjI7iqBqDufprzMSo4k', 
       header = "A1:G1",
       data="A2:G6", 
       dataRows = SalarySheet.getRange(data).getValues(),
       headerRow = SalarySheet.getRange(header).getValues(),
       numColumns = SalarySheet.getRange(header).getNumColumns();
       
       
      
       for (var i=0 ; i < dataRows.length ; i++) {
       var id =DriveApp.getFileById(TemplateID).makeCopy("กองคลัง : แจ้งการโอนเงินให้คุณ " + dataRows[i][0] + " " + dataRows[i][1]).getId(),
       doc=DocumentApp.openById(id),
       docBody=doc.getBody();
       for (var j = 0 ; j < numColumns -1 ; j++) { 
       docBody.replaceText('{' + headerRow[0][j] + '}' , dataRows[i][j]); 
       } 
       doc.saveAndClose();
       
       var pdfFile = DriveApp.createFile(doc.getAs(MimeType.PDF));
       try { 
      
       dataRows[i][numColumns-1] = new Date(); 
       } catch (e) {
       
       dataRows[i][numColumns-1] = e.message;
       } 
       }
       
       SalarySheet.getRange(data).setValues(dataRows);
      }
    5. เมนู File > Save หรือ กดปุ่ม Ctrl+s
    6. เมนู Run > MailMerge2
  • แทนที่ข้อความ ด้วยค่าใน 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
  • เทคนิคการอ่านค่าจากเว็บไซต์ที่มีการเปลี่ยนแปลง (ราคาหุ้น) มาเก็บไว้บน 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

  • เริ่มต้นใช้งาน 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