Skip to content

Instantly share code, notes, and snippets.

@KxNxT
Last active December 22, 2015 06:59
Show Gist options
  • Save KxNxT/6435069 to your computer and use it in GitHub Desktop.
Save KxNxT/6435069 to your computer and use it in GitHub Desktop.
Calendar merge using Google Apps Script. version 2. カレンダーイベントが多すぎて処理時間がオーバーするエラーが起こるので、 とりま直近の2週間から同期して、そのあとに曜日ごとに未来のカレンダーイベントを同期するようにした。 曜日ごとに未来の同期範囲を代えた。 スプレッドシートにその日どの範囲を同期したのかを残すようにもした。
//OutputCal
var outCalId = CAL_ID0;
//InputCal
var inCalIds = [
CAL_ID1,
CAL_ID2
];
function main(){
var weeks = 7*24*60*60*1000;
var outCal = CalendarApp.getCalendarById(outCalId);
//直近2週間
//日付決定
var dateFrom = new Date();
var dateTo = new Date();
dateTo.setTime(dateFrom.getTime() + 2*weeks);
log(dateFrom, dateTo);
delCal(outCal, dateFrom, dateTo);
//OUTPUTカレンダーにINPUカレンダーの未来情報を追加する
for(var i = 0; i < inCalIds.length; i++){
mergeCal(outCal, inCalIds[i], dateFrom, dateTo);
}
//曜日によって違う同期範囲
//日付決定
var youbi = dateFrom.getDay();
if(youbi == 0){//mon 2-3
dateTo.setTime(dateFrom.getTime() + 3*weeks);
dateFrom.setTime(dateFrom.getTime() + 2*weeks);
}
if(youbi == 1){//tue 3-4
dateTo.setTime(dateFrom.getTime() + 4*weeks);
dateFrom.setTime(dateFrom.getTime() + 3*weeks);
}
if(youbi == 2){//wed 4-5
dateTo.setTime(dateFrom.getTime() + 5*weeks);
dateFrom.setTime(dateFrom.getTime() + 4*weeks);
}
if(youbi == 3){//thr 5-6
dateTo.setTime(dateFrom.getTime() + 6*weeks);
dateFrom.setTime(dateFrom.getTime() + 5*weeks);
}
if(youbi == 4){//fri 6-8
dateTo.setTime(dateFrom.getTime() + 8*weeks);
dateFrom.setTime(dateFrom.getTime() + 6*weeks);
}
if(youbi == 5){//sat 8-10
dateTo.setTime(dateFrom.getTime() + 10*weeks);
dateFrom.setTime(dateFrom.getTime() + 8*weeks);
}
if(youbi == 6){//sun 10-12
dateTo.setTime(dateFrom.getTime() + 12*weeks);
dateFrom.setTime(dateFrom.getTime() + 10*weeks);
}
log(dateFrom, dateTo);
delCal(outCal, dateFrom, dateTo);
for(var i = 0; i < inCalIds.length; i++){
mergeCal(outCal, inCalIds[i], dateFrom, dateTo);
}
}
function delCal(cal, startDate, endDate){
var ev = cal.getEvents(startDate,endDate);
for(var i = 0; i < ev.length;i++){
ev[i].deleteEvent();
}
}
//出力先カレンダーに入力元カレンダーからイベントを追加する
function mergeCal(outCal, inCalId, startDate, endDate) {
var inCal = CalendarApp.getCalendarById(inCalId);
var iFutureEv = inCal.getEvents(startDate,endDate);
for(var i = 0; i < iFutureEv.length;i++){
//終日イベントの場合は終日で作成
if(iFutureEv[i].isAllDayEvent()){
outCal.createAllDayEvent(iFutureEv[i].getTitle() + "<" + inCal.getName() + ">",//元のカレンダー名をタイトルに含める
iFutureEv[i].getStartTime(),
{description:iFutureEv[i].getDescription(),
location:iFutureEv[i].getLocation()});
}else{
outCal.createEvent(iFutureEv[i].getTitle() + "<" + inCal.getName() + ">",//元のカレンダー名をタイトルに含める
iFutureEv[i].getStartTime(),
iFutureEv[i].getEndTime(),
{description:iFutureEv[i].getDescription(),
location:iFutureEv[i].getLocation()});
}
}
}
function log(startDate, endDate) {
var today = new Date();
var sheet = SpreadsheetApp.getActiveSheet();
var str = sheet.getRange(today.getDate()+1, today.getMonth()+2).getValue();
sheet.getRange(today.getDate()+1, today.getMonth()+2).setValue(str + " " + getDate(startDate) + "-" + getDate(endDate) );
}
function getDate(dt){
return String((dt.getMonth()+1) + "/" + (dt.getDate()));
}
//memo alertの代わり
//Browser.msgBox("");
//API
//http://googlestyle.client.jp/calendar_services/calendar.html
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment