簡體   English   中英

Google Apps Script Calendar Service:如何避免超過最大執行時間?

[英]Google Apps Script Calendar Service: How to avoid exceeding maximum execution time?

我需要通過 Google Apps Script 編輯幾百甚至幾千個日歷事件。 這只是對標題( event.setTitle() )和描述( event.setDescription() )的微小更改,沒什么特別的。 嘗試處理大約 600 個事件,已超過 360 秒的最大執行時間。

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

如何連續處理多個塊中的事件?

回答:

使用PropertiesService保存您到達的位置,以便您可以在下次運行時繼續離開的位置。

代碼:

您可以使用PropertiesService鍵值對通過events[]保存計數的值:

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

它會使腳本變慢一點,但是每次運行它時,它都會從上次停止的日歷事件中繼續運行。

我希望這對你有幫助!

參考:

我以前使用過類似於以下內容的內容:

在每個循環開始時,檢查是否有足夠的緩沖時間來完成循環。

每當單個循環時間超過緩沖時間時更新緩沖時間。

使用PropertiesService存儲緩沖區和最后一個索引。

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 ps = PropertiesService.getScriptProperties();
var startIndex = ps.getProperty('lastIndex') || 0;
var buffer = ps.getProperty('buffer') || 100;

var startTime = new Date();
var maxTime = 1000*60*6; //6 mins


for (var i = startIndex; i < events.length; i++) {
  var loopStart = new Date()
  if (loopStart - startTime > (maxTime-buffer) ) {
     ps.setProperty('lastIndex', i);
     break;
  }
  events[i].setTitle(events[i].getTitle() + " something");
  events[i].setDescription(events[i].getDescription() + " something else");
  var loopTime = new Date() - loopStart;
  if (loopTime  > buffer ) buffer = loopTime * 1.5
}

ps.setProperty('buffer',buffer) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM