まだ中学生のブログ

スマホ関連、Google関連のことを書いてます。IT系勤務、既婚、精神年齢:中学生。

Googleカレンダーにシフトを簡単に時間帯付きで登録する

Googleカレンダーにシフトを簡単に時間帯付きで登録する

背景

Googleカレンダーに簡単にシフト登録する方法に反響がありました。

madachugakusei.hatenablog.com

上記エントリーでは終日予定で早番か遅番かを入力可能にしていますが、 早番は8:00~17:00、遅番は9:00~18:00のように時間帯指定で登録したいとコメントいただきましたので実現方法を書いてみました。

実現方法

上記エントリーの「カレンダーに登録するプログラムを書く」という章に次のようなコードがありますが、これを書き換えるだけで実現できます。

※これは終日予定を登録するコードです。

function executeInPosting() {
  //==========================================================
  // 設定箇所
  //==========================================================
  var CALENDAR_ID = 'mada.chugakusei@gmail.com';
  var SHIFT1 = '早番';
  var SHIFT2 = '遅番';
  
  var YEAR_COLUMN = 'B';
  var MONTH_COLUMN = 'C';
  var SHIFT1_COLUMN = 'D';
  var SHIFT2_COLUMN = 'E';
  //----------------------------------------------------------
  
  var sheet = SpreadsheetApp.getActiveSheet();
  bottom = sheet.getLastRow();
  
  var year = sheet.getRange(YEAR_COLUMN + bottom).getValue();
  var month = sheet.getRange(MONTH_COLUMN + bottom).getValue();
  var shift1 = sheet.getRange(SHIFT1_COLUMN + bottom).getValue();
  var shift2 = sheet.getRange(SHIFT2_COLUMN + bottom).getValue();
  
  var shift1List = String(shift1).split(',');
  var shift2List = String(shift2).split(',');
  
  // シフト1を登録
  for (var i = 0; i < shift1List.length; i++) {
    var dateStr = year + '/' + month + '/' + shift1List[i];
    Logger.log(dateStr);
    var date = new Date(dateStr);
    Logger.log(date);
    createEvent(CALENDAR_ID, SHIFT1, date);
    Logger.log('createEvent() is done.');
  }
  
  // シフト2を登録
  for (var i = 0; i < shift2List.length; i++) {
    var dateStr = year + '/' + month + '/' + shift2List[i];
    Logger.log(dateStr);
    var date = new Date(dateStr);
    Logger.log(date);
    createEvent(CALENDAR_ID, SHIFT2, date);
    Logger.log('createEvent() is done.');
  }
}

// カレンダーに終日のイベントを作成
function createEvent(calendarId, title, date) {
  var calendar = CalendarApp.getCalendarById(calendarId);
  calendar.createAllDayEvent(title, date);
}

これを次のように書き換えます。

function executeInPosting() {
  //==========================================================
  // 設定箇所
  //==========================================================
  var CALENDAR_ID = 'mada.chugakusei@gmail.com';
  var SHIFT1_NAME = '早番';
  var SHIFT1_START_TIME = '8:00';
  var SHIFT1_END_TIME = '17:00'
  var SHIFT2_NAME = '遅番';
  var SHIFT2_START_TIME = '9:00';
  var SHIFT2_END_TIME = '18:00';
  
  var YEAR_COLUMN = 'B';
  var MONTH_COLUMN = 'C';
  var SHIFT1_COLUMN = 'D';
  var SHIFT2_COLUMN = 'E';
  //----------------------------------------------------------
  
  var sheet = SpreadsheetApp.getActiveSheet();
  bottom = sheet.getLastRow();
  
  var year = sheet.getRange(YEAR_COLUMN + bottom).getValue();
  var month = sheet.getRange(MONTH_COLUMN + bottom).getValue();
  var shift1 = sheet.getRange(SHIFT1_COLUMN + bottom).getValue();
  var shift2 = sheet.getRange(SHIFT2_COLUMN + bottom).getValue();
  
  var shift1List = String(shift1).split(',');
  var shift2List = String(shift2).split(',');
  
  // シフト1を登録
  for (var i = 0; i < shift1List.length; i++) {
    var dateStr = year + '/' + month + '/' + shift1List[i];
    Logger.log(dateStr);
    var date = new Date(dateStr);
    Logger.log(date);
    createEvent(CALENDAR_ID, SHIFT1_NAME, date, SHIFT1_START_TIME, SHIFT1_END_TIME);
    Logger.log('createEvent() is done.');
  }
  
  // シフト2を登録
  for (var i = 0; i < shift2List.length; i++) {
    var dateStr = year + '/' + month + '/' + shift2List[i];
    Logger.log(dateStr);
    var date = new Date(dateStr);
    Logger.log(date);
    createEvent(CALENDAR_ID, SHIFT2_NAME, date, SHIFT2_START_TIME, SHIFT2_END_TIME);
    Logger.log('createEvent() is done.');
  }
}

// カレンダーに終日のイベントを作成
function createEvent(calendarId, title, date, startTime, endTime) {
  var calendar = CalendarApp.getCalendarById(calendarId);
  //calendar.createAllDayEvent(title, date);
  var startDateTime = new Date(date.getFullYear(), date.getMonth(), date.getDate(), Number(startTime.split(':')[0]), Number(startTime.split(':')[1]));
  var endDateTime   = new Date(date.getFullYear(), date.getMonth(), date.getDate(), Number(endTime.split(':')[0]),   Number(endTime.split(':')[1]  ));
  Logger.log('startDateTime');
  Logger.log(startDateTime);
  Logger.log('endDateTime');
  Logger.log(endDateTime);
  calendar.createEvent(title, startDateTime, endDateTime);
}

注目は、

  • SHIFT1_START_TIME

  • SHIFT1_END_TIME

  • SHIFT2_START_TIME

  • SHIFT2_END_TIME

です。 次のように入力します。

変数名 意味
SHIFT1_START_TIME シフト1の開始時刻(早番)
SHIFT1_END_TIME シフト1の開始時刻(早番)
SHIFT2_START_TIME シフト2の開始時刻(遅番)
SHIFT2_END_TIME シフト2の開始時刻(遅番)

結果

これでフォームを投稿してみると…

f:id:madachugakusei:20151107223714p:plain

このように時間帯指定でシフトが登録できるようになります。

日をまたぐ予定を登録したい場合、

変数名 意味
SHIFT1_START_TIME 20:00
SHIFT1_END_TIME 30:00
SHIFT2_START_TIME 17:00
SHIFT2_END_TIME 22:00

のように、深夜0時以降には24を足す形で表現することで実現できます。 (30時は翌朝の6時になります。)


以上です。