🔖

GASで稼働実績シートを作った

2021/09/13に公開

作ったもの

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;
}

参考にさせていただいた記事

https://qiita.com/nanako_t/items/1486ee2fb307fe7dba80
https://crieit.net/posts/GAS-Javascript-n-d

雑感

ダーッと作ったので荒々だけど最低限は満たせてるので良き。
久々にGAS触って楽しかった。色々自動化していきたい。

Discussion