Google apps script 日历';s";事件更新";触发器isn';行不通
当使用下面的代码更改我的Google日历事件时,我试图触发一个函数Google apps script 日历';s";事件更新";触发器isn';行不通,google-apps-script,triggers,google-calendar-api,Google Apps Script,Triggers,Google Calendar Api,当使用下面的代码更改我的Google日历事件时,我试图触发一个函数calendarScan() ScriptApp.newTrigger('calendarScan') .forUserCalendar(Session.getActiveUser().getEmail()) .onEventUpdated() .create(); 我不明白为什么扳机坏了。脚本是独立的。calendarScan()函数手动运行正常 衷心感谢你的帮助 要为用户拥有的所有日历创建日历,可以使用: 考虑到
calendarScan()
ScriptApp.newTrigger('calendarScan')
.forUserCalendar(Session.getActiveUser().getEmail())
.onEventUpdated()
.create();
我不明白为什么扳机坏了。脚本是独立的。calendarScan()
函数手动运行正常
衷心感谢你的帮助 要为用户拥有的所有日历创建日历,可以使用:
考虑到您的情况,这不应该有太多额外的开销。要为用户拥有的所有日历创建一个日历,可以使用:
考虑到您的安全性,这应该不会有太多额外的开销。Session.getActiveUser().getEmail()显示什么?我无法复制。当我为函数创建日历触发器时,当我在日历中添加/编辑/删除事件时,该函数将运行。“脚本是独立的”和“函数链接到的工作表”与创建给定触发器的函数不在同一脚本项目中是什么意思?“函数和触发器位于不同的项目中”不能为与创建触发器的函数不在同一脚本项目中的函数创建触发器。要为函数
calendarScan
创建日历事件触发器,function calendarScan(){…}
必须与使用ScriptApp.createTrigger(“calendarScan”)
的代码位于同一个项目中。这不是问题所在,我发现了问题。仅当对主日历进行更改时,触发器才能运行。您知道如果对辅助日历进行了更改,如何扩展触发器以允许使用触发器吗?我想您需要为相应的日历ID而不是与用户电子邮件关联的主日历创建触发器。Session.getActiveUser().getEmail()
显示了什么?我无法复制。当我为函数创建日历触发器时,当我在日历中添加/编辑/删除事件时,该函数将运行。“脚本是独立的”和“函数链接到的工作表”与创建给定触发器的函数不在同一脚本项目中是什么意思?“函数和触发器位于不同的项目中”不能为与创建触发器的函数不在同一脚本项目中的函数创建触发器。要为函数calendarScan
创建日历事件触发器,function calendarScan(){…}
必须与使用ScriptApp.createTrigger(“calendarScan”)
的代码位于同一个项目中。这不是问题所在,我发现了问题。仅当对主日历进行更改时,触发器才能运行。您知道如果对辅助日历进行了更改,如何扩展触发器以允许使用触发器吗?我想您需要为相应的日历ID而不是与用户电子邮件关联的主日历创建触发器。谢谢您。我只在谷歌应用程序脚本中使用过日历服务,所以我只知道GAS日历服务的类。你知道我在哪里可以找到包含“minAccessLevel”和“pageToken”的引用和文档吗?@Brandon I链接了该方法的API引用文档,CalendarList::list
。它解释了这些(可选)输入参数的含义。您还可以随时查看API参考中的相关“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这些名称通常不会晦涩难懂,或者-minAccessLevel
->最低访问级别(请求用户)->所有者->“仅显示请求用户是其所有者的日历。”我将让您直观地了解pageToken
和nextPageToken
所做的事情,因为上面给出了我的代码。它应该是ScriptApp.newTrigger(functionName)
谢谢@tehhowch,这真的很有用!谷歌文档有点简陋:这样的触发器“持久”吗,还是每次触发时都需要重置它们?@jean触发后,这些触发器应继续触发。您可以使用我示例中的代码验证这一点:授权它,运行makeTriggers
方法,然后更新所属日历中的事件几次。您应该在stackdriver中查看触发事件的日志。注意t您成为所有者的任何新日历都不会自动注册触发器,因此您应该在运行函数操作之前删除现有触发器,以避免重复触发器。谢谢tehhowch。我只在Google应用程序脚本中使用过日历服务,所以我只知道GAS Calendar服务的类。您知道吗在哪里可以找到包含“minAccessLevel”和“pageToken”的引用和文档?@Brandon我链接了该方法的API引用文档,CalendarList::list
。它解释了这些(可选)输入参数的含义。您也可以随时查看相关的“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuAPI参考中的页面-通常您会发现任何资源属性的描述。这些名称通常不会模糊,或者-minAccessLevel
->(请求用户的)->所有者->仅显示请求用户所拥有的日历考虑到我上面的代码,我会让你凭直觉知道pageToken
和nextPageToken
做什么。它应该是ScriptApp.newTrigger(functionName)
谢谢@tehhowch,这真的很有用!谷歌文档有点简略:这样的触发器“持久”吗,还是每次触发时都需要重置它们?@jean触发后,这些触发器应继续激发。您可以使用我的示例中的代码验证这一点:授权它,运行makeTriggers
方法,然后更新所属日历中的事件几次。您应该在stac中查看触发事件的日志
function getOwnedCalendars_() {
const options = {
minAccessLevel: "owner", // freeBusyReader, reader, writer
fields: "nextPageToken, items(id,summary,description)"
};
const cals = [];
do {
var search = Calendar.CalendarList.list(options);
options.pageToken = search.nextPageToken;
if (search.items && search.items.length)
Array.prototype.push.apply(cals, search.items);
} while (options.pageToken);
return cals;
}
function giveMeTheTrigger(e) {
console.log(e);
}
function makeTriggers() {
getOwnedCalendars_().forEach(function (cal) {
var t = ScriptApp.newTrigger("giveMeTheTrigger")
.forUserCalendar(cal.id)
.onEventUpdated()
.create();
console.log({message: "Created event trigger for calendar '" + cal.summary + "'",
desc: cal.description, id: cal.id, triggerId: t.getUniqueId()});
});
}