保育園の予定表をGoogleカレンダーに一括登録したらとても便利だった！！

## 毎月の予定を入力するのが面倒・・・
保育園のスケジュール表を毎月もらいますが、これをGoogleカレンダーに１つずつ入力するのは面倒な作業です！しかし、入力していないと忘れ物をします:expressionless:
忘れないために毎月登録して、夫婦で共有しています:thumbsup:
前々から一括入力したいと思っていました！！今回はGASを学んだので、こちらを使って一括入力していきます:relieved:

## 実装イメージ
![画像からExcelに表を抽出.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310538/776a7f0a-9885-d766-7c76-fd97e62f0fdb.png)

## 実装結果
https://twitter.com/yuko6891/status/1668133599818944514

スプレッドシートを手で修正しているため、完全に自動化とは言いませんが、それでも一括登録できて本当に楽になりました:grin:嬉しい:heart_eyes:
他にも年間予定表があるので、こちらも一括登録したいと思っています。

## 実装環境
GAS
Googleスプレッドシート
Microsoft365

## 手順

### Microsoft365で画像からExcelに表を抽出する
画像から表へを選択してExcelに変換します。
![IMG_4648.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310538/588d9c48-a397-3da7-2869-02f713241436.jpeg)

Excelになりました。（なぜか後半の日付が入っていません・・・）
このままでは自分の子供クラス以外もあるため、自分の子供だけを抽出しました。（ここは手作業です・・・）
![スクリーンショット 2023-06-12 13.43.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310538/102bd981-8634-2bdb-ef83-c3cc833f61c7.png)

### GoogleスプレッドシートからGASを開いてスクリプトを入力する
ここでGoogleスプレッドシートへ変換します。
![スクリーンショット 2023-06-12 23.21.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310538/7bb038cd-966d-ac64-8d4f-302d8d9aebc4.png)

GoogleスプレッドシートからGASを開きます。
![スクリーンショット 2023-06-12 13.49.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310538/fb1e0a05-2172-3ded-bd01-8c4f0b9ace25.png)


GASでスクリプトを開きます。
![スクリーンショット 2023-06-12 13.49.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310538/0957adef-ce6c-a646-b70e-cb08c2c924be.png)


こちらの記事のスクリプトコードを参考にさせてもらいました。
同じようにスケジュール項目を設定しました。
（今度は、子供スケジュールに合わせた項目にして手作業を削減したい）
- [Google スプレッドシート完全攻略](https://technical.verybestcbp.com/registfromsheetx/)

<details><summary>コード</summary><div>

```コード.js
/**
 * Googleカレンダーに予定を追加する
 */
function CreateSchedule() {

  // googleカレンダーの取得
  const calendar = CalendarApp.getDefaultCalendar()

  // 読み取り範囲（表の始まり行と終わり列）
  const topRow = 2
  const lastCol = 7
  const statusCellCol = 1

  // 予定の一覧バッファ内の列(0始まり)
  const statusNum = 0
  const dayNum = 1
  const startNum = 2
  const endNum = 3
  const titleNum = 4
  const locationNum = 5
  const descriptionNum = 6

  // シートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()

  // 予定の最終行を取得
  let lastRow = sheet.getLastRow()

  //予定の一覧をバッファに取得
  const contents = sheet.getRange(topRow, 1, sheet.getLastRow(), lastCol).getValues()

  //順に予定を作成
  for (let i = 0; i <= lastRow - topRow; i++) {

    //「済」の場合は無視する
    if (contents[i][statusNum] === "済") {
      continue
    }

    // 値をセット 日時はフォーマットして保持
    let day = contents[i][dayNum]
    let startTime = contents[i][startNum]
    let endTime = contents[i][endNum]
    let title = contents[i][titleNum]

    // 場所と詳細をセット
    let options = { location: contents[i][locationNum], description: contents[i][descriptionNum] }

    console.log(day + " " + contents[i][titleNum])

    try {
      // 開始終了時刻が無ければ終日で設定
      if (startTime == '' || endTime == '') {
        //予定を作成
        calendar.createAllDayEvent(
          title,
          day,
          options
        )

        // 開始終了時刻があれば範囲で設定
      } else {
        // 開始日時を作成
        let startDate = new Date(day)
        startDate.setHours(startTime.getHours())
        startDate.setMinutes(startTime.getMinutes())

        // 終了日時を作成
        let endDate = new Date(day)
        endDate.setHours(endTime.getHours())
        endDate.setMinutes(endTime.getMinutes())

        // 予定を作成
        calendar.createEvent(
          title,
          startDate,
          endDate,
          options
        )
      }

      //予定が作成されたら「済」にする
      sheet.getRange(topRow + i, statusCellCol).setValue("済")

      // エラーの場合ログ出力する
    } catch (e) {
      Logger.log(e)
    }
  }

  // 完了通知
  Browser.msgBox("予定を追加しました。")
}
```
</div></details>

### Googleスプレッドシートから実行
![スクリーンショット 2023-06-12 13.55.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310538/5869ed60-a071-a027-b424-0c722d6e6584.png)


## 最後に
実装結果にも書きましたが、一活してスケジュール登録できて負担が減りました:grin:
今回は保育園でしたが、次は小学校の予定表をやりたいと思います。
この一括登録機能はママたちに喜ばれること間違いなしですね！
今回は、手作業が入ってしまいましたが、もう少し作業を減らしていく方法を考えたいと思います:thumbsup: