Googleカレンダーの予定をGoogle Apps Scriptで取得して、jsonデータとして出力してみます。
設定方法
今回は営業日時が不規則なお店のWebサイトに営業カレンダーを設置するという想定で、以下のようなGoogleカレンダーを作成しました。
このGoogleカレンダーからGoogle Apps Scriptを使って予定を取得して、jsonデータとして出力するまでの処理を実装してみます。
まずはGoogleカレンダーから予定を取得して、ログに表示してみます。
const getEventsInMonth = () => {
  // 取得する年月
  const year = 2024;
  const month = 3;
  // 取得範囲の設定
  const startDate = new Date(year, month - 1, 1);
  const endDate = new Date(year, month, 1);
  // 予定の取得
  const calendar = CalendarApp.getDefaultCalendar();
  const events = calendar.getEvents(startDate, endDate);
  // 予定をオブジェクト形式に整形
  let eventsData = {
    period: year+'-'+month,
    data:[]
  };
  eventsData.data = events.map((event) => {
    return eventData = {
      "title": event.getTitle(),
      "startTime": formatDate(event.getStartTime()),
      "endTime": formatDate(event.getEndTime())
    };
  });
  // JSON形式のデータの確認
  Logger.log(JSON.stringify(eventsData));
}
const formatDate = (date) => {
  // 日時をISO 8601形式に変換
  return Utilities.formatDate(date, Session.getScriptTimeZone(), "yyyy-MM-dd'T'HH:mm:ss'Z'");
}
Google Apps ScriptにはGoogleカレンダーの操作を行うため、CalendarAppクラスが用意されています。
上記サンプルではgetDefaultCalendar()でデフォルトのカレンダーを取得して、getEvents()で指定した期間の予定を取得しています。
実行してみると、以下のようなjsonが出力できました。(見やすいように整形しています。)
{
    "period": "2024-3",
    "data": [
        {
            "title": "営業",
            "startTime": "2024-03-01T09:00:00Z",
            "endTime": "2024-03-01T18:00:00Z"
        },
        {
            "title": "営業",
            "startTime": "2024-03-04T09:00:00Z",
            "endTime": "2024-03-04T18:00:00Z"
        },
        ~ 略 ~
        {
            "title": "営業",
            "startTime": "2024-03-28T09:00:00Z",
            "endTime": "2024-03-28T18:00:00Z"
        },
        {
            "title": "営業",
            "startTime": "2024-03-29T09:00:00Z",
            "endTime": "2024-03-29T18:00:00Z"
        }
    ]
}
次にウェブアプリとして公開して、パラメータで指定した年月の予定をjson形式で返すようにしてみます。
コードを以下のように変更します。
const doGet = (e) => {
  // パラメータの年月を取得
  let year = parseInt(e.parameter.year);
  let month = parseInt(e.parameter.month);
  const now = new Date();
  if(!year) year = now.getFullYear();
  if(!month) month = now.getMonth()+1;
  // 指定された年月の予定を取得
  const eventsJson = getEventsInMonth(year, month);
  // JSON形式のデータを返す
  return ContentService.createTextOutput(eventsJson).setMimeType(ContentService.MimeType.JSON);
}
const getEventsInMonth = (year, month) => {
  // 取得範囲の設定
  const startDate = new Date(year, month - 1, 1);
  const endDate = new Date(year, month, 1);
  // 予定の取得
  const calendar = CalendarApp.getDefaultCalendar();
  const events = calendar.getEvents(startDate, endDate);
  // 予定をオブジェクト形式に整形
  let eventsData = {
    period: year+'-'+month,
    data:[]
  };
  eventsData.data = events.map((event) => {
    return eventData = {
      "title": event.getTitle(),
      "startTime": formatDate(event.getStartTime()),
      "endTime": formatDate(event.getEndTime())
    };
  });
  return JSON.stringify(eventsData);
}
const formatDate = (date) => {
  // 日時をISO 8601形式に変換
  return Utilities.formatDate(date, Session.getScriptTimeZone(), "yyyy-MM-dd'T'HH:mm:ss'Z'");
}
次にアプリの公開ですが、この流れは以前に記事を投稿していますので詳しくはそちらをご確認ください。
デプロイ後に表示されるウェブアプリURLに「?year=2024&month=3」のように年月の情報を付与してアクセスすると、jsonデータの出力を確認できました。
デプロイ設定する際の補足で、使用するカレンダーの権限などによってはGoogle Calendar APIの設定が必要になります。
Google Calendar APIの追加は、左メニューにあるサービスの追加から行います。
サービスの一覧からGoogle Calendar APIを選択して、追加をクリックします。



コメントが承認されるまで時間がかかります。