首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Google脚本日历服务:以块方式处理许多事件:如何以编程方式触发下一个函数运行以继续下一个块?

Google脚本日历服务:以块方式处理许多事件:如何以编程方式触发下一个函数运行以继续下一个块?
EN

Stack Overflow用户
提问于 2020-05-19 15:48:45
回答 1查看 298关注 0票数 0

我指的是这个问题

代码语言:javascript
复制
function renameEvents() {
  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);
  var sp = PropertiesService.getScriptProperties();
  if (!(sp.getProperty("count")) || sp.getProperty("count") == 0) {
    var count = 0;
  else if ((sp.getProperty("count") > 0) {
    var count = sp.getProperty("count");
  }

  for (var i = count; i < events.length; i++) {
    events[i].setTitle(events[i].getTitle() + " something");
    events[i].setDescription(events[i].getDescription() + " something else");
    sp.setProperty("count", i)
  }
}

最初的函数运行是时间触发的.如何以编程方式触发下一个函数运行以继续下一个块?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-20 05:41:23

我相信你的目标如下。

  • 您希望降低以下脚本的进程成本。此脚本来自您问题中的URL。 var cal =CalendarApp.getCalendarById(“日历Id");var startTime =新日期(1850,0,1);var endTime =新日期(2100,0,1);var events = cal.getEvents(startTime,endTime);for (var i= 0;i< events.length;i++) { eventsi.setTitle(eventsi.getTitle() +”某事“);
  • 您希望修改Google日历中所有事件的事件标题和事件描述。

问题和解决办法:

  • 在当前脚本中,所有事件的标题和事件描述都试图在for循环中修改。在当前脚本中,循环将运行,直到出现错误。当发生错误时,使用时间驱动触发器从count启动循环.我是这样理解的。
  • 在上面的脚本中,当事件数量很大时,最大执行时间就结束了。因为我认为setTitlesetDescription的成本很高。
  • 在当前脚本中,除了setTitlesetDescription之外,setProperty还在for循环中使用。在这种情况下,过程成本将更高。

在我的回答中,作为一种解决办法,我建议在您的情况下使用批处理请求。Calendar API可以由批处理请求运行。批处理请求与异步进程一起运行,可以通过一个API调用运行100个请求。这样可以降低生产成本。因此,我认为当批处理请求用于您的情况时,您的所有任务都可以通过一个正在运行的脚本来完成。

用法:

1.安装Google脚本库。

为了使用此示例脚本,请安装BatchRequest的Google脚本库。您可以在https://github.com/tanaikech/BatchRequest#how-to-install上看到安装库的方法。

2.运行样例脚本。

请复制并粘贴以下脚本。和请在高级谷歌服务上启用谷歌日历API。请将日历ID设置为calendarId

代码语言:javascript
复制
function myFunction() {
  const calendarId = "###";

  var cal = CalendarApp.getCalendarById(calendarId);
  var startTime = new Date(1850, 0, 1);
  var endTime = new Date(2100, 0, 1);
  var events = cal.getEvents(startTime, endTime);

  // Create requests for the batch request.
  const reqs = events.map(e => ({
    method: "PUT",
    endpoint: `https://www.googleapis.com/calendar/v3/calendars/${calendarId}/events/${e.getId().replace("@google.com", "")}`,
    requestBody: {
      start: {dateTime: e.getStartTime().toISOString()},
      end: {dateTime: e.getEndTime().toISOString()},
      summary: e.getTitle() + " something",
      description: e.getDescription() + " something else"
    }
  }));

  // Run batch requests.
  const limit = 100;
  const split = Math.ceil(reqs.length / limit);
  for (let i = 0; i < split; i++) {
    BatchRequest.Do({batchPath: "batch/calendar/v3", requests: reqs.splice(0, limit)});
  }
}
  • 当您运行myFunction函数时,所有事件的标题和描述都会被事件的方法修改: Calendar API中的update。

注意:

  • 此脚本修改所有事件的标题和描述。所以请小心点。因此,首先,作为测试运行,我想测试少量的事件。
  • 在我的环境中,当我对上面的脚本进行100个事件的测试时,处理时间大约是7秒。我不确定你总事件的数量。
  • 在这个答案中,我建议使用Events: update方法,而不是Events:修补程序的方法。因为当使用Events:修补程序时,我确认只修改了所请求的所有事件的一部分。我觉得这可能是个窃听器。所以我使用了"Events: update“的方法。在这种情况下,我可以确认所有事件都被修改了。
  • 请与V8一起使用此脚本。

参考文献:

添加:

在此示例脚本中,不使用GAS库。

示例脚本:

代码语言:javascript
复制
function myFunction() {
  const calendarId = "###";

  var cal = CalendarApp.getCalendarById(calendarId);
  var startTime = new Date(1850, 0, 1);
  var endTime = new Date(2100, 0, 1);
  var events = cal.getEvents(startTime, endTime);

  // Create requests for the batch request.
  const reqs = events.map(e => ({
    method: "PUT",
    endpoint: `https://www.googleapis.com/calendar/v3/calendars/${calendarId}/events/${e.getId().replace("@google.com", "")}`,
    requestBody: {
      start: {dateTime: e.getStartTime().toISOString()},
      end: {dateTime: e.getEndTime().toISOString()},
      summary: e.getTitle() + " something",
      description: e.getDescription() + " something else"
    }
  }));

  // Run batch requests.
  const limit = 100;
  const split = Math.ceil(reqs.length / limit);
  const boundary = "xxxxxxxxxx";
  for (let i = 0; i < split; i++) {
    const object = {batchPath: "batch/calendar/v3", requests: reqs.splice(0, limit)};
    const payload = object.requests.reduce((s, e, i) => s += "Content-Type: application/http\r\nContent-ID: " + i + "\r\n\r\n" + e.method + " " + e.endpoint + "\r\nContent-Type: application/json; charset=utf-8\r\n\r\n" + JSON.stringify(e.requestBody) + "\r\n--" + boundary + "\r\n", "--" + boundary + "\r\n");
    const params = {method: "post", contentType: "multipart/mixed; boundary=" + boundary, payload: payload, headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}, muteHttpExceptions: true};
    UrlFetchApp.fetch("https://www.googleapis.com/" + object.batchPath, params);
  }
}

添加:

  • 您希望在不使用Calendar API的情况下实现上述目标。

为了这个,这个修改怎么样?

修改要点:

  • 在您的脚本中,下面的部分有语法错误。 if (!( sp.getProperty(" count ") ) { var sp.getProperty(“count”) == 0) { var count= 0;否则if ((sp.getProperty("count") > 0) {var count= sp.getProperty("count");}
代码语言:javascript
复制
- Please modify `else if ((sp.getProperty("count") > 0) {` to `} else if (sp.getProperty("count") > 0) {`.

  • getProperty检索的值是字符串类型。来自nothing happes in 你的回答,我认为这可能是您出现问题的原因。

那么下面的修改如何?

修改脚本:

发自:

代码语言:javascript
复制
if (!(sp.getProperty("count")) || sp.getProperty("count") == 0) {
  var count = 0;
else if ((sp.getProperty("count") > 0) {
  var count = sp.getProperty("count");
}

至:

代码语言:javascript
复制
var count = Number(sp.getProperty("count")) || 0;

参考资料:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61895200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档