Skip to content

Instantly share code, notes, and snippets.

@pocke
Created February 10, 2019 14:21
Show Gist options
  • Save pocke/8d907fa42e58104d72f4dcf264825045 to your computer and use it in GitHub Desktop.
Save pocke/8d907fa42e58104d72f4dcf264825045 to your computer and use it in GitHub Desktop.
// Sync personal calendar to work calendar
function syncCalendar() {
var FROM_EMAIL = '[email protected]';
var TO_EMAIL = '[email protected]';
var HUB_CALENDAR_ID = '[email protected]'
var from_events = getEvents(FROM_EMAIL);
var hub_events = getEvents(HUB_CALENDAR_ID);
var hub_cal = CalendarApp.getCalendarById(HUB_CALENDAR_ID);
from_events.forEach(function(ev) {
var id = ev.getId();
var idMD5 = md5(id);
var evHub = find(hub_events, function(evHub) { return idMD5 === evHub.getDescription().trim()});
if (!evHub) {
Logger.log("Creating an event for " + id);
var newEv;
if (ev.isAllDayEvent()) {
newEv = hub_cal.createAllDayEvent("予定あり", ev.getStartTime(), ev.getEndTime(), {description: idMD5});
} else {
newEv = hub_cal.createEvent("予定あり", ev.getStartTime(), ev.getEndTime(), {description: idMD5});
}
newEv.addGuest(TO_EMAIL);
} else {
var hubStartTime = evHub.getStartTime();
var hubEndTime = evHub.getEndTime();
var origStartTime = ev.getStartTime();
var origEndTime = ev.getEndTime();
if (hubStartTime.getTime() !== origStartTime.getTime() || hubEndTime.getTime() !== origEndTime.getTime()) {
Logger.log("Updating event " + id + " / " + idMD5);
if (ev.isAllDayEvent()) {
evHub.setAllDayDate(ev.getStartTime(), ev.getEndTime());
} else {
evHub.setTime(ev.getStartTime(), ev.getEndTime());
}
} else {
Logger.log("No Update for event " + id + " / " + idMD5);
}
}
})
}
function getEvents(id) {
var MONTH = 31 * 24 * 60 * 60 * 1000;
var now = new Date();
var from = new Date(now.getTime() - 2 * MONTH);
var to = new Date(now.getTime() + 2 * MONTH)
Logger.log('from: ' + from);
Logger.log('to: ' + to);
var cal = CalendarApp.getCalendarById(id);
return cal.getEvents(from, to);
}
function md5(str) {
var v = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, str);
return v.toString();
}
function find(arr, f) {
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (f(item)) {
return item;
}
}
return null;
}
@pocke
Copy link
Author

pocke commented Feb 10, 2019

Google Calendarの予定を同期するGAS。

要件

  • Google Calendarを、個人用アカウント、仕事用アカウントで分けて使っている
  • 個人の予定は個人用アカウントのカレンダーに入れたい
  • ただし、個人の予定でも同僚からはその時間に予定があることだけは見れるようにしたい
    • 同僚というのは、仕事用アカウントで同じG Suiteに入っているアカウントのことを指す。
  • 同僚には予定の内容は見られたくない
  • 追加の操作は必要なく、この要件を達成したい

使い方

  1. hubカレンダーを作成
  2. hubカレンダーのIDを取得
  3. FROM_EMAIL, TO_EMAIL, HUB_CALENDAR_IDの3つの変数を埋める
  4. GASに登録して、適当な間隔で動かす。

やっていること

  1. FROM_EMAILのカレンダーから、現時刻から前後二ヶ月の予定を全て取得する。
  2. hubカレンダーに、タイトルを「予定あり」に変換した上で取得した予定をコピーする。
  3. hubカレンダーに追加した予定に、TO_EMAILのGoogleアカウントをinviteする

なぜこんな回りくどいことをやっているのか

  • 生の予定に直接inviteする → inviteされた予定の閲覧権限を個々に絞らないと同僚から予定の詳細が見える

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment