0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

kintoneの日時をGoogleカレンダー用URLに渡す|UTC変換とURLエンコードをJavaScriptで確認

0
Posted at

自社でkintone向けプラグインを開発しているkintacoです。「Googleカレンダー予定作成」の実装にあるUTC変換と、予定作成URLの組み立てを、小さな関数に切り出して解説します。

この記事のコードはURLを生成するだけです。Googleへの通信、予定登録、OAuth認証、kintoneの値更新は行いません。予定の作成画面を開く操作と、Googleカレンダーに保存する操作は別です。

UTCで整形してから、値ごとにエンコードする

kintoneの日時値を受け取る想定で、タイムゾーンを含むISO形式を入力します。タイムゾーンなしの「2026-10-23T10:00:00」は、このサンプルでは受け付けません。実行端末のローカル時刻として解釈されるのを避けるためです。

製品内のformatGCalDateTimeと同じUTC取得・ゼロ埋めの考え方に、この記事では入力形式・終了順序のチェックを加えています。製品版の全文ではありません。

function formatGCalDateTime(value) {
  if (typeof value !== 'string' ||
      !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/.test(value)) {
    throw new Error('タイムゾーンを含む日時を指定してください。');
  }
  const date = new Date(value);
  if (Number.isNaN(date.getTime())) throw new Error('日時が不正です。');
  const pad = n => String(n).padStart(2, '0');
  return String(date.getUTCFullYear()).padStart(4, '0') +
    pad(date.getUTCMonth() + 1) + pad(date.getUTCDate()) + 'T' +
    pad(date.getUTCHours()) + pad(date.getUTCMinutes()) +
    pad(date.getUTCSeconds()) + 'Z';
}
function buildCalendarUrl({title, start, end, location = '', details = ''}) {
  const dates = formatGCalDateTime(start) + '/' + formatGCalDateTime(end);
  if (Date.parse(end) <= Date.parse(start)) throw new Error('終了は開始より後にしてください。');
  const url = new URL('https://calendar.google.com/calendar/render');
  url.search = new URLSearchParams({action: 'TEMPLATE',
    text: title || 'kintone予定', dates, location, details}).toString();
  return url.toString();
}

何が起きるか

日本時間の2026年10月23日10時は、UTCでは同日01時です。結果のdatesパラメーターは「20261023T010000Z/20261023T020000Z」になります。「Z」を付けるだけではUTCへ変換されないため、getUTCFullYearなどで値を取り出します。

textやlocationを文字列連結でそのまま足すと、件名に「&」がある場合などにURLの区切りと衝突します。URLSearchParamsで値を設定し、二重にencodeURIComponentを適用しないようにします。

検証の例

const url = buildCalendarUrl({
  title: '商談 & 次回提案',
  start: '2026-10-23T10:00:00+09:00',
  end: '2026-10-23T11:00:00+09:00',
  location: '東京都内の訪問先'
});
console.log(new URL(url).searchParams.get('dates'));

このサンプルの確認対象は、UTC変換、日付をまたぐ変換、空欄・不正値、終了前後、特殊文字の復元です。Node.jsで確認し、実際のGoogleカレンダーへの登録テストは含めていません。

業務へ組み込むときの境界

レコード詳細画面のイベントから値を取り出し、ボタン操作時にURLを開く構成にできます。その場合も、閲覧権限で取得できない項目、空欄、ポップアップ制限を扱う必要があります。

件名・説明・場所は、URLを開けばGoogleに渡る情報です。機密情報を無条件に説明へ入れないでください。また、予定作成URLはCalendar APIによる登録・更新ではなく、自動同期にもなりません。UIやURLパラメーターの将来的な変更にも注意が必要です。

設定画面で管理したい場合

自社のGoogleカレンダー予定作成プラグインの仕様・設定画面で、設定から利用する方法も紹介しています。サンプルと製品版の対応範囲は異なります。

無料利用では、非契約ドメインのPC・モバイル一覧画面に有償プランの案内バナーが30%の確率で表示されます。契約済みドメインでは表示されません。一度閉じると、同じブラウザー・同じkintoneドメインでは、全Kintacoプラグイン共通で24時間非表示になります。

参考資料

製品仕様と実コードの確認元:GoogleCalendarCreate/src/js/desktop.js(1.0.2)。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?