「店長『来月のシフト希望をLINEで送ってください』」をやめたい大学生アルバイト


読んでいただく前に

簡潔に言えばシフトをGoogleフォームで募集するにあたって、そのフォームをGASで自動生成できるようにしたっていう話です。
技術メインの話というより、技術を少し使ってこんな業務改善ができたよっていう備忘録です。

アルバイト先で起きている問題

大学生がアルバイトできるような職場はアルバイト中心で業務が回っていることが多いです。
おそらく、某ハンバーガーチェーンなんかはアルバイト数十人〜数百人に対して社員数人でしょう。
そうすると毎月、めんどくさい業務が発生してしまいます。

そう、「シフト決め」です。

私が勤務しているアルバイト先も毎月末に店長さんがアルバイトのシフト決めに追われています。
そして、そんな時に店長さんはいつも

「え、〇〇さんってシフト提出してる?」

「あれ?もう全員提出してる...? あ..あいつまだじゃん...。」

とイライラを募らせています。
それもそのはず。だってLINEでシフトを募集してるんですもん。

LINEでシフトを募集すると以下のような問題点が生じます。

  • 募集時に相当厳しくフォーマット指定しないとみんなオリジナリティーに溢れた体裁で提出する
  • 「この日は何時から何時で募集したくて、この日は...」っていうのを指定するのがめんどくさい
  • トークしているうちに提出されたシフトが上の方に消えていく
  • 今誰が提出しているのかわからない
  • 締め切った後にそれを集計するのがめんどくさい
  • 以上の問題点によって他のことに手が回らなくなる

私はただのアルバイトなので社員さんのことに介入しすぎるのは良くないですが、最後の問題点だけはアルバイトにも影響が出るため少し困ってしまいます。

そこで、一人の勇敢なアルバイトが立ち上がりました...!!!!(自分)

試行錯誤1「そうだ!Googleフォームでシフト希望を集めよう!」

これはどんな人でも思つくとても平凡な案です。
ただ割と良い判断だと思っています。

  • 募集時に相当厳しくフォーマット指定しないとみんなオリジナリティーに溢れた体裁で提出する→体裁を統一できる
  • 「この日は何時から何時で募集したくて、この日は...」っていうのを指定するのがめんどくさい→質問ごとに指定できる
  • トークしているうちに提出されたシフトが上の方に消えていく→スプレッドシートに蓄積されていく
  • 今誰が提出しているのかわからない→スプレッドシートに蓄積されていく
  • 締め切った後にそれを集計するのがめんどくさい→スプレッドシートをコピペするだけでいい

そこで、1日〜31日までのシフト希望を聞く質問が入ったGoogleフォームを作成することにしました。
月曜日始まりから日曜日始まりの7通りの雛形を作成しておき、シフトを集めたいタイミングですぐに募集できるようにしました。

「これで!!万事解決だ!!」

そう思っていた私ですが、店長からクレーム(?)が届きました。

「質問の内容を変更するたびに雛形を編集するのがめんどくさいんだけど」

それもそのはず。
営業時間が変更されればシフトの募集時間も変わりますし、繁忙期には募集する時間帯を変更します。
その度に7つもある雛形を変更するのは骨が折れます。

っていうか問題が一切解決していません。むしろ悪化しています。

試行錯誤2「そうだ!GASでGoogleフォームを自動生成しよう!」

必要なGoogleフォームをGASでその都度生成できるようにすれば雛形の問題を解決することができると考えました。
そこで、前述したLINEでシフトを募集することの問題点・雛形の問題点の両方を解決するようなGASの作成に取り組みました。

作成する際にはGoogleスプレッドシートに必要な情報を入力し、その情報をもとにGASがGoogleフォームを作成するという手順で行います。
作成したGoogleスプレッドシートは下記のものです。

また、書いたGoogleAppScriptのコードは下記のものです。

function createEventForm(){
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadSheet.getSheetByName("フォーム作成用");
  const values = sheet.getDataRange().getValues();

  //新しいフォームを生成する
  const year = values[2][1];
  const month = values[3][1];
  const formTitle = String(year) + "" + String(month) + "月シフト提出フォーム";
  const form = FormApp.create(formTitle);
  const formDescription = values[4][1];
  form.setDescription(formDescription);

  //学年を聞く質問を追加する
  const schoolYearList = values[5][1].split(",");
  form.addMultipleChoiceItem().setTitle("学年を選択してください").setChoiceValues(schoolYearList).setRequired(true);

  //氏名を聞く質問を追加する
  form.addTextItem().setTitle("氏名を記入してください(同姓のスタッフがいない場合は苗字のみで構いません)").setRequired(true);

  //その月のそれぞれの日のシフト希望を聞く質問を追加する
  const thisMonthLastDay = new Date(year, month, 0).getDate();
  for(let i = 1; i <= thisMonthLastDay; i++){
    const today = new Date(year, month - 1, i)
    const dayOfWeek = ["", "", "", "", "", "", ""][today.getDay()];
    const shiftChoices = values[7+i][2].split(",")
    const isCheckBox = values[7+i][1] ? true : false;
    const questionTitle = `${i.toString()}日(${dayOfWeek})`
    if(isCheckBox){
      form.addCheckboxItem().setTitle(questionTitle).setChoiceValues(shiftChoices);
    }else{
      form.addMultipleChoiceItem().setTitle(questionTitle).setChoiceValues(shiftChoices);
    }
  }

  //週間希望出勤数を聞く質問を追加する
  const range = (start, end) => [...Array(end + 1).keys()].slice(start);
  const frequencyRequestList = range(1,7);
  form.addMultipleChoiceItem().setTitle("1週間あたりの希望出勤数を選択してください").setChoiceValues(frequencyRequestList).setRequired(true);

  //補足事項を聞く質問を追加する
  form.addTextItem().setTitle("補足事項があれば記入してください");
}

これによって手軽にシフト募集用のGoogleフォームを作成できるようになりました。

これで店長の仕事も大幅に削減!!
(改良の余地があることは承知しております)