Hướng Dẫn Apps Script

Đồng Bộ Google Calendar Với Google Sheets Bằng Apps Script

Tuân HoangTuân Hoang
14 tháng 5, 2026
5 phút đọc
Ảnh minh họa bài viết: Đồng Bộ Google Calendar Với Google Sheets Bằng Apps Script

Tại Sao Đồng Bộ Calendar Với Sheets?

Google Calendar lưu lịch hẹn, Google Sheets lưu dữ liệu dạng bảng. Kết hợp hai công cụ qua Apps Script giúp bạn: tạo báo cáo thời gian làm việc, quản lý lịch nhân viên tập trung, đặt lịch hàng loạt từ danh sách và gửi nhắc nhở tự động.

Đọc Events Từ Calendar Vào Sheet

function syncCalendarToSheet() {
  try {
    const now = new Date();
    const startDate = new Date(now.getFullYear(), now.getMonth(), 1);
    const endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0, 23, 59, 59);
    const calendar = CalendarApp.getDefaultCalendar();
    const events = calendar.getEvents(startDate, endDate);

    const ss = SpreadsheetApp.getActiveSpreadsheet();
    const sheet = ss.getSheetByName('Calendar Events') || ss.insertSheet('Calendar Events');
    sheet.clearContents();

    const headers = ['ID', 'Tiêu đề', 'Bắt đầu', 'Kết thúc', 'Địa điểm', 'Mô tả', 'Khách mời'];
    sheet.getRange(1, 1, 1, headers.length).setValues([headers])
      .setFontWeight('bold').setBackground('#4285F4').setFontColor('#FFFFFF');

    if (events.length === 0) { console.log('No events found.'); return; }

    const rows = events.map(ev => [
      ev.getId(),
      ev.getTitle(),
      ev.getStartTime(),
      ev.getEndTime(),
      ev.getLocation() || '',
      ev.getDescription() || '',
      ev.getGuestList().map(g => g.getEmail()).join(', ')
    ]);

    sheet.getRange(2, 1, rows.length, headers.length).setValues(rows);
    sheet.getRange(2, 3, rows.length, 2).setNumberFormat('dd/MM/yyyy HH:mm');
    sheet.autoResizeColumns(1, headers.length);
    console.log('Synced ' + events.length + ' events.');
  } catch (err) {
    console.error('syncCalendarToSheet error: ' + err.toString());
    throw err;
  }
}

Tạo Events Hàng Loạt Từ Sheet

Sheet cần có headers: Tiêu đề | Ngày bắt đầu | Giờ bắt đầu | Địa điểm | Mô tả | Email khách | Event ID.

function createEventsFromSheet() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Events To Create');
  if (!sheet) throw new Error('Sheet "Events To Create" not found');

  const data = sheet.getDataRange().getValues();
  const headers = data[0];
  const calendar = CalendarApp.getDefaultCalendar();

  let created = 0;
  for (let i = 1; i < data.length; i++) {
    const row = data[i];
    const eventIdCol = headers.indexOf('Event ID');

    // Bỏ qua nếu đã tạo
    if (eventIdCol >= 0 && row[eventIdCol]) continue;
    if (!row[0] || !row[1]) continue;

    try {
      const startDate = new Date(row[1]);
      if (row[2]) {
        const t = String(row[2]).match(/(d+):(d+)/);
        if (t) startDate.setHours(+t[1], +t[2], 0);
      }
      const endDate = new Date(startDate.getTime() + 60 * 60 * 1000);
      const options = {};
      if (row[3]) options.location = row[3];
      if (row[4]) options.description = row[4];
      if (row[5]) { options.guests = row[5]; options.sendInvites = true; }

      const event = calendar.createEvent(row[0], startDate, endDate, options);
      if (eventIdCol >= 0) sheet.getRange(i + 1, eventIdCol + 1).setValue(event.getId());
      created++;
      Utilities.sleep(200);
    } catch (err) {
      console.error('Row ' + (i + 1) + ': ' + err.toString());
    }
  }
  console.log('Created ' + created + ' events.');
}

Nhắc Nhở Deadline Tự Động

// Chạy hàng ngày lúc 8h — nhắc việc 3 ngày tới
function sendDeadlineReminders() {
  const today = new Date();
  const threeDays = new Date(today.getTime() + 3 * 24 * 60 * 60 * 1000);
  const events = CalendarApp.getDefaultCalendar().getEvents(today, threeDays);
  if (events.length === 0) return;

  let body = '<h2>Sự kiện sắp tới</h2><ul>';
  events.forEach(ev => {
    const days = Math.ceil((ev.getStartTime() - today) / 86400000);
    body += '<li><strong>' + ev.getTitle() + '</strong> — '
          + ev.getStartTime().toLocaleString('vi-VN') + ' (' + days + ' ngày nữa)</li>';
  });
  body += '</ul>';
  MailApp.sendEmail({ to: Session.getActiveUser().getEmail(), subject: 'Nhắc việc: ' + events.length + ' sự kiện', htmlBody: body });
}

Use Cases Thực Tế

  • Lịch team: Sync calendar mỗi người vào sheet tổng hợp cho manager.
  • Đặt lịch hẹn: Khách điền form → Apps Script tạo Calendar event tự động.
  • Báo cáo giờ làm: Export events để tính tổng giờ theo dự án.
  • Nhắc deadline dự án: Trigger hàng ngày gửi email nhắc công việc sắp đến hạn.

Chia sẻ bài viết:

Tuân Hoang

Tuân Hoang

Đội ngũ SheetStore

Google SheetsGoogle Apps ScriptCRMAutomationPhần mềm quản lý doanh nghiệp

Google Workspace Certified, 5+ years experience

Bạn thấy bài viết hữu ích?

Đăng ký nhận thông báo khi có bài viết mới.

Nhận thông báo khi có bài viết mới. Không spam, hứa luôn! 😊

Bình luận (0)

Vui lòng đăng nhập để tham gia thảo luận