Nếu định kỳ bạn hoặc công ty của bạn sẽ phải lên 1 số lịch làm việc cố định và công khai nó tới người dùng và đội ngũ nhân sự của bạn nhưng đang gặp phải những vấn đề sau:
- Tốn nhiều thời gian khi phải chia sẻ thông tin này lên nhiều kênh giao tiếp khác nhau
- Phải làm lại từ đầu khi có sự điều chỉnh thông tin sự kiện.
Đây chính là bài viết hướng dẫn giúp bạn Quản lý và đồng bộ lịch làm việc từ Google sheet lên Website tự động.
Lĩnh vực áp dụng:
- Trung tâm đào tạo: Định kỳ đưa ra các lịch giáo dục, thi thử, sát hạch, tốt nghiệp…
- Phòng khám y tế: Lên lịch làm việc hàng tuần và thông tin Bác sĩ chuyên khoa phụ trách.
- Cơ sở tổ chức sự kiện/hội nghị: Thông tin sự kiện đã đăng ký và không gian trông có thể đăng ký.
Ứng dụng thực tế: Thông báo lịch thi sát hạch lái xe Ô Tô trong hàng tháng tại Trung tâm Giáo dục nghề nghiệp Thái Việt.
- Hàng tháng Trung tâm Thái Việt cần cập nhập lịch thi sát hạch cho toàn bộ học viên và giáo viên trên các nền tảng giao tiếp khác nhau như: Website, Fanpage, Group chat zalo…
- Tuy nhiên hiện thông tin được tạo thủ công trên Excel/Googlesheet và chia sẻ dưới dạng hình ảnh thủ công trên các nền tảng
=> Trung tâm gặp khó khăn trong việc bổ sung các thông tin thêm về sự kiện (Thời gian, địa điểm, thông tin sự kiện) hoặc tốn thời gian khi có sự điều chỉnh nếu có.
Luồng xử lý
- Tạo và quản lý công việc/sự kiện trên Google sheet
- Đồng bộ thông tin lên Google calendar
- Thêm Google calendar lên website wordpress
- Cập nhập dữ liệu khi có sự thay đổi trên Google sheet theo khái niệm CRUD[1]
Công cụ hỗ trợ
- Google sheet: Quản lý dữ liệu sự kiện và trực quan hoá tất cả sự kiện diễn ra trong tháng
- Google calendar: Chia sẻ trực quan thông tin sự kiện và người dùng có thể thêm nhắc hẹn vào lịch cá nhân.
- Make: Tạo luồng xử lý tự động
- Plugin Pretty Google Calendar: Cho phép hiển thị Google Calendar trên website
Hướng dẫn chi tiết
Tạo file quản lý sự kiện trên Google sheet
File quản lý: Quản lý sự kiện Thái Việt - Google Trang tính
Sheet gồm có 4 sheet con:
- Quản lý sự kiện: Danh sách tất cả các sự kiện đã diễn ra và sắp diễn ra của trung tâm
- Địa chỉ: Cơ sở dữ liệu về các địa điểm mà sự kiện diễn ra
- Logs: Lưu lại toàn bộ dữ liệu sự kiện (tạo mới, chỉnh sữa, xoá) nhằm hỗ trợ xử lý các luồng xử lý “xoá dữ liệu” đã được thực hiện trong sheet “Quản lý sự kiện”
- Lịch biểu: Hiển thị trực quan tất cả sự kiện diễn ra trong khoảng thời gian tuỳ chọn.
- Truy cập Format > Conditional formatting để thực hiện tuỳ chỉnh màu sự kiện, hoặc thêm tuỳ chỉnh cho phân loại sự kiện.
- Mở rộng các cột ẩn để tham khảo công thức fitler dữ liệu 2 điều kiện
=if(or(N$9="",N10=""),"",IFERROR(FILTER('Quản lý sự kiện'!$C$2:$C, ('Quản lý sự kiện'!$B$2:$B=N10)*('Quản lý sự kiện'!$D$2:$D=N$9))))
- Sheet lịch biểu giúp Quản trị viên có cái nhìn trực quan hoạt động trong 1 tháng cũng như có thể tuỳ biến và chia sẻ hình ảnh “lịch biểu” này trong hoạt động truyền thông trên social.
Đồng bộ sự kiện từ Google sheet lên Google calendar
- Tạo 1 “scenarios” trên ứng dụng make.
- Tạo 1 file .json với code sau và import vào “scenarios” trên
{ "name": "Đồng bộ sự kiện Google sheet tới Google Calendar", "flow": [ { "id": 35, "module": "google-sheets:watchRows", "version": 2, "parameters": { "from": "drive", "mode": "select", "limit": 30, "sheetId": "Lịch thi sát hạch", "__IMTCONN__": 403986, "spreadsheetId": "/1uvI-Pa3rXSeNM3hgRPSm4B-yDCOkg1plCvX-KTiM_Cw", "tableFirstRow": "A1:Z1", "includesHeaders": true, "valueRenderOption": "FORMATTED_VALUE", "dateTimeRenderOption": "FORMATTED_STRING" }, "mapper": {}, "metadata": { "designer": { "x": -126, "y": -190 }, "restore": { "parameters": { "from": { "label": "My Drive" }, "mode": { "label": "Search by path" }, "sheetId": { "label": "Lịch thi sát hạch" }, "__IMTCONN__": { "data": { "scoped": "true", "connection": "google" }, "label": "My Google connection (hoangphuctran.za@gmail.com)" }, "spreadsheetId": { "path": [ "1uvI-Pa3rXSeNM3hgRPSm4B-yDCOkg1plCvX-KTiM_Cw" ] }, "includesHeaders": { "label": "Yes" }, "valueRenderOption": { "mode": "chose", "label": "Formatted value" }, "dateTimeRenderOption": { "mode": "chose", "label": "Formatted string" } } }, "parameters": [ { "name": "__IMTCONN__", "type": "account:google", "label": "Connection", "required": true }, { "name": "mode", "type": "select", "label": "Search Method", "required": true, "validate": { "enum": [ "select", "fromAll", "map" ] } }, { "name": "includesHeaders", "type": "select", "label": "Table contains headers", "required": true, "validate": { "enum": [ true, false ] } }, { "name": "limit", "type": "uinteger", "label": "Limit", "required": true }, { "name": "valueRenderOption", "type": "select", "label": "Value render option", "validate": { "enum": [ "FORMATTED_VALUE", "UNFORMATTED_VALUE", "FORMULA" ] } }, { "name": "dateTimeRenderOption", "type": "select", "label": "Date and time render option", "validate": { "enum": [ "SERIAL_NUMBER", "FORMATTED_STRING" ] } }, { "name": "from", "type": "select", "label": "Drive", "required": true, "validate": { "enum": [ "drive", "share", "team" ] } }, { "name": "spreadsheetId", "type": "file", "label": "Spreadsheet ID", "required": true }, { "name": "sheetId", "type": "select", "label": "Sheet Name", "required": true }, { "name": "tableFirstRow", "type": "text", "label": "Row with headers", "required": true } ], "interface": [ { "name": "__ROW_NUMBER__", "type": "number", "label": "Row number" }, { "name": "__SPREADSHEET_ID__", "type": "text", "label": "Spreadsheet ID" }, { "name": "__SHEET__", "type": "text", "label": "Sheet" }, { "name": "0", "type": "text", "label": "ID Lịch (A)" }, { "name": "1", "type": "text", "label": "Sự kiện (B)" }, { "name": "2", "type": "text", "label": "Phân loại (C)" }, { "name": "3", "type": "text", "label": "Ngày bắt đầu (D)" }, { "name": "4", "type": "text", "label": "Ngày kết thúc (E)" }, { "name": "5", "type": "text", "label": "Địa chỉ tổ chức (F)" }, { "name": "6", "type": "text", "label": "Ghi chú (G)" }, { "name": "7", "type": "text", "label": "Trạng thái (H)" }, { "name": "8", "type": "text", "label": "(I)" }, { "name": "9", "type": "text", "label": "(J)" }, { "name": "10", "type": "text", "label": "(K)" }, { "name": "11", "type": "text", "label": "(L)" }, { "name": "12", "type": "text", "label": "(M)" }, { "name": "13", "type": "text", "label": "(N)" }, { "name": "14", "type": "text", "label": "(O)" }, { "name": "15", "type": "text", "label": "(P)" }, { "name": "16", "type": "text", "label": "(Q)" }, { "name": "17", "type": "text", "label": "(R)" }, { "name": "18", "type": "text", "label": "(S)" }, { "name": "19", "type": "text", "label": "(T)" }, { "name": "20", "type": "text", "label": "(U)" }, { "name": "21", "type": "text", "label": "(V)" }, { "name": "22", "type": "text", "label": "(W)" }, { "name": "23", "type": "text", "label": "(X)" }, { "name": "24", "type": "text", "label": "(Y)" }, { "name": "25", "type": "text", "label": "(Z)" } ] } }, { "id": 37, "module": "google-calendar:createAnEvent", "version": 5, "parameters": { "__IMTCONN__": 403986 }, "mapper": { "end": "{{35.`4`}}", "start": "{{35.`3`}}", "select": "detail", "summary": "{{35.`1`}}", "calendar": "ed3c787bd231d3572f6bcebbd71f7053f8e67f9e7f6e56aeba33d2476a5f5cc2@group.calendar.google.com", "location": "{{35.`5`}}", "visibility": "default", "allDayEvent": true, "description": "{{35.`6`}}", "transparency": "opaque", "conferenceDate": false, "guestsCanModify": false }, "metadata": { "designer": { "x": 230, "y": -205 }, "restore": { "expect": { "select": { "label": "In Detail" }, "colorId": { "mode": "chose" }, "calendar": { "mode": "chose", "label": "Lịch thi sát hạch" }, "attendees": { "mode": "chose" }, "overrides": { "mode": "chose" }, "recurrence": { "mode": "chose" }, "visibility": { "mode": "chose", "label": "Default" }, "allDayEvent": { "mode": "chose" }, "attachments": { "mode": "chose" }, "sendUpdates": { "mode": "chose", "label": "Empty" }, "transparency": { "mode": "chose", "label": "Busy" }, "conferenceDate": { "mode": "chose" } }, "parameters": { "__IMTCONN__": { "data": { "scoped": "true", "connection": "google" }, "label": "My Google connection (hoangphuctran.za@gmail.com)" } } }, "parameters": [ { "name": "__IMTCONN__", "type": "account:google", "label": "Connection", "required": true } ], "expect": [ { "name": "select", "type": "select", "label": "Create an Event", "required": true, "validate": { "enum": [ "quick", "detail" ] } }, { "name": "calendar", "type": "select", "label": "Calendar ID", "required": true }, { "name": "colorId", "type": "select", "label": "Color" }, { "name": "summary", "type": "text", "label": "Event Name", "required": true }, { "name": "allDayEvent", "type": "boolean", "label": "All Day Event", "required": true }, { "name": "start", "time": true, "type": "date", "label": "Start Date", "required": true }, { "name": "end", "time": true, "type": "date", "label": "End Date" }, { "name": "duration", "type": "time", "label": "Duration" }, { "name": "description", "type": "text", "label": "Description" }, { "name": "location", "type": "text", "label": "Location" }, { "name": "useDefault", "type": "boolean", "label": "Use the default reminder settings for this event" }, { "name": "overrides", "spec": [ { "name": "method", "type": "select", "label": "Method", "options": [ { "label": "Email", "value": "email" }, { "label": "Pop-up", "value": "popup" } ], "required": true }, { "name": "minutes", "type": "uinteger", "label": "Minutes", "required": true, "validate": { "max": 40320 } } ], "type": "array", "label": "Reminders", "validate": { "maxItems": 5 } }, { "name": "attendees", "spec": [ { "name": "displayName", "type": "text", "label": "Name" }, { "name": "email", "type": "email", "label": "Email", "required": true } ], "type": "array", "label": "Attendees" }, { "name": "transparency", "type": "select", "label": "Show me as", "required": true, "validate": { "enum": [ "opaque", "transparent" ] } }, { "name": "visibility", "type": "select", "label": "Visibility", "required": true, "validate": { "enum": [ "default", "public", "private" ] } }, { "name": "sendUpdates", "type": "select", "label": "Send notifications about the event creation", "validate": { "enum": [ "all", "externalOnly", "none" ] } }, { "name": "guestsCanModify", "type": "boolean", "label": "Guests can modify the event", "required": true }, { "name": "recurrence", "spec": { "name": "value", "type": "text", "label": "Value" }, "type": "array", "label": "Recurrence" }, { "name": "conferenceDate", "type": "boolean", "label": "Add Google Meet Video Conferencing", "required": true }, { "name": "attachments", "spec": [ { "name": "fileUrl", "type": "url", "label": "File URL", "required": true } ], "type": "array", "label": "Attachments" } ], "advanced": true } }, { "id": 36, "module": "google-sheets:updateRow", "version": 2, "parameters": { "__IMTCONN__": 403986 }, "mapper": { "mode": "map", "values": { "0": "{{replace(37.htmlLink; \"https://www.google.com/calendar/event?eid=\"; \"\")}}", "7": "Tạo lịch thành công" }, "sheetId": "{{35.`__SHEET__`}}", "rowNumber": "{{35.`__ROW_NUMBER__`}}", "spreadsheetId": "{{35.`__SPREADSHEET_ID__`}}", "tableFirstRow": "A1:Z1", "valueInputOption": "USER_ENTERED" }, "metadata": { "designer": { "x": 604, "y": -201 }, "restore": { "expect": { "mode": { "label": "Enter manually" }, "tableFirstRow": { "label": "A-Z", "nested": [ { "name": "values", "spec": [ { "name": "0", "type": "text", "label": "A" }, { "name": "1", "type": "text", "label": "B" }, { "name": "2", "type": "text", "label": "C" }, { "name": "3", "type": "text", "label": "D" }, { "name": "4", "type": "text", "label": "E" }, { "name": "5", "type": "text", "label": "F" }, { "name": "6", "type": "text", "label": "G" }, { "name": "7", "type": "text", "label": "H" }, { "name": "8", "type": "text", "label": "I" }, { "name": "9", "type": "text", "label": "J" }, { "name": "10", "type": "text", "label": "K" }, { "name": "11", "type": "text", "label": "L" }, { "name": "12", "type": "text", "label": "M" }, { "name": "13", "type": "text", "label": "N" }, { "name": "14", "type": "text", "label": "O" }, { "name": "15", "type": "text", "label": "P" }, { "name": "16", "type": "text", "label": "Q" }, { "name": "17", "type": "text", "label": "R" }, { "name": "18", "type": "text", "label": "S" }, { "name": "19", "type": "text", "label": "T" }, { "name": "20", "type": "text", "label": "U" }, { "name": "21", "type": "text", "label": "V" }, { "name": "22", "type": "text", "label": "W" }, { "name": "23", "type": "text", "label": "X" }, { "name": "24", "type": "text", "label": "Y" }, { "name": "25", "type": "text", "label": "Z" } ], "type": "collection", "label": "Values" } ] }, "valueInputOption": { "mode": "chose", "label": "User entered" } }, "parameters": { "__IMTCONN__": { "data": { "scoped": "true", "connection": "google" }, "label": "My Google connection (hoangphuctran.za@gmail.com)" } } }, "parameters": [ { "name": "__IMTCONN__", "type": "account:google", "label": "Connection", "required": true } ], "expect": [ { "name": "mode", "type": "select", "label": "Search Method", "required": true, "validate": { "enum": [ "select", "fromAll", "map" ] } }, { "name": "valueInputOption", "type": "select", "label": "Value input option", "validate": { "enum": [ "USER_ENTERED", "RAW" ] } }, { "name": "spreadsheetId", "type": "text", "label": "Spreadsheet", "required": true }, { "name": "sheetId", "type": "text", "label": "Sheet Name", "required": true }, { "name": "rowNumber", "type": "uinteger", "label": "Row number", "required": true }, { "name": "tableFirstRow", "type": "select", "label": "Column range", "required": true, "validate": { "enum": [ "A1:Z1", "A1:BZ1", "A1:CZ1", "A1:DZ1", "A1:MZ1", "A1:ZZ1" ] } }, { "name": "values", "spec": [ { "name": "0", "type": "text", "label": "A" }, { "name": "1", "type": "text", "label": "B" }, { "name": "2", "type": "text", "label": "C" }, { "name": "3", "type": "text", "label": "D" }, { "name": "4", "type": "text", "label": "E" }, { "name": "5", "type": "text", "label": "F" }, { "name": "6", "type": "text", "label": "G" }, { "name": "7", "type": "text", "label": "H" }, { "name": "8", "type": "text", "label": "I" }, { "name": "9", "type": "text", "label": "J" }, { "name": "10", "type": "text", "label": "K" }, { "name": "11", "type": "text", "label": "L" }, { "name": "12", "type": "text", "label": "M" }, { "name": "13", "type": "text", "label": "N" }, { "name": "14", "type": "text", "label": "O" }, { "name": "15", "type": "text", "label": "P" }, { "name": "16", "type": "text", "label": "Q" }, { "name": "17", "type": "text", "label": "R" }, { "name": "18", "type": "text", "label": "S" }, { "name": "19", "type": "text", "label": "T" }, { "name": "20", "type": "text", "label": "U" }, { "name": "21", "type": "text", "label": "V" }, { "name": "22", "type": "text", "label": "W" }, { "name": "23", "type": "text", "label": "X" }, { "name": "24", "type": "text", "label": "Y" }, { "name": "25", "type": "text", "label": "Z" } ], "type": "collection", "label": "Values" } ] } } ], "metadata": { "instant": false, "version": 1, "scenario": { "roundtrips": 1, "maxErrors": 3, "autoCommit": true, "autoCommitTriggerLast": true, "sequential": false, "slots": null, "confidential": false, "dataloss": false, "dlq": false, "freshVariables": false }, "designer": { "orphans": [] }, "zone": "us1.make.com" } }
- Cấu hình các node theo mẫu.
Hiển thị Google calendar trên website
- Cài đặt plugin Pretty Google Calendar
- Lấy API trong Google Cloud theo hướng dẫn sau
https://www.wpbeginner.com/plugins/how-to-add-google-calendar-in-wordpress/
- Hướng dẫn cấu hình shortcode để hiển thị Lịch google lên website của bạn
https://wordpress.org/plugins/pretty-google-calendar/#installation
Mẫu shortcode:
[pretty_google_calendar locale="vi" fc_args='{"eventTextColor":"white"}' custom_list_button="Danh sách" use_tooltip="true" gcal="Calendar ID của bạn"]
Cảm ơn Trung tâm Giáo dục nghề nghiệp Thái Việt, trung tâm chuyên đào tạo lái xe cơ giới bằng B1, B2, C tại Hà Nội đã cho phép Công ty AgentC Asia chia sẻ hình ảnh quy trình “Quản lý lịch thi sát hạch” hiện tại của trung tâm.
CRUD là viết tắt của Create, Read, Update, và Delete - Các hoạt động cơ bản trong quản lý cơ sở dữ liệu và các hệ thống thông tin. ↩︎