【GAS】カレンダーを自動で作成する!新年あけましておめでとうございます
新年あけましておめでとうございます!
今年もどうぞよろしくお願いいたします。
今年もnoteどんどん公開していきたいなーと思っておりますが、正月ボケが中々抜けず・・・育児休業関係や中小企業のDX推進の奮闘記の熱量くらいのものが書くに至れず・・・まずは簡単なTipsでスタートしようと思います!
私の中ではかなり読んでくださっている記事で本当に嬉しいです。ありがとうございます。ちなみにですが・・・
プロ画書きました。CLIP STUDIO PAINT(クリスタ)というツールでかなり残念なところも多いですが楽しいは楽しいので今後も描き続けていこうかと!※趣味見出すために妻に誕生日に買っていただきました!
脱線しましたが本題に移ります!
年間のカレンダーを自動で作る
Google Apps Scriptを使えば、スプレッドシートにカレンダーを自動で、祝日を含めて作ることができます。
シート名は「Calendar」で設定していますが、コード変えれば好きに設定していただいて構いません。
またスプレッドシートはヘッダー(一行目)も含めて自動で反映するようにしておくので、カレンダーを出すだけであれば何も入力はいりません。
コード
ちょっとnoteのコードの見栄えがあまり好きじゃなくなってきたので、carbonというサービス使ってコードを映しますね。
なお私のコードはgithubで使えるものはPublicで公開しております。
ご興味のある方は覗いてみてください。
まるまるコピペも全然かまわないんので原文はそちらから拾っていただけるとありがたいです。
さて、実際のコードを映してみましょう。
※変数の命名とかが汚いことはご愛敬で・・・
コピペする場合はgithubをご参照ください。
ざっくりと挙動を説明!
Google大先生にはGoogleカレンダーの中でデフォルトで「日本の祝日」というカレンダーが存在します!
神サービス!!
カレンダーIDは「ja.japanese#holiday@group.v.calendar.google.com」
こちらをGoogle Apps Scriptで参照させていただけば祝日込みのカレンダーができるというわけです!
やっていることとしては下記のような流れになります。
スプレッドシートにアクセスして
ヘッダーを設定して
「日本の祝日」のカレンダーを参照しながら現在の年の分でカレンダーを二次元配列で作成
二次元配列をスプレッドシートに貼り付け!
深堀!
ここからnoteの機能のコードビューを使って部分的に説明しますね!(ちょっと不本意・・・w)
1.下準備
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Calendar');
var lastRow = sheet.getLastRow();
if(lastRow != 0){
var range = sheet.getRange(2,1,lastRow - 1,9);
range.clearContent();
};
シート名はgetSheetByName('Calendar')の中の'Calendar'を調整すれば自由に設定できます。
シートの最終行を取得して既に何か入力されていたら二行目以下を全て消す設定をしています。
2.二次元配列の設定
var dat = [];
var values = new Array("日付","年","月","日","四半期","曜日名","曜日","区分","祝日","国民の祝日・休日名称");
dat.push(values);
var date = new Date();
var start_date = new Date(date.getFullYear(),0,1);
var end_date = new Date(date.getFullYear(),11,31);
var year = start_date.getFullYear();
const calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
二次元配列を格納するハコを設定し、ヘッダーを規定しています。
("日付","年","月","日","四半期","曜日名","曜日","区分","祝日","国民の祝日・休日名称")の部分ですね。
GASの特徴ですが
2022年1月1日は new Date(2022,0,1)
2022年12月31日は new Date(2022,11,1)
と月だけ何故か0始まりなんですね・・・
一回私これで大失敗したことありますw
3.二次元配列にカレンダーを埋めていく
for(var i = 1 ;start_date.getFullYear() == year ;i++){
values = new Array("日付","年","月","日","四半期","曜日名","曜日","区分","祝日","国民の祝日・休日名称");
values[0] = start_date.getFullYear() + '/' + (start_date.getMonth()+1) + '/' + start_date.getDate();
values[1] = start_date.getFullYear();
values[2] = start_date.getMonth()+1;
values[3] = start_date.getDate();
values[4] = quarter_year(start_date.getMonth());
values[5] = arr_getDay(start_date.getDay()) + '曜日';
values[6] = arr_getDay(start_date.getDay());
const events = calendar.getEventsForDay(start_date);
if(events.length != 0){
values[8] = '祝日';
values[9] = events[0].getTitle();
} else {
values[8] = null;
values[9] = null;
};
if (values[6] == '土' || values[6] == '日' || values[8] == '祝日'){
values[7] = '休日';
} else {
values[7] = null;
};
dat.push(values);
start_date.setDate(start_date.getDate() + 1);
};
ループの部分ですね。
変数で設定した現在の年と一致する日付の分だけ作業を繰り返します。
ここのポイントですがGASでは曜日の表記「日、月、火、水、木、金、土」というものはVBAの関数のように簡単にできません。
ですので自作関数で対処します。
function arr_getDay(day){
var arr_day = new Array('日', '月', '火', '水', '木', '金', '土');
return arr_day[day];
}
日付からgetDayメソッドで週の中の何番目の日か0~6の数字で取得することができます。JavaScriptのメソッドのよう・・・。詳細は私も詳しくありません。
四半期を入れたのは最近Power BIにハマっているのでBIの日付テーブルでも使えたらなーという印象で下記のような関数で四半期を定義しました。
function quarter_year(month){
if(month >= 0 && month <= 2){
return 1;
} else if(month >= 3 && month <= 5){
return 2;
} else if(month >= 6 && month <= 8){
return 3;
} else if(month >= 9 && month <= 11){
return 4;
}
return arr_day[day];
}
BI面白いですよ。興味ある方はこの本がお勧めです!
最後に
sheet.getRange(1,1,dat.length,dat[0].length).setValues(dat);
}
この部分で二次元配列をシートにインプットしている動きです。
↑は見栄えよくするために交互の背景色を適用しています
トリガーを設定すれば毎年完全自動に!!
GASのトリガーを設定しておけば時間主導型の動きで毎年完全自動で更新できます。
トリガー云々は下記のnoteで以前深堀したので興味ある方はそちらをご参照ください。
毎年社内カレンダー作るので忙しいとか所定労働日数求めなきゃーとか
ワイガヤしている方に朗報!
そんな仕事は必要ございません!
ちなみに
ピボットテーブルを使えば集計もすぐできますね。
今年はお休み120日!嬉しいですね!
ExcelのPower Queryでも完全自動行けます!
実はExcelのPower Queryでも完全自動イケるのです。
それはまた別の機会に解説しましょう!
最後に
2022年駆け抜けます!どうぞよろしくお願いします!
今年の目標は
DX推進の仕事にチャレンジする
社外の人と交流した越境学習をスタートする
先日DXスナックに参加させていただき、世の中に仲間が良そうだ!という希望とやる気で満ち溢れています。
すごく面白かった。ちょっとしゃべりました。
主催はコチラの方々!(フォローお勧めです!)
出来ればのお願い!
子育てもあるのでフットワークが重いですが、
積極的にそういう機会に顔を出していきたいと思っております。ご紹介いただけると大変うれしいです!
Twitterでも仲良くしてください!!!
業務改善の取り組み、勉強会にとても興味があります!!!!
今年もよろしくお願いします!!!!!