我目前的問題是我正在使用谷歌日歷 API。當我嘗試修補事件時,API 會更新所有未來的事件,而不僅僅是選定的事件。
我的專案是這樣的,用戶在日歷上選擇日期,然后將請求發送到后端以檢索當天的所有事件。然后用戶可以單擊該事件進行確認,并向服務器發送另一個請求。在請求期間,日歷 API 應該只更新點擊事件的事件。
從我所做的研究來看,我認為我必須使用回圈然后EXDATE
但我試圖破譯谷歌日歷檔案并且沒有得到任何地方......
這是我到目前為止嘗試過的代碼。
adjustEventForTeacher = async(userCalendarLocation, slotId) => {
let getEventStartTime = await calendar.events.get({
calendarId: 's',
eventId: slotId
})
const getEventEndTime = getEventStartTime.data.end.dateTime
getEventStartTime = getEventStartTime.data.start.dateTime
console.log(getEventStartTime)
const res = await calendar.events.patch({
calendarId: 's',
eventId: slotId,
requestBody: {
summary: 'Busy',
name: 'Busy',
status: 'confirmed',
colorId: '0',
// start: {
// dateTime: getEventStartTime
// },
// end: {
// dateTime: getEventEndTime
// }
// recurrence: [ `EXDATE;VALUE=DATE:${getEventStartTime}` ],
}
})
console.log(res.data)
}
謝謝你。
uj5u.com熱心網友回復:
檔案中不太清楚,但我通過分析事件在 UI 中更改后在 API 中的外觀,弄清楚了如何更改重復事件的單個實體。
正如您已經注意到的,使用update
或patch
更改重復事件的所有實體。這是有道理的,因為重復事件仍然只有一個 ID,并且它們的重復由它們的recurrence[]
規則定義。這樣,當日歷設定為每天無限制地發生時,日歷就不必創建可能無限數量的新事件。
訣竅是,您必須使用該events.insert
方法創建一個新事件,同時還要指定它是對現有重復事件的修改。這是通過在請求正文中添加recurringEventId
和欄位來完成的。應該是您要更改的重復事件的 ID,并且originalStartTime
應該具有您要更改的特定實體的和。recurringEventId
originalStartTime
startTime
timeZone
完整說明:這是 API 中重復事件的示例,您可以通過在 UI 中創建一個并使用events.list
它來檢索它來找到它。實際輸出更長,但我刪減了一些不相關的欄位:
{
"kind": "calendar#event",
"id": "<original-recurrent-event>",
"status": "confirmed",
"created": "2022-10-28T02:58:32.000Z",
"updated": "2022-10-28T02:58:32.287Z",
"summary": "Recurrent event",
"start": {
"dateTime": "2022-10-27T21:30:00-06:00",
"timeZone": "your-timezone"
},
"end": {
"dateTime": "2022-10-27T22:30:00-06:00",
"timeZone": "your-timezone"
},
"recurrence": [
"RRULE:FREQ=DAILY"
],
"eventType": "default"
}
上面顯示了一個每日重復發生的事件。它與其他事件的唯一區別是它有一個recurrence
規則。<original-recurrent-event>
我用占位符替換了實際 ID 。
當我在 UI 中僅更改一天的此事件時,添加了一個新事件,如下所示:
{
"kind": "calendar#event",
"id": "<original-recurrent-event>_20221029T033000Z",
"status": "confirmed",
"created": "2022-10-28T02:58:32.000Z",
"updated": "2022-10-28T02:59:30.474Z",
"summary": "Modified event",
"start": {
"dateTime": "2022-10-28T21:00:00-06:00",
"timeZone": "your-timezone"
},
"end": {
"dateTime": "2022-10-28T22:00:00-06:00",
"timeZone": "your-timezone"
},
"recurringEventId": "<original-recurrent-event>",
"originalStartTime": {
"dateTime": "2022-10-28T21:30:00-06:00",
"timeZone": "your-timezone"
},
},
"eventType": "default"
}
這看起來很像一個常規的新活動,但有一些不同:
- 它
id
不是像往常一樣隨機生成。相反,它包含原始事件 ID,并添加帶有原始開始時間的時間戳(以 UTC 表示)。 recurringEventId
它有originalStartTime
我之前提到的欄位。
話雖如此,實際上您只需要插入一個新事件,其中包含對您來說看起來像這樣的欄位:
const res = await calendar.events.insert({ // use insert method
calendarId: 's',
requestBody: {
summary: 'Busy',
name: 'Busy',
start: {
dateTime: getEventStartTime
},
end: {
dateTime: getEventEndTime
},
recurringEventId:slotId,
originalStartTime:{
startTime:getOriginalStartTime,
timeZone:getTimezone
}
}
})
我自己沒有 Node 環境來運行它,但我希望它能讓你知道如何去做。當我在檔案頁面的 APIs Explorer 中嘗試它時,它按描述作業。奇怪的是,檔案沒有解釋這些欄位,所以我提交了一些反饋,希望他們能在未來澄清這一點。
資料來源:
- 事件.插入
- 事件串列
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/522315.html