GASのGoogleカレンダーに終日や日時入りの予定の追加方法

Google Apps Scriptで予定を追加

Google Apps Script (GAS)を使用すれば、Googleカレンダーに終日や日時入りの予定を追加することができる。

この記事では終日や日時入りの予定の追加方法や自動で予定を入れる方法について説明します。

appsscript.jsonで日本時間を設定

Google Apps Scriptでカレンダーの予定を追加する処理を日本時間で実行するにはappsscript.jsonで日本時間を設定する必要がある。

やり方はプロジェクトの設定から『「appsscript.json」マニフェスト ファイルをエディタで表示する』にチェックを入れて、appsscript.jsonのtimeZoneをAsia/Tokyoに設定して保存する。

appsscript.jsonで日本時間を設定

GASで終日の予定を追加する

最初にGoogle Apps Scriptのエディタを開きます。

CalendarApp.getDefaultCalendar()をcalender定数に入れて、createAllDayEventで予定のタイトルと日付をnew Date()で指定して入れます。

createAllDayEvent(title, date)
function myFunction() {
  const calender = CalendarApp.getDefaultCalendar()
  calender.createAllDayEvent('有給休暇', new Date('2022/03/04'))
}

これを実行すればGoogleカレンダーに終日の予定を追加することができます。

GASで日時入りの予定を追加する

日時入りの予定の場合はcreateEventを使用します。

createEvent(title, startTime, endTime) 

タイトル、開始日時、終了日時を入れるだけなので簡単に作成できます。

function myFunction() {
  const calender = CalendarApp.getDefaultCalendar()

  calender.createEvent(
    '昼休み',
    new Date('2022/03/03 12:00'),
    new Date('2022/03/03 13:00'),
  )
}
GASで日時入りの予定を追加

毎日自動で予定を入れる方法

例えば毎日「昼休み12:00〜13:00」を自動で入れたい場合はその日の日時で予定を追加する処理を以下のように作成する。

function myFunction() {
  const calender = CalendarApp.getDefaultCalendar()
  const now = new Date()
  const addZero = (n) => ('0' + n).slice(-2)
  const [year, month, date] = [now.getFullYear(), addZero(now.getMonth() + 1), addZero(now.getDate())]
  const startDate = `${year}/${month}/${date} 12:00`
  const endDate = `${year}/${month}/${date} 13:00`

  calender.createEvent(
    '昼休み',
    new Date(startDate),
    new Date(endDate),
  )
}

これで実行した際は日付の開始および終了は当日のものになる。

あとはトリガーで日付ベースのタイマーで実行されるようにすれば毎日自動で予定が追加される。

Google Apps Script トリガー

※ CalendarApp.getDefaultCalendar()でデフォルトのカレンダーを取得しているが、ほかのカレンダーに予定を追加する場合はCalendarApp.getCalendarById('<カレンダーID>')でカレンダーIDを指定して取得する。

予定の色を変更する

前述のやり方でカレンダーに予定を追加することはできるが、予定はデフォルト色になっている。

休みなどの予定の場合は色を変更したいことが多いだろう。

そんなときはsetColorを使用して色を指定すれば変更できる。

const event = calender.createEvent(
  '昼休み',
  new Date(startDate),
  new Date(endDate),
)
event.setColor(CalendarApp.EventColor.PALE_RED)

使用可能な色はGoogleのリファレンスをご参照ください。

予定がすでにある場合は時間をずらす

例えばミーティングの予定がすでに12:00〜13:00に入っている場合、昼休みの予定を12:00〜13:00に入れても意味がない。

この場合は13:00〜14:00にずらす必要がある。

時間をずらすにはまず当日にすでに入っている予定の一覧を取得する。

そして時間が重複する場合はずらした時間帯で予定を追加する。

function setTodayEvents() {
  const calender = CalendarApp.getDefaultCalendar()
  const now = new Date()
  const addZero = (n) => ('0' + n).slice(-2)
  let [year, month, date] = [now.getFullYear(), addZero(now.getMonth() + 1), addZero(now.getDate())]
  let startDate = new Date(`${year}/${month}/${date} 12:00`)
  let endDate = new Date(`${year}/${month}/${date} 13:00`)
  const schedules = calender.getEventsForDay(now)
  const data = []

  if (schedules.length) {
    schedules.forEach((schedule, i) => {
      const start = schedule.getStartTime()
      const end = schedule.getEndTime()
      if (start >= startDate) {
        data.push({
          title: schedule.getTitle(),
          start: start,
          end: end,
        })
      }
    })
  }

  const firstEvent = data.length ? data.find(o => o.start >= startDate) : null
  const eventTitle = '昼休み'

  if (!data.find(o => o.title === eventTitle)) {
    if (firstEvent?.start >= endDate || !schedules.length) {
      const event = calender.createEvent(
        eventTitle,
        startDate,
        endDate,
      )
      event.setColor(CalendarApp.EventColor.PALE_RED)
    } else {
      const event = calender.createEvent(
        eventTitle,
        new Date(startDate.setHours(startDate.getHours() + 1)),
        new Date(endDate.setHours(endDate.getHours() + 1)),
      )
      event.setColor(CalendarApp.EventColor.PALE_RED)
    }
  }
}