【GAS】スプレッドシートに書いたイベントをカレンダーに登録させる


経緯

個人ごとの勤怠時間をGoogleカレンダーに登録しているが、かなりめんどくさい。
繰り返しができればいいが、シフト制なので曜日や時間に規則性がないため
ポチポチ入力するのがかなりキツイです、、、

やること

・Googleスプレッドシートに勤怠時間を入力させる
・GoogleAppsScript(gas)で、指定された日をカレンダーに入力

準備

スプレッドシート

こんなかんじのもの

カレンダーIDの確認

PC版Googleカレンダーから
歯車アイコン→「設定」→「マイカレンダーの設定」から対象のカレンダーをクリック

こんな感じのものです

コード

//シート名
var sheetNameArray = ['ぼく','わたし','あなた'];
var DATE=new Date();
//今月
var NOW=new Date(DATE.getFullYear(), DATE.getMonth() + 1 ,0);
//来月
var NEXT=new Date(NOW.getFullYear(), NOW.getMonth() + 2 ,0);
//カレンダー
var CALENDAR = CalendarApp.getCalendarById('[email protected]');  
//「今月」の行
var NOWCOLUMN = 2;
//「来月」の行
var NEXTCOLUMN = 5;
//「日付」列の先頭
var DAYROWFIRST = 3;
var sheet = '';

//指定月のイベントをまとめて削除
function deleteEvents(dateColumn){
  var date = sheet.getRange(2, dateColumn).getValue() + '/01 00:00:00';
  var startDate = new Date(date);
  var endDate = new Date(date);
  endDate.setMonth(endDate.getMonth() + 1);
  var events = CALENDAR.getEvents(startDate, endDate, {search: sheet.getName()});

  /* イベントの数だけ繰り返し */
  for (var i = 0; i < events.length; i++){
    events[i].deleteEvent();
    Logger.log("[deleteEvent]" + events[i].getStartTime() + events[i].getTitle());
  }
}

//指定月のイベントをまとめて作成
function createEvents(dateColumn){
  var row = DAYROWFIRST;
  var dateSeed = sheet.getRange(2, dateColumn).getValue();

  /* 日付の数だけ繰り返し */
  while( sheet.getRange(row, dateColumn).getValue() ){
    if( !sheet.getRange(row, dateColumn + 1).getValue() ){
//      Logger.log('none');
      row++;
      continue;
    }
    var date = dateSeed + '/' + sheet.getRange(row, dateColumn).getValue();
    var startDate = new Date( date + ' ' + sheet.getRange(row, dateColumn + 1).getValue());
    var endDate = new Date( date + ' ' + sheet.getRange(row, dateColumn + 2).getValue());

    CALENDAR.createEvent(sheet.getName(), new Date(startDate), new Date(endDate));
    Logger.log("[createEvent]" + sheet.getName() + "," + new Date(startDate) + "," + new Date(endDate) + ")");
    row++;
  }
}

//イベントメイン処理
function setCalendar(){
  for (var i = 0; i < sheetNameArray.length; i++){
    sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetNameArray[i]);

    deleteEvents(NOWCOLUMN);
    deleteEvents(NEXTCOLUMN);
    createEvents(NOWCOLUMN);
    createEvents(NEXTCOLUMN);
  }
}

結果

こうなります