見出し画像

【GAS】保育園に提出するシフト表の自動作成プログラムを作ってみた。

うちの子の行く保育園では、個人事業主/フリーランスであっても、シフト表の提出が必要なのです。

GAS(Google Apps Script)の勉強も兼ねて、自動作成するプログラムを作ってみました。

1.わたしのGASスキル

Excel VBA作成は出来ます。GASは、文法と実行の仕方とHello World よりちょっとわかるくらいの初心者。
Excel VBAの知識をもとに GASを使いこなすための勉強中。
※ なかなか時間が取れませんが…💦

2.作りたいGASプログラムの条件

年月を指定したら、決まったフォーマットで日付/曜日/勤務時間 を自動出力。出来れば祝日も反映させたい
勤務時間は、土日祝日以外の平日に 9:00-17:00と出力したい。

3.プログラムの実装

日付をループ処理する方法を、ネットで検索。
さらに、祝日判定処理も検索。結構あっさり出てきて、方法も簡単だったので、GASって便利だなぁ~と思いました。

以下が出来上がったプログラム。

function myFunction() {
 //
 const wktime = "9:00-17:00";
 const youbi = ["日","月","火","水","木","金","土"]
 const syuku = "祝";
 const st = SpreadsheetApp.getActiveSheet();
 // 行数のインクリメント用
 let i;
 // タイトルから月初日を変数に入れる
 let dt = new Date(st.getRange(1,1).getValue());
 // 祝日判定用
 const id = 'ja.japanese#holiday@group.v.calendar.google.com'
 const cal = CalendarApp.getCalendarById(id);
 //const events = cal.getEventsForDay(date); ※ 使い方 if(events.length) return true

 //タイトル以外のコンテンツをクリア
 st.getRange("A2:G17").clearContent();

 // 1- 15日
 for(i = 2; i < 17; i++) {
   // 日付、曜日(祝日判定)、平日なら勤務時間を入力
   st.getRange(i,1).setValue(Utilities.formatDate(dt,"JST", "yyyy/MM/dd"));
   if(cal.getEventsForDay(dt).length){
       st.getRange(i,2).setValue(syuku);  // 祝日
   } else {
       st.getRange(i,2).setValue(youbi[dt.getDay()]);
       if(dt.getDay()!=0 && dt.getDay()!=6){
         st.getRange(i,3).setValue(wktime); // 9:00-17:00
       }
   }
   dt.setDate(dt.getDate() +1); // 1日進める
  }
  // 16 - 月末日
  for(i = 2; i <= 17; i++) {
   //console.log(st.getRange(i, 5).getValue());
   st.getRange(i,5).setValue(Utilities.formatDate(dt,"JST", "yyyy/MM/dd"));
   if(cal.getEventsForDay(dt).length){
       st.getRange(i,6).setValue(syuku);  // 祝日
   } else {
       st.getRange(i,6).setValue(youbi[dt.getDay()]);
       if(dt.getDay()!=0 && dt.getDay()!=6){
         st.getRange(i,7).setValue(wktime); // 9:00-17:00
       }
   }
   dt.setDate(dt.getDate() +1); // 1日進める
   if(dt.getDate() == 1) break; // 翌月1日になったら処理終了
  }
}

ループ処理とか、もう少しまとめてキレイに出来ると思いますが、まだまだ初心者なのでこれくらいで。
わかりやすさ&デバッグのしやすさ最優先で♬

祝日判定処理、準備が以下の2行。
const id = 'ja.japanese#holiday@group.v.calendar.google.com'
const cal = CalendarApp.getCalendarById(id);

使い方が以下。
if(cal.getEventsForDay(dt).length){
  st.getRange(i,6).setValue(syuku); // 祝日
} else...

これはすごいな~と思いました。
GoogleカレンダーというサービスをしているGoogleならではの便利さですよね、きっと。

4.プログラムの動作

gifアニメーションで見るとこんな感じ。
入力は年月だけ。実行は拡張機能→マクロ→myFunctionで実行するか、Alt+Shift+Ctrl+7を押して実行します。

画像1

5.作った感想

1時間くらいで動作確認まで全部出来たので、満足感が高いです。
やっぱり、あんまり悩んで悩んで…だと、面倒になっちゃいます。プログラムって。

GASの難点は、初めてプログラム実行するときに「実行許可」の手順をしないといけないこと。
でも、一度それをしてしまえば、ExcelVBAの実行となんら変わらない。
さらに、Excelと違って、ソフト代は無料
※ ネット代だけ必要ですね。厳密にいえば。

プログラムってどんなものかやってみたい学生さんとか、社会人さんにはおすすめしたいプログラム実行環境&言語です!



#メリカナデシコ


この記事が参加している募集

#つくってみた

19,238件

お読みいただき、ありがとうございました☆ スキorコメントでどの記事が役立ったかリアクションして頂ければ、それ関連の記事をたくさん書くよう頑張ります♬ https://chitose-it.com https://asagao-startup.com