
開始: Google カレンダー: 予定開始時 (Start: Google Calendar: Event Started)
このアイテムは、Google カレンダーに登録されている、予定の開始時刻を経過すると、プロセスを開始します。
Configs: 共通設定
- 工程名
- メモ
Configs
- C1: Google カレンダー に接続するユーザ(要アプリ管理権限) *
- C2: Calendar ID (空白の場合、プライマリのカレンダー)
- C3: 予定 ID を保存するデータ項目 *
- C4: 予定開始時刻を保存するデータ項目
- C5: 予定終了時刻を保存するデータ項目
- C6: 予定タイトルを保存するデータ項目
- C7: 説明を保存するデータ項目
- 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)
- コードの参考用にご利用ください
- アドオンとしてワークフローアプリにインポートすることはできません
- google-calendar-event-started.xml (C) Questetra, Inc. (MIT License)
/**
* @typedef {Object} timestamp java.sql.Timestamp オブジェクト
*/
/**
* 開始時刻を経過したイベントの検索
* @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;
}
/** 日時フォーマッター */
const datetimeFormatter = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
/**
* @param {string} str 日時文字列
* @return {timestamp} java.sql.Timestamp オブジェクト
*/
const parseDatetime = str => new java.sql.Timestamp(datetimeFormatter.parse(str).getTime());
/**
* イベントのログ出力
* @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();
};
/** 終日予定用フォーマッター */
const allDayFormatter = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* start or end のパース
* @param start
* @returns {timestamp} 日時
*/
const parseStartEndDatetime = (start) => {
if (start.dateTime !== undefined) {
return parseDatetime(start.dateTime);
}
// 「終日予定」の処理。「終日予定」はタイムゾーンの概念がない。
// 終日予定の日付は、QBPMS タイムゾーンにおいて、「その日の 00:00:00」と解釈する。
const time = allDayFormatter.parse(`${start.date} 00:00:00`).getTime();
return new java.sql.Timestamp(time);
};