応急処置でFullCalendar v1をGoogleカレンダーAPI V3に対応して延命してみる。
あくまで動けばOK!というレベルの応急処置の話なので
この記事を真似しても動かないと言われても責任はとれません。
ちなみに修正してみたのはFullCalendarのver1.6.4で作ったGoogleカレンダーです。
動作サンプル
古いfullcalendarのGoogleカレンダー表示を修正してみる
FullCalendar v1 のGoogleカレンダー延命でやったこと
gcal.jsの書き換え
応急処置で書き換えたgcal.js
http://tachimachi.hmkt.me/141121_legacy_calendar_api_bugfix/dl/gcal.fix2014Nov.js
※元のコードと比較しやすいようにあえてファイルの名前を変えてます。
変更点まとめ
古いv1のgcal.jsとコード比較しながら記事を見てみるとわかりやすいです。
※Windows環境向けですがコード比較ソフトはWinMergeとかおすすめ
WinMerge 日本語版
公開APIキー設定用の変数追加
変数の値は自分のGoogle公開APIキーに書き換えてください。
var YOUR_GOOGLE_API_KEY = '**************';
※Google公開用APIキーの作り方は前回記事を参照。
ノーマークでXデー(Google Calendar API v2終了日)を迎えてしまった件。 - たちまちメモる
APIのURLをひっかける正規表現の変更
fc.sourceNormalizers.push(function(sourceOptions) { if (sourceOptions.dataType == 'gcal' || sourceOptions.dataType === undefined && (sourceOptions.url || '').match(/^(http|https):\/\/(www.google.com|www.googleapis.com)\/calendar\/(feed|v3)\//)) { sourceOptions.dataType = 'gcal'; if (sourceOptions.editable === undefined) { sourceOptions.editable = false; } } });
予定リストを取得する部分(関数 transformOptions)の書き換え
前回の記事の件でAPIにアクセスするURLやら戻り値が変わっていることが判明したので
ごっそり書き換えてます。
Ajaxの戻り値参考↓
Events - Google Calendar API — Google Developers
function transformOptions(sourceOptions, start, end) { var success = sourceOptions.success; var data = $.extend({}, sourceOptions.data || {}, { 'start-min': formatDate(start, 'u'), 'start-max': formatDate(end, 'u'), 'singleevents': true, 'max-results': 9999 }); var ctz = sourceOptions.currentTimezone; if (ctz) { data.ctz = ctz = ctz.replace(' ', '_'); } console.log(sourceOptions.url + '?key='+ YOUR_GOOGLE_API_KEY +'&singleEvents=true'); return $.extend({}, sourceOptions, { url: sourceOptions.url + '?key='+ YOUR_GOOGLE_API_KEY +'&singleEvents=true', dataType: 'jsonp', data: data, startParam: false, endParam: false, success: function(data) { var events = []; if (data.items) { $.each(data.items, function(i, entry) { if(entry.status == 'confirmed'){ var startStr = (typeof(entry.start.date) != 'undefined') ? entry.start.date : entry.start.dateTime; var start = parseISO8601(startStr, true); var endStr = (typeof(entry.end.date) != 'undefined') ? entry.end.date : entry.end.dateTime; var end = parseISO8601(endStr, true); var allDay = startStr.indexOf('T') == -1; var url = entry.htmlLink; if (ctz) { url += (url.indexOf('?') == -1 ? '?' : '&') + 'ctz=' + ctz; } if (allDay) { addDays(end, -1); // make inclusive } events.push({ id: entry.id, title: entry.summary, url: url, start: start, end: end, allDay: allDay, location:entry.location, description: entry.description }); } }); } var args = [events].concat(Array.prototype.slice.call(arguments, 1)); var res = applyAll(success, this, args); if ($.isArray(res)) { return res; } return events; } }); }