🔖
GASで稼働実績シートを作った
作ったもの
GASを使って稼働実績を作りました。
先人の知恵を借りたおかげで1,2時間くらいでさくっと作れました。感謝🙏
なぜ作ろうと思ったか
- 副業の稼働実績の計算を簡単に出来るようにするため
- 稼働したときは基本的にGoogleカレンダーにいつも記録してる
- 毎週木曜日にスプリントが終わる際に、稼働実績と今後の見込みを計算してたが、いちいちカレンダーとニラメッコして頭のCPUを使うのがもったいなかったため
- 月次の稼働実績を提出する際にも役立ちそう
code
work_time_script.js
function myFunction() {
// スプシの参照
const sp = SpreadsheetApp.getActiveSpreadsheet();
const target = '2021/09'; // シート名は一旦固定
const sh1 = sp.getSheetByName(target);
sh1.getRange('a1').setValue("Sprint Start");
sh1.getRange('b1').setValue("Sprint End");
sh1.getRange('c1').setValue("Work time(min)");
sh1.getRange('d1').setValue("Work time(hour)");
// カレンダーとイベントを参照して稼働実績を記録
const cal = CalendarApp.getCalendarById('YourCalendarId'); // 適当なカレンダーID
const fridayList = getFridays();
for (let i = 0; i < fridayList.length; i++) {
let startTime = new Date(fridayList[i]);
let endTime = new Date(startTime.getFullYear(), startTime.getMonth(), startTime.getDate() + 7);
let events = cal.getEvents(startTime, endTime);
let totalMinutes = 0;
let totalHours = 0;
for (let j = 0; j < events.length; j++) {
if (events[j].getTitle() != "Work") continue; // 雑にtitleで絞り込み
let eventStartTime = events[j].getStartTime();
let eventEndTime = events[j].getEndTime();
totalMinutes += (eventEndTime - eventStartTime) / (1000 * 60)
totalHours += (eventEndTime - eventStartTime) / (1000 * 60 * 60)
}
sh1.getRange('a' + (i + 2)).setValue(startTime);
sh1.getRange('b' + (i + 2)).setValue(endTime);
sh1.getRange('c' + (i + 2)).setValue(totalMinutes);
sh1.getRange('d' + (i + 2)).setValue(totalHours);
}
}
function getFridays() {
const date = new Date();
const day = 5; // 金曜
const year = date.getFullYear();
const month = date.getMonth();
const days = [];
for (let i = 1; i <= 31; i++){
const tmpDate = new Date(year, month, i);
if (month !== tmpDate.getMonth()) break; //月代わりで処理終了
if (tmpDate.getDay() !== day) continue; //引数に指定した曜日以外の時は何もしない
days.push(tmpDate);
}
return days;
}
参考にさせていただいた記事
雑感
ダーッと作ったので荒々だけど最低限は満たせてるので良き。
久々にGAS触って楽しかった。色々自動化していきたい。
Discussion