GASでアドベントカレンダーの日付を自動割当できるスクリプトを作成した

この記事はHRBrain Advent Calendar 2022の2日目の記事です。

https://qiita.com/advent-calendar/2022/hrbrain

## はじめに

バックエンドエンジニアをやっている入中です。

この記事ではGoogle Apps Scriptとスプレッドシートを使用して、アドベントカレンダーの何日目の担当かをサクッと決められるスクリプトを作成したので紹介します。

## 誰に向けた記事

- GASを使ってみたい方
- 開発環境構築せずに、プログラムを動かしてみたい方
- アドベントカレンダーの日程割に困っている方

## 経緯

私の発案で2022年のHRBrainアドベントカレンダーの担当日を決める際に、くじ引きで日にちを決めようと決意し、みんなにくじを引いてもらいました。（アナログな手作りくじ）くじを引いてもらったのはいいのですが。。。その後、自分が引いてたくじ番号をNotionに書いてもらったり、リモートで就業している方がくじをひけなかったり、自分自身もアドベントカレンダーの日程管理に時間を取られたりと、なかなか反省の多い施策でした。。。

やりたかったことは`アドベントカレンダーに参加してくれる人にランダムで日程が割り付けられること`なので、スプレッドシートの日付に参加者を充てるスクリプトを作成し、`在宅・出社問わずアドベントカレンダーの日程決めに参加できる`、`誰が何日の担当かの確認の煩わしさが起こらない`ようにしようと考えました。

## 作ったものの動き

![output-pallete.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/59ea51d3-c099-8d5a-9966-eef7c1ac9d1c.gif)


- 空白行があった場合に除外することを確認するため、1行空白を入れています。
- 2022年のHRBrainアドベントカレンダーは参加者が25名以上になりました。参加者が25名以上の場合、スプレッドシート`結果`ページの1列目には`25`以降に`1`を入力し、`カレンダー2の1日`に割り当たるようにしました。
- シートに記載している名前は[名前生成API](https://green.adam.ne.jp/roomazi/randomname.html)で作成したものです。

## コード

```AssignCalendar.js
function assignCalendar() {

  const spreadSheetId = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
  const sheet = SpreadsheetApp.openById(spreadSheetId)
  const memberSheet =  sheet.getSheetByName('参加者')
  const resultSheet =  sheet.getSheetByName('結果')

  const membersList = memberSheet.getRange(1,1,memberSheet.getLastRow())
  const members = membersList.getValues()

  const m = []
  let num = 0
  for (let i = 1; i < members.length; i++) {
    if (members[i][0]== "") {
      // 空白セルがあったときにスキップする
      continue
    }
    num++
    m.push([members[i][0]])
  }
  const shuffleMembers = shuffleItems(m) 
  const memberRow = resultSheet.getRange(2,2,num)
  memberRow.setValues(shuffleMembers)
}

function shuffleItems(items){
  l = items.length
  while (l) {
    j = Math.floor( Math.random() * l );
    t = items[--l];
    items[l] = items[j];
    items[j] = t;
  }
  return items
}
```

## まとめ

1~1.5hくらいで簡単にできたので、アドベントカレンダー日程決めの前に用意できていたらなと改めて思いました。来年、もし機会があればこのスクリプトで日程決めができたらいいなと思います。

最後まで読んでいただきありがとうございます。

## 補足

<details open><summary><b>GASの始め方</b></summary>

　　【Gas開発環境にアクセスするまでの手順】
　　※　Gasを使用して開発するにはGoogleアカウントが必要です。

　　1. GoogleDriveにアクセス

![スクリーンショット 2022-11-24 19.16.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/676b73b8-092a-92ef-dcb9-c45c9506edc8.png)

　　2. Google Apps Scriptにアクセス

![スクリーンショット 2022-11-24 19.21.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/0fd8635c-e17a-2e34-54c3-dd1e5a1c718b.png)


　　3. コードを書いて `▶実行`を押下して動かす

![スクリーンショット 2022-11-24 19.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/98061be4-bbb2-ec29-ec8c-efef9d3adca5.png)

</div></details>

<details open><summary><b>sheetIdとは</b></summary>

![スクリーンショット 2022-11-24 19.08.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/631edf16-a115-2d2e-d568-bcd7105d8401.png)

スプレッドシートを表示した際のURLの`/d/`・`#edit`　に挟まれた英数字

</div></details>

<details open><summary><b>sheet.getSheetByName({スプレッドシート名})の指定方法</b></summary>

`sheet.getSheetByName()`には、スプレッドシートのシート名を入れてください

![スクリーンショット 2022-11-24 19.49.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421982/703c0738-9581-d060-13e6-08e62ec5cabf.png)

</div></details>

参考: 

[JavaScript　リファレンス](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference)

[【GAS】スプレッドシートでGASを使用する](https://qiita.com/MLLB/items/bd2cc8b67c3b98825d9d)