Last active
December 22, 2015 06:59
-
-
Save KxNxT/6435069 to your computer and use it in GitHub Desktop.
Calendar merge using Google Apps Script.
version 2.
カレンダーイベントが多すぎて処理時間がオーバーするエラーが起こるので、
とりま直近の2週間から同期して、そのあとに曜日ごとに未来のカレンダーイベントを同期するようにした。
曜日ごとに未来の同期範囲を代えた。
スプレッドシートにその日どの範囲を同期したのかを残すようにもした。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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