MENU

GASで終日予定を登録する|終了日の扱い

当ページのリンクには広告(PR)が含まれていることがあります。
GASで終日予定を登録する|終了日の扱い。複数日の予定、終了日は範囲外、日数を照合の処理例。

11月1日から3日までの終日予定を作るとき、終了日に11月3日を指定すると、期待より1日短くなる場合があります。GASの複数日の終日予定では、終了日は予定に含まれません。1日から3日を含めたいなら、終了には4日を指定します。

時間付き予定の終了時刻と混ぜず、日付の範囲として確認します。説明用の3日間を練習用カレンダーへ登録する例を使い、最初は登録せずに予定の範囲を表示します。

目次

終了日は含まれない境界

公式のCalendar資料では、createAllDayEvent(title, startDate, endDate)の終了日が排他的であると説明されています。ここでいう排他的とはその日自体を予定の日数へ含めないという意味です。

開始が11月1日、終了が11月4日なら、予定に含まれるのは1日・2日・3日です。時刻部分を23時59分へ変えて「3日の終わり」を表そうとするのではなく、日付の境界で指定します。このメソッドは時刻部分を使いません。

タイムゾーンの取り違えも避けるため、この例ではスクリプトとカレンダーの設定が同じ場合だけ試します。違う場合は設定を勝手に書き換えず、どちらの日付で扱う予定かを確認してから進めます。

登録しない状態で範囲を見る

カレンダーIDを練習用のものへ置き換えます。日付のコンストラクタでは、月は0から始まるので、11月は10です。ここも終了日の範囲とは別に取り違えやすい箇所です。

function createPracticeAllDay(calendar, start, end, scriptZone, apply) {
  const zone = calendar.getTimeZone();
  if (zone !== scriptZone) throw new Error('スクリプトとカレンダーのタイムゾーンを確認');
  if (!(start instanceof Date) || !(end instanceof Date) ||
      !Number.isFinite(start.getTime()) || !Number.isFinite(end.getTime()) ||
      end.getTime() <= start.getTime()) throw new Error('開始日と終了日を確認');
  const plan = {
    start: Utilities.formatDate(start, zone, 'yyyy-MM-dd'),
    endExclusive: Utilities.formatDate(end, zone, 'yyyy-MM-dd'),
    calendarId: calendar.getId()
  };
  if (plan.start >= plan.endExclusive) throw new Error('終了日は開始日より後に指定');
  if (apply === true) {
    plan.iCalUID = calendar.createAllDayEvent('練習用の終日予定', start, end).getId();
  }
  return plan;
}

function previewAllDayRange() {
  const APPLY = false;
  const calendar = CalendarApp.getCalendarById('練習用カレンダーID');
  if (!calendar) throw new Error('カレンダーが見つかりません');
  console.log(JSON.stringify(createPracticeAllDay(calendar,
    new Date(2026, 10, 1), new Date(2026, 10, 4),
    Session.getScriptTimeZone(), APPLY)));
}

APPLY:falseなら予定は作られません。ログのstartが2026-11-01、endExclusiveが2026-11-04、登録先が練習用カレンダーであることを確認します。自分の環境のカレンダーIDや設定を、例の値から推測しないでください。

登録後は3日間かを画面で確認する

練習用へ登録を試す場合だけtrueへ変えます。11月1日から3日へ終日予定が表示され、4日に伸びていないことを確認します。APPLY:trueで再び実行すれば別の予定を作るため、エラーや結果不明のときに無条件で繰り返さないようにします。

戻されたiCalUIDを控え、登録先のカレンダーと対象日で結果を探せる形にしておきます。予定作成と、その後の確認は別の段階です。コードが最後まで動いたというログだけでは、見たい日付に表示されたことまでは確認できません。

この例ではゲストの追加や招待メールの送信をしていません。共有カレンダーへ入れる前に、閲覧者が予定名や日付を見てよいかも確認します。

日数をミリ秒で補正しない

終了日の違いを直すために、時差を考えず24時間分のミリ秒を足す方法は避けます。日付の範囲と経過時間は目的が違い、地域によっては夏時間の切り替わりも関係します。入力が日付なら、含めたい最終日の翌日を指定する意味を先に決めます。

掲載コードはローカルの代用カレンダーで、登録しない分岐、終了日、設定違い、日付不備、作成呼び出しを確認しました。Google上の終日表示と設定画面は未実行です。日時の基本はカレンダー登録、確認するログは実行履歴も参照してください。

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次