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

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

我指的是this question

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)
  }
}

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

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

我相信您的目标如下。

  • 您想减少以下脚本的处理成本。该脚本来自您所提问的the URL

    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);
    for (var i = 0; i < events.length; i++) {
      events[i].setTitle(events[i].getTitle() + " something");
      events[i].setDescription(events[i].getDescription() + " something else");
    }
    
  • 您要修改Google日历中所有事件的事件标题和事件描述。

为此,这个答案如何?

问题和解决方法:

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

我的回答是一种解决方法,我建议针对您的情况使用the batch request。 Calendar API可以通过批处理请求运行。批处理请求通过异步过程运行,并且可以通过一个API调用运行100个请求。由此,可以降低处理成本。因此,我认为当将批处理请求用于您的情况时,您的所有任务可能可以通过一个正在运行的脚本来完成。

用法:

1。安装Google Apps脚本库。

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

2。运行示例脚本。

请复制并粘贴以下脚本。和please enable Google Calendar API at Advanced Google services。并将您的日历ID设置为calendarId

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中的事件方法:更新的方法进行修改。

注意:

  • 此脚本修改所有事件的标题和描述。所以请注意这一点。因此,首先,作为测试运行,我想测试少量事件。
  • 在我的环境中,当我针对100个事件测试以上脚本时,处理时间约为7秒。我不确定您的活动总数。因此,如果这不是直接的解决方案,我必须道歉。
  • 在此答案中,我建议使用事件:更新的方法,而不是事件:补丁的方法。因为使用Events:patch时,我确认仅对请求的所有事件的一部分进行了修改。我认为这可能是一个错误。因此,我使用了“事件:更新”的方法。在这种情况下,我可以确认所有事件均已修改。
  • 请将此脚本与V8一起使用。

参考:

© www.soinside.com 2019 - 2024. All rights reserved.