Google apps script 从谷歌电子表格中创建谷歌日历事件的谷歌脚本-“;超过最大执行时间“;

Google apps script 从谷歌电子表格中创建谷歌日历事件的谷歌脚本-“;超过最大执行时间“;,google-apps-script,google-calendar-api,execution-time,Google Apps Script,Google Calendar Api,Execution Time,使用这个很棒的答案,我成功地修改了它,创建了一个脚本,将事件从谷歌电子表格导出到谷歌日历 然后,我得到了一些很好的建议,并发现它没有填充eventID列,这是因为我遇到了一个错误——“超过了最大执行时间”——因为行数太多(多达1000行) 我一直在寻找答案,试图找到一个解决这个问题的方法,但似乎无法找到答案!抱歉,我对这一切都很陌生 有没有人能给我指出正确的方向,告诉我如何强制脚本在5分钟后处理,或者做其他事情 function onOpen() { var sheet = Spread

使用这个很棒的答案,我成功地修改了它,创建了一个脚本,将事件从谷歌电子表格导出到谷歌日历

然后,我得到了一些很好的建议,并发现它没有填充eventID列,这是因为我遇到了一个错误——“超过了最大执行时间”——因为行数太多(多达1000行)

我一直在寻找答案,试图找到一个解决这个问题的方法,但似乎无法找到答案!抱歉,我对这一切都很陌生

有没有人能给我指出正确的方向,告诉我如何强制脚本在5分钟后处理,或者做其他事情

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Export Events",
    functionName : "exportEvents"
  }];
  sheet.addMenu("Calendar Actions", entries);
};

/**
 * Export events from spreadsheet to calendar
 */
function exportEvents() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var headerRows = 2;  // Number of rows of header info (to skip)
  var range = sheet.getDataRange();
  var data = range.getValues();
  var calId = "pma5g2rd5cft4lird345j7pke8@group.calendar.google.com";// use default claendar for tests
  var cal = CalendarApp.getCalendarById(calId);
  for (i in data) {
    if (i < headerRows) continue; // Skip header row(s)
    var row = data[i];
    var date = new Date(row[12]);  // WHC
    var title = row[18];           // WHC Title
    var tstart = setTimeToDate(date,row[15]);// start time
    var tstop = setTimeToDate(date,row[16]);// end time
    Logger.log('date = '+date+'tstart = '+tstart+'  tstop = '+tstop);
    var id = row[17]; //EventID WHC
    // Check if event already exists, update it if it does
    try {
      var event = cal.getEventSeriesById(id);
      event.setTitle('got you');// this is to "force error" if the event does not exist, il will never show for real ;-)
    }catch(e){
      var newEvent = cal.createEvent(title, tstart, tstop); // create a "normal" event
      row[17] = newEvent.getId();  // Update the data array with event ID
      Logger.log('event created');// while debugging
      var event = cal.getEventSeriesById(row[17]);// make it an event Serie
    }
    event.setTitle(title);
  }
  // Record all event IDs to spreadsheet
  range.setValues(data);
}

function setTimeToDate(date,time){
  var t = new Date(time);
  var hour = t.getHours();
  var min = t.getMinutes();
  var sec = t.getSeconds();
  var dateMod = new Date(date.setHours(hour,min,sec,0))
  return dateMod;
}
函数onOpen(){ var sheet=SpreadsheetApp.getActiveSpreadsheet(); 变量项=[{ 名称:“导出事件”, 函数名:“exportEvents” }]; sheet.addMenu(“日历操作”,条目); }; /** *将事件从电子表格导出到日历 */ 函数exportEvents(){ var sheet=SpreadsheetApp.getActiveSheet(); var headerRows=2;//标题信息的行数(要跳过) var range=sheet.getDataRange(); var data=range.getValues(); var calId=”pma5g2rd5cft4lird345j7pke8@group.calendar.google.com“;//对测试使用默认claendar var cal=CalendarApp.getCalendarById(calId); 对于(数据中的i){ 如果(i这样做的目的是计算脚本在主函数中占用的时间,并在达到极限时中断脚本

我们必须将行号存储在中断脚本的位置,然后在下一次运行时从那里继续

由于我们不想手动执行此操作(我们有多懒:-),我们将设置一个触发器,每5分钟运行一次

下面是一个完整的脚本。 它会在每次跑步时给你发送一封电子邮件,告诉你进度。。。当然,你必须在考试后删除这一行(除非你喜欢每5分钟收到一次自己的电子邮件!)

您必须更改日历ID和行分布(我在一张比您的列少的工作表上测试了它),但这将相当容易

function createEventsWithBatch() {
  // check if the script runs for the first time or not,
  // if so, create the trigger and PropertiesService.getScriptProperties() the script will use
  // a start index and a total counter for processed items
  // else continue the task
  if(PropertiesService.getScriptProperties().getKeys().length==0){ 
    PropertiesService.getScriptProperties().setProperties({'itemsprocessed':0});
    ScriptApp.newTrigger('createEventsWithBatch').timeBased().everyMinutes(5).create();
  }
  // initialize all variables when we start a new task, "notFinished" is the main loop condition
  var itemsProcessed = Number(PropertiesService.getScriptProperties().getProperty('itemsprocessed'));
  var startTime = new Date().getTime();
  var sheet = SpreadsheetApp.getActiveSheet();
  var headerRows = 1;  // Number of rows of header info (to skip)
  var range = sheet.getDataRange();
  var data = range.getValues();
  var calId = "h22nevo15tm0nojb6ul4hu7ft8@group.calendar.google.com";
  var cal = CalendarApp.getCalendarById(calId);
  for (var i = itemsProcessed ; i < data.length ; i++){
    if (i < headerRows) continue; // Skip header row(s)
    var row = data[i];
    var date = new Date(row[0]);  // First column
    var title = row[1];           // Second column
    var tstart = setTimeToDate(date,row[2]);
    var tstop = setTimeToDate(date,row[3]);
//    Logger.log('date = '+date+'tstart = '+tstart+'  tstop = '+tstop);
    var loc = row[4];
    var desc = row[5];
    var type = row[6];
    var times = row[7]
    var id = row[8]; 
    // Check if event already exists, update it if it does
    try {
      var event = cal.getEventSeriesById(id);
      event.setTitle('got you');
    }catch(e){
      var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc});
      row[8] = newEvent.getId();  // Update the data array with event ID
//      Logger.log('event created');
      var event = cal.getEventSeriesById(row[8]);
    }
    event.setTitle(title);
    event.setDescription(desc);
    event.setLocation(loc);
    if(type=='PM'){
      var recurrence = CalendarApp.newRecurrence().addMonthlyRule().times(times);
      event.setRecurrence(recurrence, tstart, tstop);
    }else if(type=='PW'){
      var recurrence = CalendarApp.newRecurrence().addWeeklyRule().times(times)
      event.setRecurrence(recurrence, tstart, tstop);
    }
    data[i] = row ; 
    Logger.log(i+'    '+new Date().getTime()-startTime)
    if(new Date().getTime()-startTime > 240000){ // if > 4 minutes
      var processed = i+1;// save usefull variable
      PropertiesService.getScriptProperties().setProperties({'itemsprocessed':processed});
      range.setValues(data);
      MailApp.sendEmail(Session.getEffectiveUser().getEmail(),'progress sheet to cal','item processed : '+processed);
      return;
    }
  }  
  range.setValues(data);// this time we are done !
  killTrigger();// delete the trigger
  PropertiesService.getScriptProperties().deleteAllProperties(); // clean up properties
}

function setTimeToDate(date,time){
  var t = new Date(time);
  var hour = t.getHours();
  var min = t.getMinutes();
  var sec = t.getSeconds();
  var dateMod = new Date(date.setHours(hour,min,sec,0))
  return dateMod;
}

function killTrigger(){
  var trigger = ScriptApp.getProjectTriggers()[0];
  ScriptApp.deleteTrigger(trigger);
}
函数createEventsWithBatch(){
//检查脚本是否第一次运行,
//如果是,请创建脚本将使用的触发器和PropertiesService.getScriptProperties()
//已处理项目的开始索引和总计计数器
//否则继续任务
如果(PropertiesService.getScriptProperties().getKeys().length==0){
PropertiesService.getScriptProperties().setProperties({'itemsprocessed':0});
ScriptApp.newTrigger('createEventsWithBatch').timeBased().everyMinutes(5.create();
}
//初始化所有变量当我们开始一个新任务时,“notFinished”是主循环条件
var itemsProcessed=Number(PropertiesService.getScriptProperties().getProperty('itemsProcessed');
var startTime=new Date().getTime();
var sheet=SpreadsheetApp.getActiveSheet();
var headerRows=1;//标题信息的行数(要跳过)
var range=sheet.getDataRange();
var data=range.getValues();
var calId=”h22nevo15tm0nojb6ul4hu7ft8@group.calendar.google.com";
var cal=CalendarApp.getCalendarById(calId);
for(var i=itemsProcessed;i240000){//if>4分钟
变量过程