自社で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)。