gpt4 book ai didi

javascript - 日历服务: Store and retrieve events using PropertiesService

转载 作者:行者123 更新时间:2023-11-30 23:56:28 26 4
gpt4 key购买 nike

这段代码

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 脚本类,事件是其实例。

检查属性(property)所有权和可枚举性会产生以下结果:

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. 自己的 Prop (请参阅getOwnPropertyNames())。
  3. CalendarEvent 继承自 Object1(请参阅 toString())。

现在,看看 JSON.stringify() 对对象做了什么(这是来自 MDN 的描述,但如果您深入研究 ECMAScript 规范,您会看到 SerializeJSONObject code> operation 取决于抽象 EnumerableOwnPropertyName):

所有其他对象实例(包括 Map、Set、WeakMap 和 WeakSet)将仅序列化其可枚举属性

这引出了您的第二个问题:

出了什么问题?

由于没有可枚举的自有属性,序列化结果为 "{}"

做什么?

使用 PropertiesService 存储事件没有多大意义 - 即使您找到了存储方法,您也会很快遇到较大事件集合的配额问题。作用是存储引用,那么使用 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'));

还能做什么?

使用日历 API(不要忘记先转至 资源 -> Cloud Platform 项目 -> API 并为您的 GCP 项目启用它服务 -> )。此 API 是一个 REST API,您可以使用旧式 HTTP 请求进行查询,如下所示:

function listEvents() {

const calendar = CalendarApp.getCalendarById('yourEmailHere');

const endpoint = `https://www.googleapis.com/calendar/v3/calendars/${calendar.getId()}/events`;

const query = {};

const preparedQuery = Object
.entries(query)
.map(param =>`${param[0]}=${param[1]}`)
.join('&');

const resp = UrlFetchApp.fetch(`${endpoint}?${preparedQuery}`,{
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
}
});

if(resp.getResponseCode() === 200) {
//process the response
}

}

请注意,必须设置要通过 JWT token (通过 getOAuthToken() 获取)传递的 OAuth 范围。如果应用程序 list 中有明确的范围列表(appscript.jsonoauthScopes 字段),请添加 "https://www.googleapis.com/auth/calendar.events.readonly" 或更合适的一个。

注释

  1. 我的意思是,由于原型(prototype)继承,CalendarEvent 的实例有一个对象作为其原型(prototype)。
  2. 除非需要脚本范围的设置(请参阅引用资料中的官方指南),否则使用 getUserProperties() 优于 getScriptProperties()。脚本属性在用户之间共享,并计入脚本所有者的配额。
  3. 要使用第二个示例,V8 运行时必须为 enabled (从问题样本来看,尚不清楚是否使用了它)。

引用

  1. 可枚举性 explanation在 MDN 上
  2. JSON.stringify() docs在 MDN 上
  3. 日历事件 getId() docs
  4. getEventById() docs
  5. 日历 API reference
  6. OAuth scopes对于 Google API
  7. PropertiesService guide

关于javascript - 日历服务: Store and retrieve events using PropertiesService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61017989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com