Google Apps脚本日历服务:使用PropertiesService存储和检索事件

问题描述 投票:0回答:1

此代码

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 [{}, {}, {}, {}, {}]

为什么?怎么了?

javascript google-apps-script google-calendar-api
1个回答
0
投票

为什么?

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
}

这告诉我们什么?

  1. 没有枚举道具我们可以使用(见Object.keys())。
  2. own个道具(请参阅getOwnPropertyNames())。
  3. 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

  1. 因此,CalendarEvent的实例由于原型继承而具有对象作为其原型。

参考

  1. MDN上的可枚举explanation
  2. MDN上的[JSON.stringify() docs
  3. 日历事件getId() docs
  4. [getEventById() docs
© www.soinside.com 2019 - 2024. All rights reserved.