開始: Google カレンダー: 予定開始時

開始: Google カレンダー: 予定開始時

Start: Google Calendar: Event Started

このアイテムは、Google カレンダーに登録されている、予定の開始時刻を経過すると、ケースを開始します。

Auto Step icon
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`);
    };
    
上部へスクロール

Questetra Supportをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む