Googleスプレッドシートでの勤怠管理の解説

勤怠管理スプレッドシートの特徴

一般的な勤怠管理スプレッドシートでは、日付が縦に並んでいるものが多いですが、縦に長くなると管理が難しくなります。また、横に並べるとスクロールが面倒になったり、関数計算に問題が生じることがあります。
そこで、日付を横に並べた勤怠表を作成し、簡単に複製・更新できるようにしました。本記事では、その作成方法を詳しく解説します。

日付と曜日の表示と土日色付けの解説

1. 日付と曜日の表示(B4セルから横にオートフィル)

=SUBSTITUTE(SUBSTITUTE(TEXT(LEFT($A3,1)&"/"&COLUMN(A3),"m/d(aaa)"),LEFT($A3,1)&"/",""),"(",CHAR(10)&"(")

関数の解説

  • TEXT(LEFT($A3,1)&"/"&COLUMN(A3),"m/d(aaa)"):日付を「月/日(曜日)」の形式で取得。
  • SUBSTITUTE(..., "(", CHAR(10)&"("):曜日を改行して表示。

2. 土日色付け(4行目の条件付き書式)

=OR(WEEKDAY(VALUE(TEXT(LEFT($A$1,4)&"/"&LEFT($A3,1)&"/"&COLUMN(A3),"yyyy/m/d")))=1,WEEKDAY(VALUE(TEXT(LEFT($A$1,4)&"/"&LEFT($A3,1)&"/"&COLUMN(A3),"yyyy/m/d")))=7)

関数の解説

  • WEEKDAY(...):曜日を取得し、1(日曜)または7(土曜)なら色付け。

祝日取得と祝日判定、色付けの解説

1. 祝日取得のApps Script

const SHEET_NAME = "祝日一覧";
const CALENDAR_ID = "ja.japanese#[email protected]";

/**
 * 祝日一覧をGoogleカレンダーの「日本の祝日」から取得し、スプレッドシートを更新
 */
function holiday_main() {
  const sheet = getHolidaySheet();
  
  // 今年の1月1日〜翌年の12月31日を取得
  const startDate = new Date();
  startDate.setMonth(0, 1); // 1月1日
  startDate.setHours(0, 0, 0, 0);

  const endDate = new Date();
  endDate.setFullYear(endDate.getFullYear() + 1, 11, 31); // 翌年12月31日
  endDate.setHours(23, 59, 59, 999);

  const holidays = getHoliday(startDate, endDate);

  // シートをクリアしてから祝日データを更新
  sheet.clear();
  sheet.getRange(1, 1, holidays.length, holidays[0].length).setValues(holidays);
  sheet.getRange(1, 1, holidays.length, 1).setNumberFormat("yyyy/m/d");
}

/**
 * スプレッドシート内の "祝日一覧" シートを取得または作成する
 */
function getHolidaySheet() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName(SHEET_NAME);
  
  if (!sheet) {
    sheet = ss.insertSheet(SHEET_NAME);
  }
  
  return sheet;
}

/**
 * 指定した期間の祝日をGoogleカレンダーの「日本の祝日」から取得
 */
function getHoliday(startDate, endDate) {
  const cal = CalendarApp.getCalendarById(CALENDAR_ID);
  const holidays = cal.getEvents(startDate, endDate);
  const values = [];
  
  for (let i = 0; i < holidays.length; i++) {
    const holidayDate = holidays[i].getStartTime();
    const holidayTitle = holidays[i].getTitle();
    
    // 祝日ではないイベントを除外
    if (!["雛祭り", "節分", "母の日", "七五三", "七夕", "クリスマス"].includes(holidayTitle)) {
      values.push([holidayDate, holidayTitle]);
    }
  }
  
  return values;
}

/**
 * スプレッドシートのメニューに「祝日を更新」ボタンを追加
 */
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu("祝日管理")
    .addItem("祝日を更新", "holiday_main")
    .addToUi();
}

コード解説

  • holiday_main():祝日データを取得し、スプレッドシートの"祝日一覧"シートを更新。
  • getHolidaySheet():シートがない場合は作成し、取得。
  • getHoliday(startDate, endDate):Googleカレンダーの「日本の祝日」から指定期間の祝日を取得。
  • onOpen():スプレッドシートのメニューに「祝日を更新」ボタンを追加。

2. 祝日判定(B5セルから横にオートフィル)

=IFERROR(IF(ISNUMBER(MATCH(VALUE(TEXT(LEFT($A$1,4)&"/"&LEFT($A3,1)&"/"&COLUMN(A3),"yyyy/m/d")), '祝日一覧'!$A$1:$A, 0)),"〇",""), "ERROR")

3. 祝日色付け(4行目の条件付き書式)

=EXACT("〇",INDIRECT(ADDRESS(ROW()+1,COLUMN())))

工数計算の解説

1. 工数計算(B10セルから横にオートフィル)

=IF(0>=B7-B6-B8,"",IF(MOD(VALUE(TEXT(HOUR(B7-B6-B8)+MINUTE(B7-B6-B8)/60,"0.00"))*60,3)=0,VALUE(TEXT(HOUR(B7-B6-B8)+MINUTE(B7-B6-B8)/60,"0.00")),FALSE))

まとめ

このスプレッドシートを活用すれば、日付・曜日・祝日が自動反映され、勤怠管理が効率的になります。また、Apps Scriptを活用することで、手動更新の手間を省くことができます。


スプレッドシートのダウンロード