此代码
var cal = CalendarApp.getCalendarById("Calendar Id");
var startTime = new Date(1850, 0, 1);
var endTime = new Date(2100, 0, 1);
var events = cal.getEvents(startTime, endTime);
Logger.log(events);
var sp = PropertiesService.getScriptProperties();
sp.setProperty("events", JSON.stringify(events));
events = JSON.parse(sp.getProperty("events"));
Logger.log(events);
返回:
Info [CalendarEvent, CalendarEvent, CalendarEvent, CalendarEvent, CalendarEvent]
Info [{}, {}, {}, {}, {}]
为什么?怎么了?
为什么?
CalendarEvent
是事件的实例的Google Apps脚本类。
检查财产所有权和可枚举性将产生以下结果:
function stringified() {
const event = CalendarApp.createAllDayEvent('Party', new Date());
const eventToString = JSON.stringify(event);
Logger.log(eventToString); // -> {}
Logger.log(Object.keys(event)); // -> []
Logger.log(Object.getOwnPropertyNames(event)); // -> [toString,...]
Logger.log(Object.getPrototypeOf(event)); // -> {}
Logger.log(event.toString()); // -> CalendarEvent
}
这告诉我们什么?
Object.keys()
)。getOwnPropertyNames()
)。 CalendarEvent
继承自Object
1(请参阅toString()
)。现在,看看JSON.stringify()
对对象的作用(这是MDN的描述,但是如果您深入研究ECMAScript规范,您会发现SerializeJSONObject
operation取决于抽象EnumerableOwnPropertyName
):
所有其他Object实例(包括Map,Set,WeakMap和WeakSet)将仅将其可枚举属性序列化
哪个引导我们回答您的第二个问题:
怎么了?
由于没有可枚举的自身属性,序列化结果为"{}"
。
该怎么办?
用PropertiesService
存储事件没有多大意义-即使您想出一种存储方式,您也会很快陷入大型事件集合的配额问题。什么是存储reference,那么如何使用getId()
方法存储和getEventById()
检索呢?
样本
//...get event somehow
const store = PropertiesService.getUserProperties();
store.deleteProperty('events'); // demo only
const eventIds = store.getProperty('events') || '[]';
const id = event.getId();
const idList = JSON.parse(eventIds);
idList.push(id);
store.setProperty('events',JSON.stringify(idList));
Logger.log(store.getProperty('events'));
Notes
CalendarEvent
的实例由于原型继承而具有对象作为其原型。参考
JSON.stringify()
docsgetId()
docsgetEventById()
docs