🌟

BacklogとgoogleカレンダーとGASと実装

2021/12/23に公開

こんにちは。@lattest です。

この記事は airCloset Advent Calendar 2021 の 23 日目です。
ど素人が書かせていただいています🧎‍🧎‍♂️🧎‍

BacklogデータをもとにGASの仕組みを利用してgoogleカレンダーにスケジュール登録ができるようにした時のお話です🌝

出来上がりの表示はこんな感じ

きっかけ

開発には工程ごとにBacklogチケットを作成して期日が見えるようにしていますが
それでも、期日より開発が遅れることがありました。
Backlogでは,見づらい?😕😕😕😕😕😕😕😕😕🌝😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕😕🌝😕😕😕😕
という疑問から、
期日の全体感が見えやすくなるよう、カレンダーに表示できるようにしました。

環境

仕組み(GAS)

  • Backlogの作業中になっているチケットを担当者ごとに全件取得する
  • カレンダー作成に必要な情報をobjにする
  • カレンダーに予定を追加するロジックを作成する

    *③④備考欄に案件ごとのSlackチャンネルURLを載せるための処理(なくてもOKなロジック)
    *⑤更新は削除してから新規追加を毎回行なっている

Googleカレンダーにスケジュール追加するロジック

  • 下記ロジックに、オブジェクトのアレーとgoogleカレンダーIdを引数に渡せばカレンダーにスケジュールが追加されます。
  • 追加したいobjのキーは「title」,「start」,「end」が必須(objのArr型)
  • optionsはなければ渡さなくても大丈夫
  • 中身を一度全削除してから予定を入れる

(例)
putScheduletoCalendar([{title:'string型',start:'YYYY-MM-DD',end:'YYYY-MM-DD'}],カレンダーのId(string型))

function putScheduletoCalendar(scheduleObjArr = [], calendarId) {
  if (!calendarId) { return }
  const cal = CalendarApp.getCalendarById(calendarId);
  if (scheduleObjArr.length === 0) { return; }
  ////// カレンダーの予定を削除をする /////////////
  // 削除開始日の取得
  const delStartDate = new Date('2021-1-1');
  // 削除終了日の取得
  let delEndDate = new Date();
  delEndDate.setDate(delEndDate.getDate() + 60)
  const events = cal.getEvents(delStartDate, delEndDate);
  for (let i in events) {
    // スリープ(編集数が多すぎるとリミットに引っかかってフリーズするため)
    Utilities.sleep(1000)
    events[i].deleteEvent();
  }
  scheduleObjArr.forEach(scheduleObj => {
    if (!scheduleObj.start && !scheduleObj.end) { return }
    ////// カレンダーに登録する内容を設定する /////////////
    // 開始日時
    let startDayjs = scheduleObj.start ? scheduleObj.start : scheduleObj.end;
    startDayjs = dayjs.dayjs(startDayjs)
    // 終了日時
    let endDayjs = scheduleObj.end ? scheduleObj.end : scheduleObj.start;
    endDayjs = dayjs.dayjs(endDayjs)
    // イベントのタイトル
    const title = scheduleObj['title'];

    // オプション
    const options = scheduleObj.options;
    // スリープ(編集数が多すぎるとリミットに引っかかってフリーズするため)
    Utilities.sleep(1000)
    // カレンダーに登録する。
    if (startDayjs.format('YYYY-MM-DD') === endDayjs.format('YYYY-MM-DD')) {
      const dayTime = new Date(startDayjs)
      cal.createAllDayEvent(title, dayTime, options);
    } else {
      const start = new Date(startDayjs)
      let end = new Date(endDayjs)
      end.setDate(end.getDate() + 1)
      cal.createAllDayEvent(title, start, end, options);
    }
  })
}

まとめ

予想外の効果

  • メンター視点で、担当エンジニアのスケジュールが把握できる
  • PMO視点でスケジュールの開くタイミングが把握できる

遅延解決はできたか?

  • 全面解決には至らなかった
    カレンダーの導入によって効率化された面もあるが、
    根本的な遅延解決はできなかったので別の施策を今後も打っていく必要がありそうです。

Discussion