ผู้เขียน หัวข้อ: Google Sheet, Google Calendar และ Google Apps Script  (อ่าน 339 ครั้ง)

0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 2591
  • คนดีไม่เบ่ง คนเก่งไม่โม้ คนใหญ่โตไม่อวด
    • ดูรายละเอียด
    • อีเมล์
ผมเป็นคนหนึ่งที่ชีวิตการทำงานจะต้องมีตารางเวลางานหรือที่เรียกกันง่าย ๆ เช่น ตารางเข้าเวร ตารางเข้ากะ ตารางขึ้นเวร ใครจะเรียกแบบไหนเราคือพวกเดียวกันครับ แต่ของผมเองนั้นจะแตกต่างไม่เหมือนใครตรงที่ วันหยุด วันทำงานในแต่ละเดือนจะไม่ซ้ำกันเลย เรียกได้ว่า จะหยุดงานไปไหน ต้องวางแผนกันล่วงหน้าเป็นเดือน

ทุกครั้งที่ตารางเวรออกมา ผมต้องมาคอยถ่ายรูปตารางเวรไว้ดูกันลืม หรือถ้าขยัน(ถึก) ก็เพิ่มตารางเวรไว้ที่ Google Calendar โดยลงทีละรายการจนครบ เพื่อไว้ให้คอยแจ้งเตือน หรือดูตารางเวรผ่านโทรศัพท์ และคอมพิวเตอร์โน๊ตบุ๊ค กันลืม!!! (เคยลืมมาแล้วครับ ฮาๆๆ)

I am not lazy i am on energy saving mode.

จนวันหนึ่งก็ทนถึกไม่ไหว จึงเริ่มค้นหาใน Google ว่าทำอย่างไร? จึงจะเพิ่มตารางเวร เข้าไปใน Google Calendar โดยกดปุ่มทีเดียว และสามารถเพิ่มนัดหมายอื่น ๆ ทีหลังได้ พร้อมทั้งอัพเดทรายการทั้งหมดบนมือถือ คอมพิวเตอร์โน๊ตบุ๊ค ให้ทั้งหมดทีเดียวจบ จนได้เจอแนวทางคำตอบจาก 3 คลิปนี้ครับ


Google อธิบายแนวทางได้เข้าใจง่ายมาก ๆ

เริ่มต้นการใช้ Google Apps Script

อันนี้ตรงตามที่ต้องการเลย
หลังจากได้เรียนรู้ทำให้ต้องเข้าใจการเขียน Google Apps Script ซึ่งใครที่เข้าใจภาษา JavaScript ก็ไม่ยากเลย แต่สำหรับมือใหม่เช่นเดียวกับผมก็ไม่(น่า)ยากเช่นครับ แล้ว Google Apps Script คืออะไร? ก็ไปอ่านได้ตามนี้ครับ

JS: ลองเล่น Google Apps Script ใน Google Sheets
Google Apps Script คืออะไร ?
medium.com

พอจะเข้าใจแล้วก็ ได้เวลามาลองทำของตัวเองไว้ใช้งานบ้าง เริ่มจากสร้างไฟล์ใน Google Sheet และลงตารางเวรไว้ตามรูปแบบนี้เลยครับ


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

แล้วมาต่อที่การเขียน Google Apps Script เพื่อให้ข้อมูลทั้งหมด ไปแสดงอยู่ที่ Google Calendar โดยอัตโนมัติก็จะได้ประมาณนี้ครับ (ชีวิตดี๊ดี)


จะเห็นว่าแสดงผลที่ Google Calendar ช้าหน่อย เพราะผมตั้งค่าให้มีการหน่วงเวลาไว้
ใน Google Apps Script ก็จะเขียนฟังก์ชันไว้ประมาณว่า ถ้าเพิ่มหรือลบข้อมูลที่ Google Calendar ก็จะอัพเดทมาที่ Google Sheet โดยอัตโนมัติด้วยเหมือนกัน และกรณีที่ข้อมูลผ่านเลยวันที่กำหนดไว้ก็จะไม่เอามาที่ Google Sheet แล้วแต่ยังคงไว้ที่ Google Calendar อยู่ ดังนั้นใน Google Sheet ก็จะเป็นข้อมูลใหม่ทั้งหมด เรียกได้ว่าไม่สนใจอดีต มุ่งสู่อนาคตอย่างเดียวครับ

ในส่วนของโค้ดที่จะเขียนใน Google Apps Script ก็ตามตัวอย่างที่ได้ทำไว้ได้ครับ อย่าลืมเปลี่ยนข้อมูล Your Calendar ID เป็นของตัวเองครับ โดยมี 3 Function หลักตามนี้เลย

1.) getEvents() เอาไว้ให้ดึงข้อมูลจาก Google Calendar ทั้งหมดมาที่ Google Sheet โดยกำหนดวันที่ต้องการได้ครับ แต่ของผมจะกำหนดเป็นวันที่ล่าสุดจนถึงสิ้นปีไปเลย และหากมีการ เพิ่ม/ลบ ข้อมูลที่ Google Calendar ผมก็ตั้งค่า Trigger ให้ฟังก์ชันนี้ทำงาน จะได้ไม่ต้องมาคอยเปิด และรันฟังก์ชันทุก ๆ ครั้ง (ชีวิตง่ายไปอีก)


ไปที่เมนู Edit → Current project’s triggers แล้วตั้งค่าการทำงานของฟังก์ชั่น getEvents() ได้ตามนี้เลยครับ


2.) addEvents() เอาไว้เพิ่มข้อมูลจาก Google Sheet ทั้งหมดมาที่ Google Calendar โดยผมต้องการให้ลบข้อมูลเดิมทั้งหมดออกก่อน แล้วค่อยทำการเพิ่มข้อมูล หากเหตุการณ์ที่จะอัพเดทมีไม่เยอะแนะนำเพิ่มโดยตรงที่ Google Calendar ได้เลยครับ เพราะฟังก์ชัน getEvents() จะดึงข้อมูลมาเพิ่มลงใน Google Sheet ให้แบบอัตโนมัติเลยครับ


3.) onOpen() ผมได้กำหนดให้มีเมนูสำหรับฟังก์ชัน addEvents() ทุกครั้งที่เปิดไฟล์ Google Sheet ที่เป็นข้อมูลตารางเวร และเวลาที่จะอัพข้อมูลไปที่ Google Calendar จะได้กดเมนูให้ฟังก์ชันทำงานทีเดียวได้เลย นั่งรอไม่เกินนาทีก็จบ (สบายๆ ไปอีก)


4.) Code แบบเต็มๆ




อ้างถึง


//get events from calendar
function getEvents() {
 
  var calenDar = CalendarApp.getCalendarById("Your Calendar ID");
  var lastDateOfYear = new Date(new Date().getFullYear(), 11, 31); // JavaScript counts months from 0 to 11. January is 0. December is 11.
  var events = calenDar.getEvents(new Date(), lastDateOfYear); // new Date() = today
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 
  var lastRow = spreadSheet.getLastRow();
  spreadSheet.getRange(2, 1, lastRow, 5).clearContent();
 
  for(var i = 0; i < events.length; i++) {
    var title = events.getTitle();
    var start = events.getStartTime();
    var end = events.getEndTime();
    var location = events.getLocation();
    var description = events.getDescription();
   
    spreadSheet.getRange(i+2, 1).setValue(title);
    spreadSheet.getRange(i+2, 2).setValue(start);
    spreadSheet.getRange(i+2, 2).setNumberFormat("dd/mm/yyyy h:mm:ss");
    spreadSheet.getRange(i+2, 3).setValue(end);
    spreadSheet.getRange(i+2, 3).setNumberFormat("dd/mm/yyyy h:mm:ss");
    spreadSheet.getRange(i+2, 4).setValue(location);
    spreadSheet.getRange(i+2, 5).setValue(description);
  }
}


//delete and add events to calendar
function addEvents() {
 
  //open the event calendar
  var calenDar = CalendarApp.getCalendarById("Your Calendar ID");
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 
  //pull information into the code, in a form that the code can understand
  var lastRow = spreadSheet.getLastRow();
  var data = spreadSheet.getRange("A2:E" + lastRow).getValues();
 
  /**
  [
    [event-1, start time-1, end time-1, location-1, description-1],
    [event-2, start time-2, end time-2, location-2, description-2],
    ..............................................................,
    [event-n, start time-n, end time-n, location-n, description-n]
  ]
  **/
 
  //delete events
  var lastDateOfYear = new Date(new Date().getFullYear(), 11, 31); // JavaScript counts months from 0 to 11. January is 0. December is 11.
  var events = calenDar.getEvents(new Date(), lastDateOfYear); // new Date() = today
  for (var i = 0; i < events.length; i++) {
    var eventsDelete = events;
    eventsDelete.deleteEvent();
    Utilities.sleep(100);
  }
 
  //add events
  for(var i = 0; i < data.length; i++) {
    var title = data[0];
    var startTime = data[1];
    Logger.log(startTime);
    var endTime = data[2];
    var location = data[3];
    var description = data[4];
   
    calenDar.createEvent(title, startTime, endTime, {location: location, description: description}); //(Title, Start Time, End Time, {options})
    //calenDar.createEvent(data[0], data[1], data[2], {location: data[3], description: data[4]}); //(Title, Start Time, End Time, {options})
    Utilities.sleep(100);
  }
}


//create menu for sync to calendar
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Sync to Calendar')
    .addItem('Add events to calendar', 'addEvents')
    .addItem('Get events from calendar', 'getEvents')
    .addToUi();
}



สรุป ผมก็ได้ฟังก์ชันการทำงานตามความต้องการแล้ว มีเวลาขี้เกียจขึ้นไปอีกเยอะเลยครับ ลองนำไปปรับใช้ในงานอื่น ๆ ที่ต้องกำหนดวันเวลาการทำงานที่ชัดเจนได้ครับ และต้องขอบคุณทุกท่านที่อ่านจนจบนะครับ หากคุณต้องการมีเวลาขี้เกียจเพิ่มมากขึ้นอีก เราคือพวกเดียวกันครับ ฮาๆๆ