
開始: Google カレンダー: 予定開始時
Start: Google Calendar: Event Started
このアイテムは、Google カレンダーに登録されている、予定の開始時刻を経過すると、ケースを開始します。
Basic Configs
- 工程名
- メモ
Configs for this Auto Step
- conf_User
- C1: Google カレンダー に接続するユーザ(要アプリ管理権限) *
- conf_CalendarId
- C2: Calendar ID (空白の場合、プライマリのカレンダー)
- conf_eventIdData
- C3: 予定 ID を保存するデータ項目 *
- conf_timestampData
- C4: 予定開始時刻を保存するデータ項目
- conf_endTimestampData
- C5: 予定終了時刻を保存するデータ項目
- conf_summaryData
- C6: 予定タイトルを保存するデータ項目
- conf_descriptionData
- C7: 説明を保存するデータ項目
- conf_htmlLinkData
- C8: 予定 URL を保存するデータ項目
Notes
- C1 のユーザは、[アカウント設定]>[Google 連携]にて、Google カレンダーと連携済みである必要があります
- ワークフロー基盤にて、Google 連携設定([システム設定]>[Google 連携])が必要です(要[システム管理権限])
- カレンダーIDは次のページを参照します。[カレンダー設定](Calendar Settings)>[カレンダーのアドレス](Calendar Address)
- 定期的に Questetra BPM Suite から Google カレンダーにポーリングが行われ、開始時刻を過ぎている予定がないか、チェックされます。開始時刻を過ぎている予定があれば、ケースが開始されます。
- 初回のチェック時には、ケースは開始されません。チェックのみ行われます。チェックの状況は、ケースログより確認できます。
- 短時間に多数の予定が開始すると、全ての予定について、ケースは開始されません。目安は、15 分間で 90 ケースです。
Capture

See also
Script (click to open)
- 次のスクリプトが記述されている XML ファイルをダウンロードできます
- google-calendar-event-started.xml (C) Questetra, Inc. (MIT License)
- コードの参考用にご利用ください
- アドオンとしてワークフローアプリにインポートすることはできません
const DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssX"; const DATETIME_FORMAT_FOR_ALL_DAY = "yyyy-MM-dd HH:mm:ss"; /** 日時フォーマッター */ const datetimeFormatter = new java.text.SimpleDateFormat(DATETIME_FORMAT); /** 終日予定用フォーマッター */ const allDayFormatter = new java.text.SimpleDateFormat(DATETIME_FORMAT_FOR_ALL_DAY); /** * 日時文字列をパースして java.sql.Timestamp オブジェクトを返す * @param {string} formatter 適用するフォーマッター * @param {string} str 日時文字列 * @return {timestamp} java.sql.Timestamp オブジェクト */ const parseDatetime = (formatter, str) => new java.sql.Timestamp(formatter.parse(str).getTime()); /** * 開始時刻を経過したイベントの検索 * @param limit イベント数の上限 * @param timestampLowerLimit timestamp の下限 * @return {Array} events イベント一覧 */ const list = (limit, timestampLowerLimit) => { //// == 工程コンフィグの参照 / Config Retrieving == const quser = configs.getObject("conf_User"); if (quser === null) { throw `User not found.`; } let calendarId = configs.get("conf_CalendarId"); if (calendarId === "" || calendarId === null) { calendarId = "primary"; } else if (calendarId.search(/[^\w.@]/) !== -1) { throw "Invalid Calendar ID"; } const events = getEvents(quser, calendarId, limit, timestampLowerLimit); logEvents(events); return events; } /** * イベントのログ出力 * @param {Array} events イベント一覧 */ const logEvents = (events) => { if (events.length === 0) { engine.log('no events'); return; } const replacer = (key, value) => value instanceof java.sql.Timestamp ? datetimeFormatter.format(value) : value; events.forEach(event => { engine.log(JSON.stringify(event, replacer)); }); }; /** * イベント取得の GET リクエストを送信する * @param {QuserView} quser 実行ユーザ * @param {String} calendarId カレンダーID * @param {Number} limit 結果件数の上限 * @param {timestamp} timestampLowerLimit イベント開始日時の下限 * @return {Array} events イベント一覧 * @return {string} events[].id イベント ID + 開始日時 * @return {string} events[].eventId イベント ID * @return {timestamp} events[].timestamp 開始日時 * @return {timestamp} events[].endTimestamp 終了日時 * @return {string} events[].summary タイトル * @return {string} events[].description 詳細説明 * @return {string} events[].htmlLink WebLink */ const getEvents = (quser, calendarId, limit, timestampLowerLimit) => { const eventsUrl = `https://www.googleapis.com/calendar/v3/calendars/${calendarId}/events`; engine.log(`API URI: ${eventsUrl}`); const response = httpClient .begin() .googleOAuth2(quser, "Calendar") .queryParam('maxResults', `${limit}`) .queryParam('orderBy', 'startTime') .queryParam('singleEvents', 'true') .queryParam('timeMin', datetimeFormatter.format(timestampLowerLimit)) .queryParam('timeMax', datetimeFormatter.format(new java.sql.Timestamp(Date.now()))) .queryParam('timeZone', engine.getTimeZoneId()) .get(eventsUrl); //when error thrown const responseTxt = response.getResponseAsString(); const status = response.getStatusCode(); if (status >= 300) { engine.log(`---GET request--- ${status}`); engine.log(responseTxt); throw `Failed to get events. status: ${status}`; } const json = JSON.parse(responseTxt); // レコードオブジェクトを整形して返す const formatItem = (item) => { const eventId = String(item.id); const timestamp = parseStartEndDatetime(item.start); // eventId と timestamp の組み合わせを id に。予定の開始日時変更に対応するため。 const id = `${eventId}_${timestamp.getTime()}`; return { id, eventId, timestamp, endTimestamp: parseStartEndDatetime(item.end), summary: item.summary, description: item.description, htmlLink: item.htmlLink }; }; return json.items.map(formatItem).reverse(); }; /** * start or end のパース * @param start * @returns {timestamp} 日時 */ const parseStartEndDatetime = (start) => { if (start.dateTime !== undefined) { return parseDatetime(datetimeFormatter, start.dateTime); } // 「終日予定」の処理。「終日予定」はタイムゾーンの概念がない。 // 終日予定の日付は、QBPMS タイムゾーンにおいて、「その日の 00:00:00」と解釈する。 return parseDatetime(allDayFormatter, `${start.date} 00:00:00`); };
