【问题标题】:Creating events from Google Sheets to Google Calendar - still having an issue with duplicates从 Google 表格创建事件到 Google 日历 - 仍然存在重复问题
【发布时间】:2014-11-23 12:46:25
【问题描述】:

几周以来,我一直在尝试自己解决这个问题,但我不知所措!在修改从另一个答案中获取的这个脚本时,我得到了一些很大的帮助,但它仍在创建重复项。

有没有人有任何可以帮助我的想法?我错过了什么明显的东西吗?

当前脚本:

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the exportEvents() function.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Export WHCs",
    functionName : "exportWHCs"
  },
                {
    name : "Export Docs",
    functionName : "exportDocs"
  }];
  sheet.addMenu("Calendar Actions", entries);
};

/**
 * Export events from spreadsheet to calendar
 */
function exportWHCs() {
  // 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('exportWHCs').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 = 4;  // Number of rows of header info (to skip)
  var range = sheet.getDataRange();
  var data = range.getValues();
  var calId = "pma5g2rd5cft4lird345j7pke8@group.calendar.google.com";
  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]);  // First column
    var title = row[18];           // Second column
    var tstart = new Date(row[15]);
    tstart.setDate(date.getDate());
    tstart.setMonth(date.getMonth());
    tstart.setYear(date.getYear());
    var tstop = new Date(row[16]);
    tstop.setDate(date.getDate());
    tstop.setMonth(date.getMonth());
    tstop.setYear(date.getYear());
    var id = row[17];              // Sixth column == eventId


    // Check if event already exists, delete it if it does
try {
  var event = cal.getEventSeriesById(id);
  event.deleteEventSeries();
  row[17] = '';  // Remove event ID    
    }
catch (e) {
  // do nothing - we just want to avoid the exception when event doesn't exist
}
//cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"));
      var newEvent = cal.createEvent(title, tstart, tstop).addEmailReminder(5).getId();
row[17] = newEvent;  // Update the data array with event ID


    if(new Date().getTime()-startTime > 240000){ // if > 4 minutes
      var processed = i+1;// save usefull variable
      PropertiesService.getScriptProperties().setProperties({'itemsprocessed':processed});
      range.setValues(data);
      return;
    }    
    debugger;
  }
  // Record all event IDs to spreadsheet
  range.setValues(data);
}




/**
 * Export events from spreadsheet to calendar
 */
function exportDocs() {
  // 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('exportDocs').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 = 4;  // Number of rows of header info (to skip)
  var range = sheet.getDataRange();
  var data = range.getValues();
  var calId = "pma5g2rd5cft4lird345j7pke8@group.calendar.google.com";
  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[13]);  // First column
    var title = row[19];           // Second column
    var tstart = new Date(row[15]);
    tstart.setDate(date.getDate());
    tstart.setMonth(date.getMonth());
    tstart.setYear(date.getYear());
    var tstop = new Date(row[16]);
    tstop.setDate(date.getDate());
    tstop.setMonth(date.getMonth());
    tstop.setYear(date.getYear());
    var id = row[20];              // Sixth column == eventId

    // Check if event already exists, delete it if it does
try {
  var event = cal.getEventSeriesById(id);
  event.deleteEventSeries();
  row[20] = '';  // Remove event ID    
}
catch (e) {
  // do nothing - we just want to avoid the exception when event doesn't exist
}
//cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"));
      var newEvent = cal.createEvent(title, tstart, tstop).addEmailReminder(5).getId();
row[20] = newEvent;  // Update the data array with event ID


    if(new Date().getTime()-startTime > 240000){ // if > 4 minutes
      var processed = i+1;// save usefull variable
      PropertiesService.getScriptProperties().setProperties({'itemsprocessed':processed});
      range.setValues(data);
      return;
    }    
    debugger;
  }
  // Record all event IDs to spreadsheet
  range.setValues(data);
   }

【问题讨论】:

    标签: google-apps-script duplicates google-sheets google-calendar-api


    【解决方案1】:

    我确实试图重现您的问题。我能够创建一个新事件而无需复制该事件。我确实尝试过以下代码。

    function onOpen() {
      var sheet = SpreadsheetApp.getActiveSpreadsheet();
      var entries = [{
        name : "Export WHCs",
        functionName : "exportWHCs"
      }];
      sheet.addMenu("Calendar Actions", entries);
    };
    
    /**
     * Export events from spreadsheet to calendar
     */
    function exportWHCs() {
    
      if(PropertiesService.getScriptProperties().getKeys().length==0){ 
        PropertiesService.getScriptProperties().setProperties({'itemsprocessed':0});
        ScriptApp.newTrigger('exportWHCs').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 = 4;  // Number of rows of header info (to skip)
      var range = sheet.getDataRange();
      var data = range.getValues();
      var calId = "rkarumuri@google.com";
      Logger.log(calId);
      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]);  
        var title = row[18];           
        var tstart = new Date(row[15]);
        tstart.setDate(date.getDate());
        tstart.setMonth(date.getMonth());
        tstart.setYear(date.getYear());
        var tstop = new Date(row[16]);
        tstop.setDate(date.getDate());
        tstop.setMonth(date.getMonth());
        tstop.setYear(date.getYear());
        var id = row[17];              // Sixth column == eventId
    
    
        // Check if event already exists, delete it if it does
    try {
      var event = cal.getEventSeriesById(id);
      event.deleteEventSeries();
      row[17] = '';  // Remove event ID    
        }
    catch (e) {
      // do nothing - we just want to avoid the exception when event doesn't exist
    }
            var newEvent = cal.createEvent(title, tstart, tstop).addEmailReminder(5).getId();
    row[17] = newEvent;  // Update the data array with event ID
    
    
        if(new Date().getTime()-startTime > 240000){ // if > 4 minutes
          var processed = i+1;// save usefull variable
          PropertiesService.getScriptProperties().setProperties({'itemsprocessed':processed});
          range.setValues(data);
          return;
        }    
       }
      // Record all event IDs to spreadsheet
      range.setValues(data);
    }
    

    还要检查documentation 中提到的关于从默认日历访问事件的要点。

    我没有明白删除现有事件并为相同值添加新事件的意义。

    希望有帮助!

    【讨论】:

    • 感谢您的回答!我的日历不是该帐户的默认日历...可能是这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多